AwsSdkCall 인터페이스를 사용하여 CDK 프로젝트에서 AWS SDK를 호출하는 방법은 무엇인가요?

2분 분량
0

AwsSdkCall 인터페이스를 사용하여 AWS Cloud Development Kit(AWS CDK) 프로젝트에서 AWS SDK를 호출하려고 합니다.

간략한 설명

다음과 같은 스택 배포 시나리오에 AWS Software Development Kit(AWS SDK) 호출을 사용할 수 있습니다.

  • 스택이 동적으로 생성되고 업데이트되는 동안 구성을 검색합니다.
  • AWS CloudFormation에 있는 리소스의 반환 값에서 지원되지 않는 리소스의 속성을 검색합니다.
  • AWS CloudFormation에서 지원하지 않는 작은 패치나 구성 변경을 수행합니다.

Create, Delete 또는 Update와 같은 다양한 CloudFormation 스택 작업 이벤트에서 AWS SDK 호출을 트리거할 수 있습니다. AWS SDK 호출을 위해 배포 파이프라인에 대한 액세스 및 도구를 설정할 필요가 없습니다. AWS SDK 런타임은 AWS Cloud Development Kit(AWS CDK)에 의해 완전히 설정됩니다. 또한, 사용자 지정 리소스 뒤에 있는 AWS Lambda 함수에 대한 액세스를 사용자 지정하고 제한할 수 있습니다.

해결 방법

참고: 이 해결 방법의 다음 예시는 Python을 사용합니다. 사용 중인 프로그래밍 언어 전용 명령을 사용해야 합니다.

AwsSdkCall을 사용하여 AWS SDK를 호출하려면 세 가지 기본 파라미터를 선언해야 합니다.

  • Service - 호출하려는 AWS 서비스입니다. 값은 대소문자를 구분합니다.
  • Action - 수행하려는 API/작업 호출입니다. 이는 보통 카멜 표기법 패턴을 따릅니다. 값은 대소문자를 구분합니다.
  • Parameters - API/작업 호출을 수행하는 동안 전달하는 선택적 파라미터입니다. 파라미터를 변수로 선언한 다음 API 페이로드용 JSON 객체와 유사한 인터페이스에 전달할 수 있습니다. 자세한 내용은 ](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/index.html)JavaScript용 AWS SDK[를 참조하세요.

1.    AWS Systems Manager Agent에서 Amazon Machine Image ID 검색:

참고: 다음 예시에서는 custom_resourcescr로 가져오고 aws_cdkcdk로 가져옵니다.

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에서 aws_lambdalambda_로, custom_resourcescr로, aws_kmskms로 가져옵니다.

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 공식업데이트됨 일 년 전