如何通过AWS Lambda自动化执行AWS CloudShell中的Bash脚本?
自动化执行EKS相关Bash脚本的替代方案
CloudShell是交互式的浏览器/CLI环境,没有公开的API允许外部服务(比如Lambda)直接启动会话并执行脚本,所以你之前的Lambda调用CloudShell的思路不可行。以下是几个更合适的自动化方案:
方案1:用AWS Lambda直接执行脚本逻辑
Lambda可以直接配置权限访问EKS集群,无需依赖CloudShell,是最轻量化的serverless方案:
- 配置IAM权限:给Lambda执行角色添加以下权限(根据脚本需求调整):
eks:DescribeCluster:用于获取EKS集群的kubeconfig- 对应K8s资源的操作权限(可通过IAM Roles for Service Accounts绑定K8s ClusterRole,或直接给Lambda角色附加K8s权限)
- 如果脚本需要读取S3中的文件,添加
s3:GetObject权限
- 打包依赖(可选):如果脚本用到
kubectl或eksctl,可以把这些工具打包成Lambda层,或者使用支持这些工具的自定义运行时。Lambda的Bash运行时(基于Amazon Linux 2)默认包含aws-cli,可以直接用aws eks update-kubeconfig配置集群访问 - 编写Lambda代码:把原CloudShell脚本的逻辑迁移到Lambda中,比如用Bash运行时的示例代码:
#!/bin/bash set -euo pipefail # 配置kubectl访问目标EKS集群 aws eks update-kubeconfig --region ${AWS_REGION} --name your-eks-cluster-name # 执行原脚本中的EKS操作,例如列出命名空间下的Pod kubectl get pods -n your-namespace # 其他自定义逻辑...
- 触发方式:可以通过CloudWatch Events(定时触发)、API Gateway(手动/外部触发)、S3事件等方式触发Lambda执行
方案2:用AWS Systems Manager (SSM) 自动化执行
SSM的Automation或Run Command功能可以帮你在受控环境中执行脚本:
- Automation文档:创建一个SSM自动化文档,定义下载脚本、配置kubectl、执行脚本的步骤(脚本可存储在S3中)
- 示例自动化文档片段:
schemaVersion: '0.3' assumeRole: '{{ AutomationAssumeRole }}' parameters: ScriptS3Uri: type: String description: S3 URI of your bash script EksClusterName: type: String description: Name of target EKS cluster mainSteps: - name: DownloadScript action: aws:s3GetObject inputs: Bucket: '{{ split(ScriptS3Uri, "/")[2] }}' Key: '{{ join(slice(split(ScriptS3Uri, "/"), 3), "/") }}' DestinationPath: /tmp/eks-script.sh - name: PrepareScript action: aws:executeShellScript inputs: RunCommand: - chmod +x /tmp/eks-script.sh - aws eks update-kubeconfig --region {{ AWS::Region }} --name {{ EksClusterName }} - name: RunEksScript action: aws:executeShellScript inputs: RunCommand: - /tmp/eks-script.sh
- 触发执行:可以通过CloudWatch Events定时触发,或在SSM控制台手动执行,执行结果会自动记录在SSM中便于排查
方案3:用ECS Fargate任务一次性执行脚本
如果脚本依赖较多环境配置,可以用Fargate启动临时容器执行脚本,执行完成后自动销毁:
- 创建任务定义:使用包含
kubectl和aws-cli的镜像(比如Amazon Linux 2自定义镜像),配置任务执行角色拥有EKS访问权限 - 定义任务命令:在任务定义中指定启动命令为执行你的脚本(脚本可打包进镜像或从S3下载)
- 触发任务:通过CloudWatch Events、Lambda或CLI启动Fargate任务,无需长期运行服务器,成本可控
方案4:用EC2实例定时执行(适合复杂场景)
如果脚本需要持久化环境或依赖特殊工具,可以创建一个EC2实例:
- 给EC2实例分配具有EKS访问权限的IAM角色
- 把脚本放到实例中,用
cron定时执行 - 可选:用SSM Session Manager管理实例,无需开放公网端口
内容的提问来源于stack exchange,提问作者Faisal Shani
相关产品推荐
相关产品推荐

