【问题标题】:AWS CDK - role and policy creationAWS CDK - 角色和策略创建
【发布时间】:2020-09-17 13:00:12
【问题描述】:

如何将此 CloudFormation 转换为 CDK(JavaScript 或 Java)?我正在尝试这样做,但这是我第一次使用 CDK,我不知道该怎么做。

FargateTaskExecutionServiceRole:
Type: AWS::IAM::Role
Properties:
  AssumeRolePolicyDocument:
    Statement:
    - Effect: Allow
      Principal:
        Service: 
          - ecs-tasks.amazonaws.com
      Action:
        - sts:AssumeRole
  Policies:
    - PolicyName: AmazonECSTaskExecutionRolePolicy
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
        - Effect: Allow
          Action:
            - 'ecr:GetAuthorizationToken'
            - 'ecr:BatchCheckLayerAvailability'
            - 'ecr:GetDownloadUrlForLayer'
            - 'ecr:BatchGetImage'
            - 'logs:CreateLogStream'
            - 'logs:PutLogEvents'
          Resource: '*'

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation aws-cdk


    【解决方案1】:

    您应该参考API reference document 以获得清晰的图片。有此类用例的示例。

    但是,既然你已经在这里问过了,我的手一直很痒,想给你一个答案,所以这里只是 IAM 部分的 TypeScript 实现:

    import { 
       ManagedPolicy, 
       Role, 
       ServicePrincipal, 
       PolicyStatement, 
       Effect 
    } from '@aws-cdk/aws-iam';
    
    ....
    ....
    
    const ecsFargateServiceRole = new Role(this, 'FargateTaskExecutionServiceRole', {
      assumedBy: new ServicePrincipal('ecs-tasks.amazonaws.com')
    });
    
    // Add a policy to a Role
    ecsFargateServiceRole.addToPolicy(
      new PolicyStatement({
        effect: Effect.ALLOW,
        resources: ['*'],
        actions: [            
          'ecr:GetAuthorizationToken',
          'ecr:BatchCheckLayerAvailability',
          'ecr:GetDownloadUrlForLayer',
          'ecr:BatchGetImage',
          'logs:CreateLogStream',
          'logs:PutLogEvents'
        ]
      })
    );
    
    // Add a managed policy to a role you can use
    ecsFargateServiceRole.addManagedPolicy(
        ManagedPolicy.fromAwsManagedPolicyName('AmazonECSTaskExecutionRolePolicy')
    );
    
    ....
    ....
    

    更新:

    当您向角色添加 AWS 托管策略时,您可以通过 its nameits ARN 获取托管策略作为参考。重要的部分是,如果 AWS Managed 策略按其名称或 ARN 如上所述使用,则您无需显式使用策略语句。根据我上面的回答,您可以使用托管策略方法而不是使用策略声明。

    现在定义角色的一种简单方法是:

    const ecsFargateServiceRole = new Role(this, 'FargateTaskExecutionServiceRole', {
      assumedBy: new ServicePrincipal('ecs-tasks.amazonaws.com'),
      managedPolicies: [
        ManagedPolicy.fromAwsManagedPolicyName('AmazonECSTaskExecutionRolePolicy')
      ]
    });
    

    请注意,为简洁起见,我已经排除了 Construct 的构造函数。

    【讨论】:

    • 嗨 dmahapatro。非常感谢您的回答。是否不需要包含策略的名称(PolicyName:AmazonECSTaskExecutionRolePolicy)?因为她是托管策略
    • 托管策略可以完全以不同的方式添加。我将更新我的答案以反映这一点。给我几分钟。
    • @user2081381 我已经更新了答案。在您的用例中,您只需要使用我展示的托管策略,您不需要使用addToPolicy()。如果您还有任何问题,请告诉我。
    • 是不是说cloudformation里面的策略不对?我不应该使用托管策略并使用属性操作、效果和资源吗?政策就是这样制定的,今天也是这样运作的
    • IAM 角色的 Cloudformation 模板提供了一个属性 ManagedPolicyArns,您可以在其中指定要附加到角色的托管策略的 ARN。 docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/… 。如果您正在编写自己的客户管理策略,我们通常使用Policies 属性
    猜你喜欢
    • 2020-12-16
    • 2018-03-02
    • 2022-10-04
    • 1970-01-01
    • 2020-04-25
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    相关资源
    最近更新 更多