如何使用boto3向AWS EKS部署资源?能否通过AWS Lambda触发?
可行方案:通过AWS Lambda执行Python脚本部署AWS EKS资源
完全可以实现通过AWS Lambda触发Python脚本向EKS集群部署资源的需求,以下是具体实现步骤:
1. 配置Lambda执行角色权限
Lambda需要具备访问EKS集群及相关资源的权限,给Lambda的IAM角色附加以下核心权限策略:
eks:DescribeCluster:用于获取EKS集群的端点、证书等信息以生成kubeconfigsts:AssumeRole:如果EKS集群配置了IAM角色授权(而非传统kubeconfig认证),需要允许Lambda扮演对应角色访问集群- 额外权限:若部署的资源涉及ECR(拉取镜像)、ELB(创建负载均衡)等服务,需添加对应服务的权限(如
ecr:GetDownloadUrlForLayer、elasticloadbalancing:CreateLoadBalancer等)
2. 构建Python部署脚本
使用Python的boto3库获取EKS集群信息,结合kubernetes客户端库完成资源部署,核心逻辑如下:
示例代码片段
import boto3 from kubernetes import client, config def lambda_handler(event, context): # 初始化EKS客户端 eks_client = boto3.client('eks') cluster_name = "your-eks-cluster-name" # 获取集群信息 cluster_info = eks_client.describe_cluster(name=cluster_name) endpoint = cluster_info['cluster']['endpoint'] cert_authority = cluster_info['cluster']['certificateAuthority']['data'] # 构造kubeconfig kubeconfig = { "apiVersion": "v1", "clusters": [ { "cluster": { "server": endpoint, "certificate-authority-data": cert_authority }, "name": cluster_name } ], "contexts": [ { "context": { "cluster": cluster_name, "user": f"lambda-{cluster_name}" }, "name": cluster_name } ], "current-context": cluster_name, "kind": "Config", "users": [ { "name": f"lambda-{cluster_name}", "user": { "exec": { "apiVersion": "client.authentication.k8s.io/v1beta1", "command": "aws-iam-authenticator", "args": ["token", "-i", cluster_name] } } } ] } # 加载kubeconfig并初始化K8s客户端 config.load_kube_config_from_dict(kubeconfig) k8s_client = client.AppsV1Api() # 定义Deployment资源 deployment = client.V1Deployment( api_version="apps/v1", kind="Deployment", metadata=client.V1ObjectMeta(name="test-deployment"), spec=client.V1DeploymentSpec( replicas=2, selector=client.V1LabelSelector(match_labels={"app": "test"}), template=client.V1PodTemplateSpec( metadata=client.V1ObjectMeta(labels={"app": "test"}), spec=client.V1PodSpec( containers=[ client.V1Container( name="test-container", image="nginx:latest", ports=[client.V1ContainerPort(container_port=80)] ) ] ) ) ) ) # 部署到指定命名空间 try: k8s_client.create_namespaced_deployment(namespace="default", body=deployment) return {"status": "success", "message": "Deployment created"} except Exception as e: return {"status": "failed", "message": str(e)}
3. 处理Lambda依赖
Lambda默认环境没有kubernetes库,需通过以下方式解决:
- Lambda层:在本地虚拟环境安装
kubernetes和boto3(若需要特定版本),打包成zip后创建Lambda层,附加到目标Lambda函数 - 打包部署包:将脚本文件与依赖库文件一起打包成zip,直接上传到Lambda
4. 配置Lambda网络(可选)
若EKS集群为私有端点,需将Lambda配置到集群所在VPC的私有子网,并确保子网有访问EKS端点的权限(通过VPC端点或NAT网关);若为公开端点,Lambda需具备互联网访问能力。
5. 设置Lambda触发方式
根据需求选择触发源:
- CloudWatch Events:定时自动部署
- API Gateway:通过HTTP请求触发部署
- S3/SNS:当有特定文件上传或消息推送时触发部署
内容的提问来源于stack exchange,提问作者arhe10
相关产品推荐
相关产品推荐

