AWS CDK - 角色和策略创建

Posted

技术标签:

【中文标题】AWS CDK - 角色和策略创建【英文标题】:AWS CDK - role and policy creation 【发布时间】: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: '*'

【问题讨论】:

【参考方案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 name 或 its 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 属性

以上是关于AWS CDK - 角色和策略创建的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AWS API 创建内联策略

AWS CDK:有没有办法使用 CDK 创建数据库模式?

AWS IAM 策略允许用户创建具有特定策略/角色的 IAM 用户

如何使用 Terraform 创建没有代入角色策略的 AWS IAM 角色?

AWS SQS - CDK - 如何创建主题过滤器

AWS - 如何使用 CDK/CloudFormation 将服务链接角色传递给自动缩放组?