AWS跨账号IAM角色创建失败排查及正确配置咨询
问题分析与解决方案
原代码的核心问题
- 信任策略不支持跨账号:当前角色的
assumed_by仅指定了lambda.amazonaws.com服务主体,这意味着只有账号A自身的Lambda函数能扮演该角色,完全未授权账号B的Lambda进行跨账号扮演,这是部署失败的核心原因。 - 权限语句包含无效动作:
dynamodb:GetRecords并非DynamoDB的API动作(该动作属于Kinesis Data Streams),会导致策略语句无效,进一步触发部署错误。
正确的跨账号IAM角色实现方式
要在账号A创建可被账号B Lambda扮演的角色,需修改信任策略限制仅账号B的Lambda能扮演,同时修正权限语句中的无效动作。
修正后的CDK代码示例
# 替换为账号B的实际AWS账号ID ACCOUNT_B_ID = "123456789012" # 创建DynamoDB表(保留原有配置逻辑) self._ddb_table = ddb.Table( self, id, # 原有表配置参数... ) # 创建支持跨账号扮演的IAM角色 ddb_lambda_role = iam.Role( self, "ddb_lambda_role", assumed_by=iam.ServicePrincipal("lambda.amazonaws.com"), role_name="ddb_lambda_role", # 添加条件,仅允许账号B的Lambda服务扮演该角色 conditions={ "StringEquals": { "aws:PrincipalAccount": ACCOUNT_B_ID } } ) # 修正后的DynamoDB权限策略 ddb_policy_stmt = iam.PolicyStatement( effect=iam.Effect.ALLOW, actions=[ 'dynamodb:Query', 'dynamodb:GetItem', 'dynamodb:PutItem', 'dynamodb:UpdateItem', 'dynamodb:BatchGetItem', ], resources=[self._ddb_table.table_arn] ) ddb_lambda_role.add_to_policy(ddb_policy_stmt)
补充说明
- 部署账号A的栈时,仅需提前知晓账号B的ID,无需等待账号B的Lambda栈部署完成。
- 后续在账号B部署Lambda时,需确保Lambda的执行角色拥有
sts:AssumeRole权限,允许其扮演账号A中创建的ddb_lambda_role。
内容的提问来源于stack exchange,提问作者user20358
相关产品推荐
相关产品推荐

