跨账号部署CloudFormation栈失败:Lambda的CodeUri格式问题修复咨询
跨账号CloudFormation部署Lambda报错的解决方法
问题根源
报错核心原因是:CodeUri: ./lambda并非有效的S3 URI格式。跨账号部署场景下,目标账号的CloudFormation无法直接访问部署环境的本地文件,必须将Lambda代码打包上传至S3,再通过S3路径引用代码包。
修改步骤
1. 调整CloudFormation模板(cloudformation.yml)
将本地路径的CodeUri改为S3路径,并新增参数传入存储代码包的S3桶名(避免硬编码,提升灵活性):
AWSTemplateFormatVersion: "2010-09-09" Transform: "AWS::Serverless-2016-10-31" Description: A starter AWS Lambda function. Parameters: LambdaCodeBucket: Type: String Description: S3桶名称,需确保目标账号可读取该桶内文件 Resources: helloworldpython3: Type: "AWS::Serverless::Function" Properties: Handler: lambda_function.lambda_handler Runtime: python3.6 CodeUri: !Sub s3://${LambdaCodeBucket}/lambda-code-package.zip Description: 'Lambda function for CD Demo' MemorySize: 128 Timeout: 30
2. 修改Buildspec.yml(buildspec.yml)
新增Lambda代码打包、上传至S3的步骤,部署CloudFormation时传入S3桶参数:
version: 0.2 phases: install: commands: - echo $CROSS_ACCOUNT_ROLE - echo $TARGET_ACCOUNT_ID - cd $CODEBUILD_SRC_DIR - chmod +x cross-account-setup.sh build: commands: - echo "打包Lambda代码" - cd $CODEBUILD_SRC_DIR/lambda - zip -r ../lambda-code-package.zip . # 将lambda目录下所有文件打包到根目录 - echo "上传代码包至S3" - export LAMBDA_CODE_BUCKET="你的跨账号S3桶名" # 替换为实际桶名 - aws s3 cp ../lambda-code-package.zip s3://${LAMBDA_CODE_BUCKET}/ - echo "开始部署CloudFormation栈" - cd $CODEBUILD_SRC_DIR - . ./cross-account-setup.sh - > aws cloudformation deploy --stack-name amr-manual-deployment-cicd --template-file cloudformation.yml --parameter-overrides LambdaCodeBucket=${LAMBDA_CODE_BUCKET} --no-fail-on-empty-changeset - echo "部署完成"
3. 补充权限配置
- 部署账号需拥有目标S3桶的写入权限,可上传代码包。
- 目标账号需拥有该S3桶的读取权限,可添加桶策略实现:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::目标账号ID:root" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::你的跨账号S3桶名/*" } ] }
关键注意事项
- 打包Lambda代码时,需确保zip包根目录直接包含
lambda_function.py等文件,而非嵌套在lambda子目录中(与Handler路径匹配)。 - 跨账号场景下禁止使用本地路径作为
CodeUri,目标账号CloudFormation无权限访问部署机器的本地文件系统。
内容的提问来源于stack exchange,提问作者Bilal Yousaf
相关产品推荐
相关产品推荐

