如何在CodeBuild中Assume角色跨账号更新另一AWS账户的Lambda函数
跨账号更新Lambda权限报错解决方案
根因说明
当前CodeBuild运行时直接使用账号A的roleA凭证调用账号B的Lambda接口,既没有切换到账号B的授权身份roleB,也没有配置Lambda的资源策略允许roleA直接操作,因此触发权限拒绝报错。另外更新Lambda时需要从账号A的S3桶拉取代码包,还需要对应S3访问权限配置。
方案1:使用预设跨账号角色roleB(推荐,符合最小权限)
步骤1:优化账号B中roleB的信任策略(可选但建议,收紧权限)
将原信任策略中的Principal从账号A根账号修改为具体的roleA ARN,避免过度授权:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNTID_A:role/roleA" }, "Action": "sts:AssumeRole" } ] }
步骤2:配置S3访问权限
二选一即可:
- 方式1:给账号B的roleB追加S3读权限,允许读取账号A存储代码包的S3对象:
{ "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::s3_zip_accountA/Lambda/package.zip" }
- 方式2:在账号A的S3桶资源策略中添加规则,允许roleB读取代码包:
{ "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNTID_B:role/roleB" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::s3_zip_accountA/Lambda/package.zip" }
步骤3:修改Buildspec文件,先切换到roleB身份再执行更新
修改后的build阶段命令如下,注意替换占位符为实际值,若基础镜像无jq工具请先添加安装命令:
version: 0.2 phases: build: commands: - aws --version # 若镜像无jq,Debian/Ubuntu镜像取消注释下一行 # - apt update && apt install -y jq # Amazon Linux 2镜像取消注释下一行 # - yum install -y jq # Assume账号B的roleB获取临时凭证 - CREDS=$(aws sts assume-role --role-arn arn:aws:iam::ACCOUNTID_B:role/roleB --role-session-name codebuild-lambda-deploy) # 配置临时凭证到环境变量 - export AWS_ACCESS_KEY_ID=$(echo $CREDS | jq -r '.Credentials.AccessKeyId') - export AWS_SECRET_ACCESS_KEY=$(echo $CREDS | jq -r '.Credentials.SecretAccessKey') - export AWS_SESSION_TOKEN=$(echo $CREDS | jq -r '.Credentials.SessionToken') # 执行Lambda更新 - aws lambda update-function-code --function-name arn:aws:lambda:us-west-1:ACCOUNTID_B:function:lambdafunctionnamehere --s3-bucket s3_zip_accountA --s3-key Lambda/package.zip
方案2:无需使用roleB,直接配置Lambda资源策略
步骤1:给账号B的目标Lambda添加资源策略,允许roleA直接执行更新操作
在账号B的权限环境下执行以下CLI命令:
aws lambda add-permission \ --function-name lambdafunctionnamehere \ --statement-id AllowRoleAUpdateLambdaCode \ --action lambda:UpdateFunctionCode \ --principal arn:aws:iam::ACCOUNTID_A:role/roleA
步骤2:配置S3访问权限
在账号A的S3桶资源策略中添加规则,允许账号B的Lambda服务拉取代码包:
{ "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::s3_zip_accountA/Lambda/package.zip", "Condition": { "StringEquals": { "aws:SourceAccount": "ACCOUNTID_B" } } }
步骤3:无需修改原有Buildspec,直接执行即可生效
内容的提问来源于stack exchange,提问作者SUBHAS PATIL
相关产品推荐
相关产品推荐

