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
相关产品推荐
相关产品推荐

