【问题标题】:Cloudformation how to reference Managed-Policy from another stackCloudformation 如何从另一个堆栈引用托管策略
【发布时间】:2016-06-24 01:14:57
【问题描述】:

我有以下角色。在其中,我想使用来自另一个堆栈的现有托管策略。

我该怎么做?

"TestRole": {
    "Properties": {
      "AssumeRolePolicyDocument": {
        "Statement": [
          {
            "Action": [
              "sts:AssumeRole"
            ],
            "Effect": "Allow",
            "Principal": {
              "Service": [
                "lambda.amazonaws.com"
              ]
            }
          }
        ],
        "Version": "2012-10-17"
      },
      "Path": "/lambda/",
      "Policies": [
        ??????
      ]
    },
    "Type": "AWS::IAM::Role"
  }

【问题讨论】:

    标签: amazon-iam amazon-cloudformation


    【解决方案1】:

    根据Ref CF 函数的docs,您应该能够使用它通过其逻辑名称检索托管策略资源。

    例如:

    Policies: [
      { "Ref" : "MyManagedPolicy" }
    ]
    

    其中“MyManagedPolicy”将是您在 CF 模板中定义的资源的名称:

    "MyManagedPolicy" : {
      "Type": "AWS::IAM::ManagedPolicy",
      "Properties": {
        "Description" : String,
        "Groups" : [ String, ... ],
        "Path" : String,
        "PolicyDocument" : JSON object,
        "Roles" : [ String, ... ],
        "Users" : [ String, ... ]
      }
    }
    

    希望这有帮助吗?

    【讨论】:

    • 如果它在我的堆栈中,你是对的,但我想引用另一个堆栈中的策略。
    【解决方案2】:

    现在有一种支持的方式来执行此操作,使用 Imports/Exports。基本上,创建策略的堆栈有一个包含策略名称(或 ARN,不确定在这种情况下需要哪个)的输出,并将其声明为具有区域唯一名称的导出。然后,其他堆栈可以使用 Import 函数使用它。

    例如,如果以下堆栈(假设它名为 FooStack)创建托管策略,则其输出中可以包含以下内容:

    "Outputs" : {
        "MyManagedPolicy" : {
            "Value" : { "Ref" : "MyManagedPolicy" },
            "Export" : { "Name" : {"Fn::Sub": "${AWS::StackName}-MyManagedPolicy" }}
        }
    }
    

    其他堆栈可以使用它:

    "Policies": [
        { "Fn::ImportValue" : "FooStack-MyManagedPolicy" }
    ]
    

    【讨论】:

      【解决方案3】:

      如果您的要求是独立的可共享策略。那么您需要将其设为ManagedPolicy 而不是标准的Policy

      一个例子:

      1

      MyManagedPolicy:
      Type: AWS::IAM::ManagedPolicy
      Properties:
        Path: "/"
        PolicyDocument:
          Version: "2012-10-17"
          Statement:
            - Effect: "Allow"
              Action:
                - "s3:*"
              Resource:
                - Fn::GetAtt: MyBucket.Arn
      

      2

      导出:

      MyManagedPolicy:
      Description: MyManagedPolicy
      Value:
        Ref: MyManagedPolicy
      Export:
        Name:
          Fn::Join:
            - "-"
            - - "MyManagedPolicy"
              - Ref: StackName
      

      然后在您想要在其中一个角色中导入此独立托管策略的其他堆栈中,执行以下操作:

      MyUserRole:
      Type: "AWS::IAM::Role"
      Properties:
        RoleName: "SomeName"
        AssumeRolePolicyDocument:
          Version: "2012-10-17"
          Statement:
            - Effect: "Allow"
              Principal:
                AWS: 
                  - .....
              Action:
                - .....  
        Path: "/"
        ManagedPolicyArns:
          - Fn::ImportValue:
              Fn::Sub: "MyManagedPolicy-${StackName}"
        Policies:
          - PolicyName: "NameOfYouInlinePolicyWithoutSpaces"
            PolicyDocument:
              Version: "2012-10-17"
              Statement:
                - Effect: "Allow"
                  Action:
                    - .....
                  Resource:
                    - .....
      

      【讨论】:

        猜你喜欢
        • 2021-10-12
        • 2021-02-10
        • 1970-01-01
        • 2018-11-23
        • 2021-03-09
        • 2018-11-20
        • 1970-01-01
        • 2021-03-29
        • 2017-01-31
        相关资源
        最近更新 更多