在 AWS CloudFormation 中创建 IAM 角色时,我面临竞争条件,该角色具有允许其自行承担的信任策略 (
sts:AssumeRole
)。出现此问题的原因是角色需要在 AssumeRolePolicyDocument 中引用其自己的 ARN,但 CloudFormation 尝试在角色完全创建之前解决此问题,从而导致循环依赖和竞争条件。
问题: 在我的 CloudFormation 模板中,我使用信任策略定义 IAM 角色,该策略允许该角色自行承担:
MyNewRole:
Type: AWS::IAM::Role
Properties:
RoleName: my-new-role
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
AWS: arn:aws:iam::<account-id>:role/my-new-role
Action: sts:AssumeRole
但是,我遇到了以下错误:
Invalid principal in policy: "AWS":"arn:aws:iam::<account-id>:role/my-new-role" (Service: Iam, Status Code: 400)
此错误表明该角色在实际存在之前已在信任策略中被引用,从而导致竞争条件。
问题:
如何在 CloudFormation 中处理这种竞争条件(其中 IAM 角色需要自行承担)?有没有办法在角色创建后延迟或更新信任策略,或者有更好的方法来解决这个问题吗?
我尝试过的:
Fn::Sub
在同一模板内动态引用角色的 ARN,但这仍然会导致竞争条件。任何有关解决此竞争条件的指导将不胜感激!
此解决方案允许您使用条件过滤可以承担角色的人员,而不是显式指定“主体”。
注意:这可能会触发安全警告,因为它看起来允许“*”
MyNewRole:
Type: AWS::IAM::Role
Properties:
RoleName: my-new-role
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
AWS: '*'
Action: sts:AssumeRole
Condition:
StringLike:
aws:PrincipalArn: !Sub arn:aws:iam::${AWS::AccountId}:role/my-new-role