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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:06:01