如何在CloudFormation中引用AWS自动生成的IAM角色关联自定义IAM策略
错误原因
- CloudFormation 内置函数不支持通配符
*做模糊匹配,你写的*会直接作为字面量加入角色名,而IAM角色名不允许使用*字符,直接触发校验报错。 !Select函数缺少必填的索引参数,你只传了拆分后的列表,没有指定要取列表的第几个元素,函数返回非法结构直接作为角色名提交,不符合IAM命名规则。- 手动拼接带通配符的ARN可靠性极低,AWS自动生成的资源名后缀会随部署参数变化,这种写法本身也无法正确匹配到目标角色。
正确解决方案
你用的AWS::SecretsManager::RotationSchedule资源如果配置了HostedRotationLambda属性,该资源的返回值直接提供了自动创建的轮转Lambda角色的ARN,你直接调用!GetAtt获取ARN后拆分出角色名即可,无需手动拼接:
rRotationLambdaDecryptPolicy: Type: AWS::IAM::ManagedPolicy DependsOn: rSecretRotationScheduleHostedRotationLambda Properties: Description: "Providing access to HostedLambda for decrypting KMS" ManagedPolicyName: CustomedHostedLambdaKmsUserRolePolicy PolicyDocument: Version: '2012-10-17' Statement: - Sid: AllowLambdaDecryptKMS Effect: Allow Action: - kms:Decrypt - kms:CreateGrant Resource: - !Sub arn:aws:kms:*:${AWS::AccountId}:key/* Condition: ForAnyValue:StringLike: kms:ResourceAliases: alias/SecretsManager_KMSKey Roles: # 按/拆分角色ARN,索引1对应的就是角色名 - !Select [1, !Split ["/", !GetAtt rSecretRotationScheduleHostedRotationLambda.HostedRotationLambdaRoleArn]]
如果该自动生成的IAM角色是你当前模板内直接定义的资源,更简单的方式是直接用!Ref引用角色的逻辑ID即可:
Roles: - !Ref <你的IAM角色资源的逻辑ID>
内容的提问来源于stack exchange,提问作者Zack_Coder
相关产品推荐
相关产品推荐

