如何在Python编写的AWS Lambda中执行存放在S3的.sh shell脚本
解决方案
你原有写法失败的原因
- S3路径格式错误,标准S3路径前缀为
s3://,不是S3:/ subprocess.call传入列表参数时默认不会启动shell环境,管道符|是shell的专属语法,脱离shell环境无法生效- 直接在列表里塞带管道的整串命令,会被识别为单一可执行文件名称,系统找不到对应文件自然执行失败
方案1:直接通过管道执行S3脚本(适合轻量短脚本)
开启shell=True参数即可调用shell环境解析管道语法,正确写法如下:
import subprocess # 替换为实际的S3脚本路径 cmd = "aws s3 cp s3://你的桶名/脚本路径/file.sh - | bash" return_code = subprocess.call(cmd, shell=True)
⚠️ 前提:Lambda的执行IAM角色必须配置对应S3路径的s3:GetObject权限。
方案2:先下载到临时目录再执行(更稳定,推荐)
Lambda自带/tmp临时存储目录(最大512MB),先把脚本下载到本地再执行,避免管道传输异常,也完全不需要处理脚本内的单引号转义问题,脚本所有原有逻辑都不受影响:
import subprocess import os # 下载脚本到临时目录 subprocess.call("aws s3 cp s3://你的桶名/脚本路径/file.sh /tmp/run.sh", shell=True) # 授予执行权限 os.chmod("/tmp/run.sh", 0o755) # 执行脚本 return_code = subprocess.call("/tmp/run.sh", shell=True)
额外注意事项
- Lambda函数的最大执行超时为15分钟,你的shell脚本总执行时长不能超过该阈值,否则会被系统强制中断
- 脚本中所有AWS CLI操作需要的权限,都要提前添加到Lambda的执行IAM角色中,禁止在脚本内硬编码访问密钥
- 如果需要捕获脚本的输出用于排查问题,可以用
subprocess.run替代subprocess.call:
import subprocess cmd = "aws s3 cp s3://你的桶名/脚本路径/file.sh - | bash" result = subprocess.run( cmd, shell=True, capture_output=True, text=True ) # 打印标准输出 print("脚本输出:", result.stdout) # 打印错误输出 print("错误信息:", result.stderr) # 打印执行返回码,0为成功,非0为失败 print("返回码:", result.returncode)
内容的提问来源于stack exchange,提问作者RunThor
相关产品推荐
相关产品推荐

