如何在AWS CloudFormation中复用IAM策略至多个角色?
在AWS CloudFormation中复用IAM策略的两种方案
针对你提出的「两个IAM角色共享同一策略、避免重复编写」的需求,有两种可行方案,具体如下:
1. 使用AWS::IAM::ManagedPolicy(推荐的复用方式)
这是最符合你「先定义策略再按需引用」需求的方案。托管策略是独立的IAM资源,可预先定义,然后被任意数量的角色、用户或组引用。
实现示例
Resources: # 先定义可复用的托管策略 DatabaseAccessManagedPolicy: Type: AWS::IAM::ManagedPolicy Properties: PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - rds:DescribeDBInstances - rds:ListTagsForResource # 此处添加所有需要的数据库操作权限 Resource: "*" # 第一个角色,引用托管策略 FirstDatabaseRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: sts:AssumeRole # 通过ManagedPolicyArns引用已定义的托管策略 ManagedPolicyArns: - !Ref DatabaseAccessManagedPolicy # 第二个角色,同样引用该托管策略 SecondDatabaseRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: ec2.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - !Ref DatabaseAccessManagedPolicy
这种方式的优势是策略可跨CloudFormation栈复用,且后续修改策略时只需更新托管策略,所有引用它的身份都会自动生效。
2. 利用CloudFormation模板内部复用(无需托管策略)
如果仅在当前CloudFormation栈内复用策略,可通过YAML的**锚点(&)和别名(*)**特性,复用内联策略内容。
YAML锚点示例
Resources: # 定义可复用的策略文档锚点 DatabaseAccessPolicyDoc: &DatabaseAccessPolicy Version: "2012-10-17" Statement: - Effect: Allow Action: - rds:DescribeDBInstances - rds:ListTagsForResource Resource: "*" FirstDatabaseRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: sts:AssumeRole Policies: - PolicyName: DatabaseAccess # 引用锚点的策略文档 PolicyDocument: *DatabaseAccessPolicy SecondDatabaseRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: ec2.amazonaws.com Action: sts:AssumeRole Policies: - PolicyName: DatabaseAccess PolicyDocument: *DatabaseAccessPolicy
这种方式仅适用于当前栈内,无法跨栈复用,但无需创建额外的托管策略资源。
关于AWS::IAM::Policy的局限性
你提到的AWS::IAM::Policy资源确实无法实现「先定义策略再关联角色」的需求,因为它的核心作用是给已存在的IAM身份(用户/组/角色)附加策略,必须依赖Users、Groups或Roles属性指定关联对象,因此只能先定义角色,再创建该资源进行关联,不符合你想要的复用顺序。
内容的提问来源于stack exchange,提问作者Garret Wilson
相关产品推荐
相关产品推荐

