Terraform新手调用lambda-deploy访问S3包时触发local-exec错误,求解决
解决Terraform local-exec调用lambda-deploy脚本的exit status 1错误
问题背景
使用Terraform的null_resource搭配local-exec provisioner调用自定义Python脚本lambda-deploy,尝试部署AWS S3存储桶中的Lambda软件包时,触发exit status 1错误,具体报错及代码如下:
错误信息
Error: local-exec provisioner error │ with module.serverless_projects["api/contentful.zip"].null_resource.serverless_deployment, │ on serverless_project/deployment.tf line 6, in resource "null_resource" "serverless_deployment": │ 6: provisioner "local-exec" { │ Error running command 'lambda-deploy api/contentful.zip': exit status 1.
关联Terraform代码
resource "null_resource" "serverless_deployment" { triggers = { source_version = data.aws_s3_object.package_object.version_id } provisioner "local-exec" { command = "lambda-deploy ${var.package_name}" } }
排查与解决步骤
1. 先直接测试脚本本身
Terraform只返回脚本的退出状态码,不会显示脚本内部的错误详情,所以先在本地终端手动执行命令:
lambda-deploy api/contentful.zip
或者如果是Python脚本,直接用Python运行:
python lambda-deploy api/contentful.zip
查看具体报错信息,这是定位问题的核心步骤。
2. 验证脚本权限与路径
- 若脚本是可执行文件,检查是否有执行权限:
chmod +x lambda-deploy - 若脚本不在系统PATH中,在Terraform的
command里指定完整路径,比如:command = "./lambda-deploy ${var.package_name}"
3. 确认AWS权限与凭证
- 确保Terraform运行时使用的AWS账号拥有以下权限:
- S3:
s3:GetObject、s3:ListBucket(访问目标存储桶及对象) - Lambda:
lambda:CreateFunction、lambda:UpdateFunctionCode(部署Lambda)
- S3:
- 检查本地AWS凭证(
~/.aws/credentials或环境变量)是否有效,且与Terraform使用的配置一致。
4. 验证S3对象的有效性
- 确认
data.aws_s3_object.package_object正确获取到了目标对象,可添加输出验证:
执行output "s3_package_details" { value = data.aws_s3_object.package_object }terraform apply后查看输出,确认对象的version_id和路径正确,且对象确实存在于S3桶中。
5. 增强local-exec的日志输出
修改local-exec命令,将脚本的错误输出重定向到标准输出,以便在Terraform日志中看到详情:
provisioner "local-exec" { command = "lambda-deploy ${var.package_name} 2>&1" }
6. 检查脚本逻辑
- 确认脚本是否需要完整的S3 URI(比如
s3://your-bucket/api/contentful.zip)而非相对路径,若需完整路径,需修改var.package_name的取值。 - 查看脚本内部的错误处理逻辑,确保遇到异常时会输出明确的错误信息,而非仅返回非0退出码。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

