AwsSdkCall インターフェイスを使用して、AWS Cloud Development Kit (AWS CDK) プロジェクトから AWS SDK を呼び出したいと考えています。
簡単な説明
AWS Software Development Kit (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 を呼び出すには、次の 3 つの基本パラメータを宣言する必要があります。
- **サービス ** - これは、呼び出す予定の AWS サービスです。検索値では大文字と小文字が区別されます。
- アクション - これは、実行する予定の API/アクション呼び出しです。これは通常、キャメルケースのパターンに従います。検索値では大文字と小文字が区別されます。
- パラメータ - これらは、API/アクション呼び出しを行う際に渡すオプションのパラメータです。パラメータを変数として宣言し、API ペイロードの JSON オブジェクトに似たインターフェイスに渡すことができます。詳細については、AWS SDK for JavaScript を参照してください。
1. AWS Systems Manager Agent から 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'))
**注:**API 呼び出しのレスポンスを参照するには get_response_field パラメーターを使用します。
2. カスタム KMS キーを使用して Lambda ロググループを暗号化します。
**注:**次の例では、aws_cdk から aws_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 Identity and Access Management (IAM) 権限に変換されます。合成後に正しい権限が追加されない場合は、from_statements() を使用して手動で権限を追加できます。
例:
policy=cr.AwsCustomResourcePolicy.from_statements(
statements=[iam.PolicyStatement(actions=[
'dynamodb:DescribeTable', 'dynamodb:ListTables'],
resources=['*'],
)]
)