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

Lambda跨AWS账户操作报错Failed to assume role,求排查协助

跨账户Lambda角色假设失败(Failed to assume role)排查方案

1. 验证源Lambda执行角色的权限

Lambda执行角色必须拥有sts:AssumeRole权限,且资源需精准指定目标账户的角色ARN。示例策略如下:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::TARGET_ACCOUNT_ID:role/TARGET_ROLE_NAME"
    }
  ]
}

若资源范围过窄或未配置此权限,会直接阻断角色假设请求。

2. 确认目标账户角色的信任策略有效性

目标角色的信任策略必须明确允许源账户的Lambda执行角色发起假设请求,示例配置:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::SOURCE_ACCOUNT_ID:role/LAMBDA_EXECUTION_ROLE_NAME"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

注意:不要混淆账户ID、角色名称,若使用Lambda服务主体lambda.amazonaws.com,需确保源执行角色已被授权。

3. 排查SCP(服务控制策略)限制

SCP是跨账户访问失败的常见原因,需同时检查两个账户的策略:

  • 源账户SCP:是否存在Deny语句限制sts:AssumeRole操作,或未包含目标角色ARN作为允许资源?
  • 目标账户SCP:是否禁止外部账户主体调用sts:AssumeRole?
    重点关注带有Deny效果的规则,尤其是涉及跨账户资源或STS操作的内容。

4. 验证Lambda代码的角色假设逻辑

代码中调用sts.assumeRole()时需确保参数正确:

  • RoleArn必须是目标账户的完整角色ARN,无拼写错误
  • RoleSessionName需符合规则(长度2-64,无特殊字符)
  • 需正确使用返回的临时凭证初始化目标服务客户端

Python示例代码片段:

import boto3

def lambda_handler(event, context):
    sts_client = boto3.client('sts')
    try:
        response = sts_client.assume_role(
            RoleArn='arn:aws:iam::TARGET_ACCOUNT_ID:role/TARGET_ROLE_NAME',
            RoleSessionName='CrossAccountSession'
        )
        # 用临时凭证创建目标服务客户端
        ec2_client = boto3.client(
            'ec2',
            aws_access_key_id=response['Credentials']['AccessKeyId'],
            aws_secret_access_key=response['Credentials']['SecretAccessKey'],
            aws_session_token=response['Credentials']['SessionToken']
        )
        # 执行变更操作
        ec2_client.stop_instances(InstanceIds=['i-1234567890'])
    except Exception as e:
        print(f"Assume role failed: {str(e)}")
        raise e

5. 检查IAM角色的权限边界(Permissions Boundary)

若源Lambda执行角色或目标角色配置了权限边界,需确认:

  • 源角色边界允许sts:AssumeRole操作
  • 目标角色边界允许你需要执行的变更操作(如ec2:StopInstances)
    权限边界会限制角色的最大权限,即使直接策略允许,边界禁止的操作仍会失败。

6. 排除AWS组织层面限制

若账户属于AWS组织,需检查:

  • 是否启用了IAM角色外部访问限制
  • 目标账户是否在组织允许的外部访问列表中,或源账户是否被禁止跨账户角色假设

7. 直接测试角色假设(排除Lambda环境问题)

在源账户使用AWS CLI直接测试角色假设,验证IAM/SCP层面是否正常:

aws sts assume-role --role-arn arn:aws:iam::TARGET_ACCOUNT_ID:role/TARGET_ROLE_NAME --role-session-name TestSession

若CLI调用失败,问题出在IAM/SCP配置;若CLI成功,再排查Lambda执行角色是否与测试角色一致,或Lambda是否因VPC配置无法访问STS端点。

内容的提问来源于stack exchange,提问作者AK988125

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:25:17