如何使用介面 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 代理程式擷取 Amazon 機器映像 ID:

注意: 在下列範例中,將 custom_resources 匯入為 cr,將 aws_cdk 匯入為 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_cdkaws_lambda 匯入為 lambda_,將 custom_resources 匯入為 cr,將 aws_kms 匯入為 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 身分和存取管理 (IAM) 權限。如果合成後沒有新增正確的權限,則您可以使用 from_statements() 手動新增權限。

範例:

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