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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:36:05