簡體   English   中英

AWS Cloudformation 模板 EC2 角色/策略循環依賴

[英]AWS Cloudformation template EC2 Role/Policy circular dependency

我正在編寫一個帶有單個 EC2 實例和一個 EBS 卷的 Cloudformation 模板。 我稍后會在使用 Powershell 腳本創建機器時附加卷。 當我在策略聲明資源中放置通配符 '*' 時它起作用,但是我想限制對一個實例和一個 ebs 卷的訪問。 使用 EBS 卷很容易,我可以在模板中引用它,它是在角色之前創建的,但對於實例,問題是實例需要首先創建角色,但也需要能夠創建我們需要創建角色的實例首先。 解決這種循環依賴的好方法是什么?

這是我的模板:

Resources:
  InstanceRole:
    Type: 'AWS::IAM::Role'
    Properties:
      RoleName: InstanceRole
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      Path: /
      Policies:
        - PolicyName: AttachVolume
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - 'ec2:AttachVolume'
                Resource:
                  - !Join 
                    - ''
                    - - 'arn:aws:ec2:'
                      - !Ref 'AWS::Region'
                      - ':'
                      - !Ref 'AWS::AccountId'
                      - ':instance/*'
                  - !Join 
                    - ''
                    - - 'arn:aws:ec2:'
                      - !Ref 'AWS::Region'
                      - ':'
                      - !Ref 'AWS::AccountId'
                      - ':volume/'
                      - !Ref DataVolume             
  InstanceProfile:
    Type: 'AWS::IAM::InstanceProfile'
    Properties:
      Roles:
        - !Ref InstanceRole
      InstanceProfileName: InstanceProfile
  Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      ImageId: !Ref AMI
      InstanceType: !Ref InstanceType
      IamInstanceProfile: !Ref InstanceProfile
      KeyName: ec2key
      BlockDeviceMappings:
        - DeviceName: /dev/sda1
          Ebs:
            VolumeType: gp2
            DeleteOnTermination: 'true'
            VolumeSize: '30'
      Tags:
        - Key: Name
          Value: MyInstance
      SubnetId: !Ref SubnetId
      SecurityGroupIds:
        - !Ref SGId
      UserData: !Base64 
        'Fn::Join':
          - ''
          - - |
              <script>
            - 'cfn-init.exe -v -c config -s '
            - !Ref 'AWS::StackId'
            - ' -r Instance'
            - ' --region '
            - !Ref 'AWS::Region'
            - |+

            - |
              </script>
  DataVolume:
    Type: "AWS::EC2::Volume"
    Properties:  
      AvailabilityZone: !GetAtt 
        - Instance
        - AvailabilityZone
      Size: "100"
      Tags:
        - Key: Name
          Value: InstanceExtraVolume

在您的特定示例中,您具有以下依賴項鏈: InstanceRole -> DataVolume -> Instance -> InstanceProfile -> InstanceRole

通常,當您的Role依賴於您的Resources而您的Resources依賴於您的Role 時,這就是AWS::IAM::Policy資源類型的用處。 這基本上將IAM 角色上的特定策略與IAM 策略本身解耦。

為此,您需要將InstanceRole拆分為一個InstanceRole和一個InstanceRolePolicy

Resources:
  InstanceRole:
    Type: 'AWS::IAM::Role'
    Properties:
      RoleName: InstanceRole
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      Path: /
  InstanceRolePolicy:
    Type: 'AWS::IAM::Policy'
    Properties:
      Roles:
        - !Ref InstanceRole
      PolicyName: AttachVolume
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Action:
              - 'ec2:AttachVolume'
            Resource:
              - !Join 
                - ''
                - - 'arn:aws:ec2:'
                  - !Ref 'AWS::Region'
                  - ':'
                  - !Ref 'AWS::AccountId'
                  - ':instance/*'
              - !Join 
                - ''
                - - 'arn:aws:ec2:'
                  - !Ref 'AWS::Region'
                  - ':'
                  - !Ref 'AWS::AccountId'
                  - ':volume/'
                  - !Ref DataVolume

這樣, InstanceRolePolicy取決於InstanceRoleDataVolume ,但InstanceRole不依賴任何東西,因此DataVolume -> Instance -> InstanceProfile -> InstanceRole鏈可以解析。

循環依賴的一種常見解決方案是執行多個步驟:使用最少的資源創建堆棧,然后修改模板並更新堆棧。

因此,模板的 v1 僅創建基本依賴資源,而在 v2 中,您修改模板以添加依賴資源並同時修改原始依賴資源。 然后進行堆棧更新。

另外,請參閱更多想法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM