如何使用 AwsSdkCall 接口从 CDK 项目进行 AWS SDK 调用?

2 分钟阅读
0

我想使用 AwsSdkCall 接口从 AWS Cloud Development Kit(AWS CDK)项目进行 AWS SDK 调用。

简短描述

可以将 AWS 软件开发工具包(AWS SDK)调用用于堆栈部署场景,例如:

  • 在动态创建和更新堆栈时检索配置。
  • 检索 AWS CloudFormation 中资源的返回值不支持的资源属性。
  • 进行 AWS CloudFormation 不支持的小修补或配置更改。

可以在发生不同的 CloudFormation 堆栈操作事件(例如创建删除更新)时触发 AWS SDK 调用。无需为部署管道设置访问权限和工具即可进行 AWS SDK 调用。AWS SDK 运行时系统完全由 AWS Cloud Development Kit(AWS CDK)进行设置。此外,还可以自定义和限制自定义资源背后的 AWS Lambda 函数的访问权限。

解决方法

**注意:**此解决方法中的以下示例使用 Python。确保使用特定于您正在使用的编程语言的命令。

要使用 AwsSdkCall 进行 AWS SDK 调用,必须声明三个基本参数:

  • 服务 – 这是您打算调用的 AWS 服务。值区分大小写。
  • 操作 – 这是您打算进行的 API/操作调用。通常遵循混合大小写模式。值区分大小写。
  • 参数 – 这些是您在进行 API/操作调用时传递的可选参数。可以将参数声明为变量,然后将其传递给接口,类似于 API 负载的 JSON 对象。有关详细信息,请参阅适用于 JavaScript 的 AWS SDK

1.    从 AWS Systems Manager Agent 检索亚马逊云机器镜像 ID:

**注意:**在以下示例中,以 cr 形式导入 custom_resources,以 cdk 形式导入 aws_cdk

get_ami_id = cr.AwsCustomResource(self, "GetAMIId",
                                                on_create=cr.AwsSdkCall(
                                                    service="SSM",
                                                    action="getParameter",
                                                    parameters={
                                                        "Name": "/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-x86_64-gp2"
                                                    },
                                                    physical_resource_id=cr.PhysicalResourceId.of('get-ami-id')),
                                                policy=cr.AwsCustomResourcePolicy.from_sdk_calls(
                                                    resources=cr.AwsCustomResourcePolicy.ANY_RESOURCE
                                                ))
cdk.CfnOutput(self, 'ImageId', value=get_ami_id.get_response_field('Parameter.Value'))

**注意:**可以使用 get_response_field 参数引用 API 调用的响应。

2.    使用自定义 KMS 密钥加密 Lambda 日志组:

**注意:**在以下示例中,从 aws_cdk,以 lambda_ 形式导入 aws_lambda,以 cr 形式导入 custom_resources,以 kms 形式导入 aws_kms

encryption_key = kms.Key(self, 'Key')
encryption_key.grant_encrypt_decrypt(
            iam.ServicePrincipal('logs.amazonaws.com'))

fn = lambda_.Function(self, "MyFunction",
                              runtime=lambda_.Runtime.NODEJS_16_X,
                              handler="index.handler",
                              code=lambda_.Code.from_inline("hello world"))

associate_kms_key = cr.AwsCustomResource(self, "AssociateKmsKey",
                                                 on_create=cr.AwsSdkCall(
                                                     service="CloudWatchLogs",
                                                     action="associateKmsKey",
                                                     parameters={
                                                       "kmsKeyId": encryption_key.key_arn,
                                                       "logGroupName": fn.log_group.log_group_name
                                                     },
                                                     physical_resource_id=cr.PhysicalResourceId.of("associate-kms-key")),
                                                 policy=cr.AwsCustomResourcePolicy.from_sdk_calls(
                                                     resources=cr.AwsCustomResourcePolicy.ANY_RESOURCE
                                                 )
                                                 )

注意:可以使用属性策略为自定义资源背后的 Lambda 函数授予权限,以进行 API 调用。如果使用 from_sdk_calls(),则每个 API 调用都会转换为相应的 AWS Identity and Access Management(IAM)权限。如果合成后未添加正确的权限,则可以使用 from_statements() 手动添加权限。

示例:

policy=cr.AwsCustomResourcePolicy.from_statements(
                                                     statements=[iam.PolicyStatement(actions=[
                                                         'dynamodb:DescribeTable', 'dynamodb:ListTables'],
                                                         resources=['*'],
                                                     )]
                                                 )
AWS 官方
AWS 官方已更新 10 个月前