You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用boto3向AWS EKS部署资源?能否通过AWS Lambda触发?

可行方案:通过AWS Lambda执行Python脚本部署AWS EKS资源

完全可以实现通过AWS Lambda触发Python脚本向EKS集群部署资源的需求,以下是具体实现步骤:

1. 配置Lambda执行角色权限

Lambda需要具备访问EKS集群及相关资源的权限,给Lambda的IAM角色附加以下核心权限策略:

  • eks:DescribeCluster:用于获取EKS集群的端点、证书等信息以生成kubeconfig
  • sts: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 15:55:22