如何使用 CDK Python 创建包含多个语句的 IAM PolicyDocument?

Posted

技术标签:

【中文标题】如何使用 CDK Python 创建包含多个语句的 IAM PolicyDocument?【英文标题】:How to create an IAM PolicyDocument with multiple statements using CDK Python? 【发布时间】:2022-01-20 02:26:30 【问题描述】:

我正在尝试使用 cdk 中的 python 编写包含多个语句的 IAM PolicyDocument,但我在任何地方都找不到任何示例。

这是我在 YAML 中的内容,我正在尝试使用 python 在 CDK 中编写。

Lambda:
    Type: AWS::IAM::Role
    Properties:
      RoleName:
        Fn::Sub: LambdaRole
      Policies:
        - PolicyName:
            Fn::Sub: LambdaPolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Sid: ADPermissions
                Effect: Allow
                Action:
                  - ssm:SendCommand
                  - ec2:DescribeInstances
                  - ds:DescribeDirectories
                  - ssm:GetParameter
                  - ssm:PutParameter
                  - ssm:StartAutomationExecution
                  - dynamodb:Scan
                  - dynamodb:Query
                  - sts:AssumeRole
                Resource: "*"
              - Sid: SQS
                Effect: Allow
                Action:
                  - sqs:SendMessage
                Resource:"*"
              - Sid: CloudWatch
                Effect: Allow
                Action:
                  - logs:CreateLogGroup
                  - logs:CreateLogStream
                  - logs:PutLogEvents
                Resource:"*"

我基于 YAML 编写了以下内容,但它给了我错误。对此的任何帮助都非常感谢。

   RolePolicy.add_to_policy(
            iam.PolicyDocument(
                statements = [
                    iam.PolicyStatement(
                        effect = iam.Effect.ALLOW,
                        actions = [
                            'ssm:SendCommand', 
                            'ec2:DescribeInstances', 
                            'ds:DescribeDirectories', 
                            'ssm:GetParameter', 
                            'ssm:PutParameter', 
                            'ssm:StartAutomationExecution', 
                            'sts:AssumeRole'
                        ],
                        resources = ['*']
                     )
                ]
            ),             
            iam.PolicyDocument(
                statements = [
                    iam.PolicyStatement(
                        effect = iam.Effect.ALLOW,
                        actions = [
                            'sqs:SendMessage'
                        ],
                        resources = ['*']
                    )
                ]
            ),            
            iam.PolicyDocument(
                statements = [
                    iam.PolicyStatement(
                        effect = iam.Effect.ALLOW,
                        actions = [
                            'logs:CreateLogGroup', 
                            'logs:CreateLogStream', 
                            'logs:PutLogEvents'
                        ],
                        resources = ['*']
                    )
                ]
            )
        )

【问题讨论】:

“给我错误” - 究竟是什么错误? 很抱歉没有提供错误信息。我是堆栈溢出的新手。我将通过提供更多细节和更好地提出问题来更好地向前推进。谢谢。 【参考方案1】:

该特定 API 仅接受单个语句,例如

RolePolicy.add_to_policy(
    iam.PolicyStatement(
        effect = iam.Effect.ALLOW,
        actions = [
            'ssm:SendCommand', 
            'ec2:DescribeInstances', 
            'ds:DescribeDirectories', 
            'ssm:GetParameter', 
            'ssm:PutParameter', 
            'ssm:StartAutomationExecution', 
            'sts:AssumeRole'
         ],
         resources = ['*']
    )
)

因此,假设 RolePolicy 是 PolicyDocument 类型,您将不得不对每个策略多次调用它。

请参考:https://docs.aws.amazon.com/cdk/api/latest/python/aws_cdk.aws_iam/Role.html#aws_cdk.aws_iam.Role.add_to_policy

或者,您可以调查其他 API 之一,该 API 可让您一次将整个策略附加到角色:https://docs.aws.amazon.com/cdk/api/latest/python/aws_cdk.aws_iam/Role.html#aws_cdk.aws_iam.Role.attach_inline_policy 或 https://docs.aws.amazon.com/cdk/api/latest/python/aws_cdk.aws_iam/Role.html#aws_cdk.aws_iam.Role.add_managed_policy

这里的结构更像:

Role.attach_inline_policy(
    iam.Policy(self, 'Policy',
        statements = [
            iam.PolicyStatement(
                effect = iam.Effect.ALLOW,
                actions = [
                    'ssm:SendCommand', 
                    'ec2:DescribeInstances', 
                    'ds:DescribeDirectories', 
                    'ssm:GetParameter', 
                    'ssm:PutParameter', 
                    'ssm:StartAutomationExecution', 
                    'sts:AssumeRole'
                 ],
                 resources = ['*']
            ),
            iam.PolicyStatement(
                effect = iam.Effect.ALLOW,
                actions = [
                    'sqs:SendMessage'
                ],
                resources = ['*']
            ),
            iam.PolicyStatement(
                effect = iam.Effect.ALLOW,
                actions = [
                    'logs:CreateLogGroup', 
                    'logs:CreateLogStream', 
                    'logs:PutLogEvents'
                ],
                resources = ['*']
            )
        ]
    )
)   

【讨论】:

这行得通,唯一认为缺少的是 iam.Policy 中 ID ('Policy') 旁边的逗号 (,)。非常感谢您为我提供解决方案 Norman。我真的很感激。 太好了,很高兴它成功了!

以上是关于如何使用 CDK Python 创建包含多个语句的 IAM PolicyDocument?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AWS CDK 创建的 Python Lambda 函数中安装外部模块?

如何使用 AWS CDK Pipelines 构建不同语言的 lambda

如何使用适用于 Python 的 AWS CDK 通过 ARN 查找现有的经典负载均衡器 (CLB)?

使用 MalformedPolicy 在 CDK 错误中创建托管策略

Cloudfront 提供通过 AWS CDK Python 为 S3 存储桶来源创建的访问被拒绝响应,无需公共访问

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