【问题标题】:AWS Permissions to delete a CloudFormation stackAWS 删除 CloudFormation 堆栈的权限
【发布时间】:2021-01-19 02:10:37
【问题描述】:

我有一个 CloudFormation 堆栈,其中包括 EC2 实例、IAM 角色和一个自动缩放组。这是在目标 ALB 中执行负载测试的瞬态堆栈。一旦测试完成(时间有限),就会发送结果,并且应该删除此堆栈。

现在我使用我的凭据从我的计算机创建堆栈,尽管我的最终目的是在 CodePipeline 步骤中自动执行此操作。

我试图让堆栈使用 CLI 调用他自己的删除:

aws cloudformation delete-stack --stack-name ${AWS::StackName} --region ${AWS::Region}

运行此命令的 EC2 实例(此堆栈的一部分)具有此角色:

 WorkerNodeRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: LoadTestNodeRole
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: 
              - ec2.amazonaws.com
              - cloudformation.amazonaws.com
            Action: sts:AssumeRole   
      Policies:
        - PolicyName: LoadTestNodeRolePolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
            - Effect: Allow
              Resource: '*'
              Action: iam:PassRole
            - Effect: Allow 
              Resource: !Sub arn:aws:cloudformation:${AWS::Region}:${AWS::AccountId}:stack/${AWS::StackName}/*
              Action:
                - cloudformation:DeleteStack

我希望这足以删除堆栈,但它抱怨删除堆栈中单个元素的权限。例如:

API: autoscaling:DescribeAutoScalingGroup User: arn:aws:sts::(account):assumed-role/LoadtestNodeRole/(instance) is not authorized to perform: autoscaling:DescribeAutoScalingGroups 

如何授予角色权限以在特定堆栈上执行 cloudformation:DeleteStack 以删除包含的所有内容?

例如,由于上述原因,此堆栈无法自行删除:

Description: Autodelete test

Resources:

  WorkerNodeRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: NodeRole
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: 
              - ec2.amazonaws.com
              - cloudformation.amazonaws.com
            Action: sts:AssumeRole   
      Policies:
        - PolicyName: NodeRolePolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
            - Effect: Allow
              Resource: '*'
              Action: iam:PassRole
            - Effect: Allow 
              Resource: !Sub arn:aws:cloudformation:${AWS::Region}:${AWS::AccountId}:stack/${AWS::StackName}/*
              Action:
                - cloudformation:DeleteStack

  WorkerNodeInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: "/"
      Roles:
      - !Ref WorkerNodeRole

  MasterNode:
    Type: AWS::EC2::Instance
    Properties:
      IamInstanceProfile: !Ref WorkerNodeInstanceProfile
      ImageId: ami-0be2609ba883822ec
      InstanceType: t2.small
      UserData:
        Fn::Base64:
          !Sub 
            | 
            #!/bin/bash
            aws cloudformation delete-stack --stack-name ${AWS::StackName} --region ${AWS::Region}

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation amazon-iam


    【解决方案1】:

    总而言之:要使您的调用删除堆栈调用正常工作,您需要修改堆栈中所有资源(ASG、EC2、IAM + Cloudformation)的策略,在您的情况下是您的 ec2 实例角色。

    错误解释:

    只是要删除堆栈,您需要以下权限:

        {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Sid": "VisualEditor0",
                    "Effect": "Allow",
                    "Action": "cloudformation:DeleteStack",
                    "Resource": "arn:aws:cloudformation:eu-central-1:1234567890:stack/case-test3-stack/53a723c0-f413-11ea-8958"
                }
            ]
        }
    

    我有一个 CloudFormation 堆栈,其中包括 EC2 实例、IAM 角色和一个自动缩放组。

    所以所有内容都在一个堆栈中,当您尝试删除堆栈时,Cloudformation 从上到下依次执行,除非有一些依赖子句添加到堆栈中所有内容的定义中以进行删除。

    您不能使用delete-stack 选择性地删除资源

    加上调用删除的实例只有 cloudformation 堆栈的删除权限,但您的 cloudformation 堆栈也有 ASG 和其他资源。所以它失败了。

    就像我创建了这个堆栈

        $ cat minimal-cfn.yml
        Resources:
        Bucket:
            Type: 'AWS::S3::Bucket'
        BucketName:
            Type: AWS::SSM::Parameter
            Properties:
            Description: !Sub 'S3 Bucket from stack ${AWS::StackName}'
            Name: '/s3bucket/main/bucket-name'
            Type: String
            Value: !Ref Bucket
    

    而且我的角色只有上面策略中提到的删除堆栈的权限,现在我尝试删除堆栈并收到错误

        $ aws cloudformation delete-stack --stack-name adsadasdasdas
    
         User: arn:aws:sts::1234567890:assumed-role/testrole1/s3-access-example is 
        not authorized to perform: ssm:DeleteParameter on resource: arn:aws:ssm:eu-central-1:1234567890:parameter/s3bucket/main/bucket-name
        (Service: AmazonSSM; Status Code: 400; Error Code: AccessDeniedException; Request ID: 785ba9ad-e1b4-4d4b-aef4-5bea51481a87; Proxy: null)
    

    因为角色没有删除栈内资源的权限。

    【讨论】:

    • 这与我已经解释过的有什么不同?
    • @vtscop 我试图描述您的删除堆栈调用失败的原因以及该调用中删除资源的策略是什么。因此,当您尝试删除的资源是您尝试调用删除的资源时,您也不能执行删除堆栈操作,在您的情况下是实例以及您收到错误的原因自动缩放权限,因为 ec2 实例的角色被用于删除并且堆栈被作为一个整体删除,因此它也需要自动缩放权限。
    • 我想如果没有个别项目的权限,我不能删除任何东西:(谢谢
    猜你喜欢
    • 2018-03-24
    • 2021-04-05
    • 2017-02-21
    • 2015-12-12
    • 2021-04-22
    • 2021-03-15
    • 2019-09-01
    • 2021-12-18
    • 2018-03-08
    相关资源
    最近更新 更多