You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 17:58:25