리소스 - AWS Cloud Development Kit (AWS CDK) v2

AWS CDK v2 개발자 안내서입니다. 구형 CDK v1은 2022년 6월 1일에 유지 보수에 들어갔고 2023년 6월 1일에 지원이 종료되었습니다.

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

리소스

리소스는 AWS 서비스 애플리케이션에서 사용하도록 구성한 것입니다. 리소스는 의 기능입니다 AWS CloudFormation. AWS CloudFormation 템플릿에서 리소스와 해당 속성을 구성하여 리소스를 AWS CloudFormation 프로비저닝하도록 배포할 수 있습니다. 를 사용하면 AWS Cloud Development Kit (AWS CDK)구문을 통해 리소스를 구성할 수 있습니다. 그런 다음 CDK 앱을 배포합니다. 여기에는 AWS CloudFormation 템플릿을 합성하고 리소스를 AWS CloudFormation 프로비저닝하기 위한 배포가 포함됩니다.

구문을 사용하여 리소스 구성

구조물 설명된 대로 는 모든 리소스를 나타내는 구문이라고 하는 풍부한 클래스 AWS 구문 라이브러리를 AWS CDK 제공합니다. AWS

해당하는 구문을 사용하여 리소스의 인스턴스를 만들려면 범위에 첫 번째 인수로, 구문의 논리적 ID, 구성 속성 집합 (props) 을 전달해야 합니다. 예를 들어, 다음은 구성 라이브러리의 SQS.queue 구문을 사용하여 AWS KMS 암호화가 적용된 Amazon SQS 대기열을 생성하는 방법입니다. AWS

TypeScript
import * as sqs from '@aws-cdk/aws-sqs'; new sqs.Queue(this, 'MyQueue', { encryption: sqs.QueueEncryption.KMS_MANAGED });
JavaScript
const sqs = require('@aws-cdk/aws-sqs'); new sqs.Queue(this, 'MyQueue', { encryption: sqs.QueueEncryption.KMS_MANAGED });
Python
import aws_cdk.aws_sqs as sqs sqs.Queue(self, "MyQueue", encryption=sqs.QueueEncryption.KMS_MANAGED)
Java
import software.amazon.awscdk.services.sqs.*; Queue.Builder.create(this, "MyQueue").encryption( QueueEncryption.KMS_MANAGED).build();
C#
using Amazon.CDK.AWS.SQS; new Queue(this, "MyQueue", new QueueProps { Encryption = QueueEncryption.KMS_MANAGED });
Go
import ( "github.com/aws/aws-cdk-go/awscdk/v2" "github.com/aws/jsii-runtime-go" sqs "github.com/aws/aws-cdk-go/awscdk/v2/awssqs" ) sqs.NewQueue(stack, jsii.String("MyQueue"), &sqs.QueueProps{ Encryption: sqs.QueueEncryption_KMS_MANAGED, })

일부 구성 소품은 선택 사항이며 대부분의 경우 기본값이 있습니다. 경우에 따라 모든 props는 선택 사항이며 마지막 인수는 완전히 생략할 수 있습니다.

Resource attributes

AWS 구성 라이브러리에 있는 대부분의 리소스는 속성을 노출하는데, 이러한 속성은 배포 시 다음을 통해 해결됩니다. AWS CloudFormation속성은 유형 이름을 접두사로 사용하는 리소스 클래스에 속성 형태로 표시됩니다. 다음 예제는 (queueUrlPython:queue_url) 속성을 사용하여 Amazon SQS 대기열의 URL을 가져오는 방법을 보여줍니다.

TypeScript
import * as sqs from '@aws-cdk/aws-sqs'; const queue = new sqs.Queue(this, 'MyQueue'); const url = queue.queueUrl; // => A string representing a deploy-time value
JavaScript
const sqs = require('@aws-cdk/aws-sqs'); const queue = new sqs.Queue(this, 'MyQueue'); const url = queue.queueUrl; // => A string representing a deploy-time value
Python
import aws_cdk.aws_sqs as sqs queue = sqs.Queue(self, "MyQueue") url = queue.queue_url # => A string representing a deploy-time value
Java
Queue queue = new Queue(this, "MyQueue"); String url = queue.getQueueUrl(); // => A string representing a deploy-time value
C#
var queue = new Queue(this, "MyQueue"); var url = queue.QueueUrl; // => A string representing a deploy-time value
Go
import ( "github.com/aws/aws-cdk-go/awscdk/v2" "github.com/aws/jsii-runtime-go" sqs "github.com/aws/aws-cdk-go/awscdk/v2/awssqs" ) queue := sqs.NewQueue(stack, jsii.String("MyQueue"), &sqs.QueueProps{}) url := queue.QueueUrl() // => A string representing a deploy-time value

배포 시간 속성을 문자열로 AWS CDK 인코딩하는 방법에 토큰 대한 자세한 내용은 을 참조하십시오.

리소스 참조

리소스를 구성할 때 다른 리소스의 속성을 참조해야 하는 경우가 많습니다. 예를 들어, 다음과 같습니다.

  • Amazon Elastic Container Service (Amazon ECS) 리소스에는 해당 리소스가 실행되는 클러스터에 대한 참조가 필요합니다.

  • Amazon CloudFront 배포에는 소스 코드가 들어 있는 Amazon Simple Storage 서비스 (Amazon S3) 버킷에 대한 참조가 필요합니다.

다음 방법 중 하나로 리소스를 참조할 수 있습니다.

  • CDK 앱에 정의된 리소스를 동일한 스택이나 다른 스택에 전달하여

  • 리소스의 고유 식별자 (예: ARN) 에서 생성된 AWS 계정에 정의된 리소스를 참조하는 프록시 객체를 전달함으로써

구성의 속성이 다른 리소스의 구성을 나타내는 경우 해당 구성의 유형은 해당 구성의 인터페이스 유형 유형입니다. 예를 들어 Amazon ECS 구문은 다음과 같은 cluster 유형의 ecs.ICluster 속성을 사용합니다. 또 다른 예로는 유형의 속성 sourceBucket (Python:source_bucket) 을 취하는 CloudFront 배포 구문을 들 수 s3.IBucket 있습니다.

동일한 AWS CDK 앱에 정의된 적절한 유형의 리소스 객체를 직접 전달할 수 있습니다. 다음 예제는 Amazon ECS 클러스터를 정의한 다음 이를 사용하여 Amazon ECS 서비스를 정의합니다.

TypeScript
const cluster = new ecs.Cluster(this, 'Cluster', { /*...*/ }); const service = new ecs.Ec2Service(this, 'Service', { cluster: cluster });
JavaScript
const cluster = new ecs.Cluster(this, 'Cluster', { /*...*/ }); const service = new ecs.Ec2Service(this, 'Service', { cluster: cluster });
Python
cluster = ecs.Cluster(self, "Cluster") service = ecs.Ec2Service(self, "Service", cluster=cluster)
Java
Cluster cluster = new Cluster(this, "Cluster"); Ec2Service service = new Ec2Service(this, "Service", new Ec2ServiceProps.Builder().cluster(cluster).build());
C#
var cluster = new Cluster(this, "Cluster"); var service = new Ec2Service(this, "Service", new Ec2ServiceProps { Cluster = cluster });
Go
import ( "github.com/aws/aws-cdk-go/awscdk/v2" "github.com/aws/jsii-runtime-go" ecs "github.com/aws/aws-cdk-go/awscdk/v2/awsecs" ) cluster := ecs.NewCluster(stack, jsii.String("MyCluster"), &ecs.ClusterProps{}) service := ecs.NewEc2Service(stack, jsii.String("MyService"), &ecs.Ec2ServiceProps{ Cluster: cluster, })

다른 스택의 리소스 참조

리소스가 동일한 앱에 정의되어 있고 동일한 AWS 환경에 있는 한 다른 스택의 리소스를 참조할 수 있습니다. 일반적으로 다음과 같은 패턴이 사용됩니다.

  • 구문에 대한 참조를 리소스를 생성하는 스택의 속성으로 저장합니다. (현재 구문의 스택에 대한 참조를 가져오려면 를 사용하십시오Stack.of(this).)

  • 리소스를 매개 변수 또는 속성으로 사용하는 스택의 생성자에 이 참조를 전달하십시오. 그런 다음 소비 스택은 해당 스택을 필요로 하는 모든 구문에 해당 스택을 속성으로 전달합니다.

다음 예제에서는 스택을 정의합니다stack1. 이 스택은 Amazon S3 버킷을 정의하고 버킷 구조에 대한 참조를 스택의 속성으로 저장합니다. 그런 다음 앱은 인스턴스화 시 버킷을 허용하는 두 번째 스택을 정의합니다. stack2 stack2예를 들어 버킷을 데이터 AWS Glue 스토리지로 사용하는 테이블을 정의할 수 있습니다.

TypeScript
const prod = { account: '123456789012', region: 'us-east-1' }; const stack1 = new StackThatProvidesABucket(app, 'Stack1', { env: prod }); // stack2 will take a property { bucket: IBucket } const stack2 = new StackThatExpectsABucket(app, 'Stack2', { bucket: stack1.bucket, env: prod });
JavaScript
const prod = { account: '123456789012', region: 'us-east-1' }; const stack1 = new StackThatProvidesABucket(app, 'Stack1', { env: prod }); // stack2 will take a property { bucket: IBucket } const stack2 = new StackThatExpectsABucket(app, 'Stack2', { bucket: stack1.bucket, env: prod });
Python
prod = core.Environment(account="123456789012", region="us-east-1") stack1 = StackThatProvidesABucket(app, "Stack1", env=prod) # stack2 will take a property "bucket" stack2 = StackThatExpectsABucket(app, "Stack2", bucket=stack1.bucket, env=prod)
Java
// Helper method to build an environment static Environment makeEnv(String account, String region) { return Environment.builder().account(account).region(region) .build(); } App app = new App(); Environment prod = makeEnv("123456789012", "us-east-1"); StackThatProvidesABucket stack1 = new StackThatProvidesABucket(app, "Stack1", StackProps.builder().env(prod).build()); // stack2 will take an argument "bucket" StackThatExpectsABucket stack2 = new StackThatExpectsABucket(app, "Stack,", StackProps.builder().env(prod).build(), stack1.bucket);
C#
Amazon.CDK.Environment makeEnv(string account, string region) { return new Amazon.CDK.Environment { Account = account, Region = region }; } var prod = makeEnv(account: "123456789012", region: "us-east-1"); var stack1 = new StackThatProvidesABucket(app, "Stack1", new StackProps { Env = prod }); // stack2 will take a property "bucket" var stack2 = new StackThatExpectsABucket(app, "Stack2", new StackProps { Env = prod, bucket = stack1.Bucket});

리소스가 동일한 환경에 있지만 다른 스택에 있다고 AWS CDK 판단되면 생성 스택의 AWS CloudFormation 내보내기와 소비 스택의 Fn:: ImportValue 를 자동으로 합성하여 해당 정보를 한 스택에서 다른 스택으로 전송합니다.

종속성 교착 상태 해결

다른 스택의 한 스택에서 리소스를 참조하면 두 스택 사이에 종속성이 생깁니다. 이렇게 하면 올바른 순서로 배포될 수 있습니다. 스택을 배포한 후에는 이러한 종속성이 명확해집니다. 그런 다음 소비 스택에서 공유 리소스 사용을 제거하면 예기치 않은 배포 실패가 발생할 수 있습니다. 이 문제는 두 스택 사이에 또 다른 종속성이 있어 두 스택을 동일한 순서로 배포해야 하는 경우에 발생합니다. CDK 툴킷에서 단순히 프로덕션 스택을 선택하여 먼저 배포하는 경우에도 종속성 없이 발생할 수 있습니다. AWS CloudFormation 익스포트는 더 이상 필요하지 않으므로 프로덕션 스택에서 제거되지만, 익스포트된 리소스는 업데이트가 아직 배포되지 않았으므로 사용 스택에서 계속 사용됩니다. 따라서 프로듀서 스택 배포가 실패합니다.

이러한 교착 상태를 해결하려면 소비 스택에서 공유 리소스 사용을 제거하세요. (이렇게 하면 프로덕션 스택에서 자동 내보내기가 제거됩니다.) 그런 다음 자동으로 생성된 내보내기와 정확히 동일한 논리 ID를 사용하여 동일한 내보내기를 생산 스택에 수동으로 추가합니다. 소비 스택에서 공유 리소스를 사용하지 않고 두 스택을 모두 배포하십시오. 그런 다음 수동 내보내기 (더 이상 필요하지 않은 경우 공유 리소스 포함) 를 제거하고 두 스택을 다시 배포하십시오. 스택의 exportValue() 방법은 이러한 목적으로 수동 내보내기를 생성할 수 있는 편리한 방법입니다. (링크된 메서드 참조의 예제를 참조하십시오.)

계정의 리소스 참조 AWS

AWS 계정에서 이미 사용 가능한 리소스를 앱에서 사용하고 싶다고 가정해 보겠습니다. AWS CDK 콘솔이나 AWS SDK를 통해 정의하거나 다른 애플리케이션에서 직접 정의하거나 다른 AWS CDK 애플리케이션에서 정의한 리소스일 수 있습니다. AWS CloudFormation리소스의 ARN (또는 다른 식별 속성 또는 속성 그룹) 을 프록시 객체로 전환할 수 있습니다. 프록시 객체는 리소스 클래스에서 정적 팩토리 메서드를 호출하여 리소스에 대한 참조 역할을 합니다.

이러한 프록시를 만들면 외부 리소스가 AWS CDK 앱의 일부가 되지 않습니다. 따라서 AWS CDK 앱에서 프록시를 변경해도 배포된 리소스에는 영향을 주지 않습니다. 하지만 프록시는 해당 유형의 리소스가 필요한 모든 AWS CDK 메서드에 전달될 수 있습니다.

다음 예제는 ARN arn:aws:s3: ::my-bucket-name을 사용하여 기존 버킷을 기반으로 하는 버킷과 특정 ID를 가진 기존 VPC를 기반으로 하는 Amazon Virtual Private Cloud를 참조하는 방법을 보여줍니다.

TypeScript
// Construct a proxy for a bucket by its name (must be same account) s3.Bucket.fromBucketName(this, 'MyBucket', 'my-bucket-name'); // Construct a proxy for a bucket by its full ARN (can be another account) s3.Bucket.fromBucketArn(this, 'MyBucket', 'arn:aws:s3:::my-bucket-name'); // Construct a proxy for an existing VPC from its attribute(s) ec2.Vpc.fromVpcAttributes(this, 'MyVpc', { vpcId: 'vpc-1234567890abcde', });
JavaScript
// Construct a proxy for a bucket by its name (must be same account) s3.Bucket.fromBucketName(this, 'MyBucket', 'my-bucket-name'); // Construct a proxy for a bucket by its full ARN (can be another account) s3.Bucket.fromBucketArn(this, 'MyBucket', 'arn:aws:s3:::my-bucket-name'); // Construct a proxy for an existing VPC from its attribute(s) ec2.Vpc.fromVpcAttributes(this, 'MyVpc', { vpcId: 'vpc-1234567890abcde' });
Python
# Construct a proxy for a bucket by its name (must be same account) s3.Bucket.from_bucket_name(self, "MyBucket", "my-bucket-name") # Construct a proxy for a bucket by its full ARN (can be another account) s3.Bucket.from_bucket_arn(self, "MyBucket", "arn:aws:s3:::my-bucket-name") # Construct a proxy for an existing VPC from its attribute(s) ec2.Vpc.from_vpc_attributes(self, "MyVpc", vpc_id="vpc-1234567890abcdef")
Java
// Construct a proxy for a bucket by its name (must be same account) Bucket.fromBucketName(this, "MyBucket", "my-bucket-name"); // Construct a proxy for a bucket by its full ARN (can be another account) Bucket.fromBucketArn(this, "MyBucket", "arn:aws:s3:::my-bucket-name"); // Construct a proxy for an existing VPC from its attribute(s) Vpc.fromVpcAttributes(this, "MyVpc", VpcAttributes.builder() .vpcId("vpc-1234567890abcdef").build());
C#
// Construct a proxy for a bucket by its name (must be same account) Bucket.FromBucketName(this, "MyBucket", "my-bucket-name"); // Construct a proxy for a bucket by its full ARN (can be another account) Bucket.FromBucketArn(this, "MyBucket", "arn:aws:s3:::my-bucket-name"); // Construct a proxy for an existing VPC from its attribute(s) Vpc.FromVpcAttributes(this, "MyVpc", new VpcAttributes { VpcId = "vpc-1234567890abcdef" });
Go
// Define a proxy for a bucket by its name (must be same account) s3.Bucket_FromBucketName(stack, jsii.String("MyBucket"), jsii.String("MyBucketName")) // Define a proxy for a bucket by its full ARN (can be another account) s3.Bucket_FromBucketArn(stack, jsii.String("MyBucket"), jsii.String("arn:aws:s3:::my-bucket-name")) // Define a proxy for an existing VPC from its attributes ec2.Vpc_FromVpcAttributes(stack, jsii.String("MyVpc"), &ec2.VpcAttributes{ VpcId: jsii.String("vpc-1234567890abcde"), })

메서드를 좀 Vpc.fromLookup()더 자세히 살펴보겠습니다. ec2.Vpc구조가 복잡하기 때문에 CDK 앱과 함께 사용할 VPC를 선택하는 방법은 여러 가지가 있습니다. 이 문제를 해결하기 위해 VPC 구조에는 합성 시 계정을 쿼리하여 원하는 Amazon VPC를 조회할 수 있는 fromLookup 정적 메서드 (Python:from_lookup) 가 있습니다. AWS

사용하려면 Vpc.fromLookup() 스택을 합성하는 시스템이 Amazon VPC를 소유한 계정에 액세스할 수 있어야 합니다. 이는 CDK 툴킷이 통합 시 계정을 쿼리하여 적합한 Amazon VPC를 찾기 때문입니다.

또한 명시적 계정 및 지역으로 정의된 스택에서만 Vpc.fromLookup() 작동합니다 (참조). 환경 환경에 구애받지 않는 스택에서 Amazon VPC를 AWS CDK 검색하려고 하면 CDK Toolkit은 VPC를 찾기 위해 어떤 환경을 쿼리해야 하는지 알지 못합니다.

계정에서 VPC를 고유하게 식별할 수 있을 만큼 충분한 Vpc.fromLookup() 속성을 제공해야 합니다. AWS 예를 들어 기본 VPC는 한 개만 있을 수 있으므로 VPC를 기본 VPC로 지정하는 것으로 충분합니다.

TypeScript
ec2.Vpc.fromLookup(this, 'DefaultVpc', { isDefault: true });
JavaScript
ec2.Vpc.fromLookup(this, 'DefaultVpc', { isDefault: true });
Python
ec2.Vpc.from_lookup(self, "DefaultVpc", is_default=True)
Java
Vpc.fromLookup(this, "DefaultVpc", VpcLookupOptions.builder() .isDefault(true).build());
C#
Vpc.FromLookup(this, id = "DefaultVpc", new VpcLookupOptions { IsDefault = true });
Go
ec2.Vpc_FromLookup(this, jsii.String("DefaultVpc"), &ec2.VpcLookupOptions{ IsDefault: jsii.Bool(true), })

tags속성을 사용하여 태그별로 VPC를 쿼리할 수도 있습니다. Amazon VPC를 만들 때 AWS CloudFormation 또는 를 사용하여 태그를 추가할 수 있습니다. AWS CDK태그를 생성한 후 언제든지 AWS Management Console AWS CLI, 또는 AWS SDK를 사용하여 태그를 편집할 수 있습니다. 직접 추가한 태그 외에도 는 생성하는 모든 VPC에 다음 태그를 AWS CDK 자동으로 추가합니다.

  • 이름 — VPC의 이름입니다.

  • aws-cdk:서브넷 이름 — 서브넷의 이름입니다.

  • aws-cdk:서브넷 유형 — 서브넷 유형: 퍼블릭, 프라이빗 또는 격리.

TypeScript
ec2.Vpc.fromLookup(this, 'PublicVpc', {tags: {'aws-cdk:subnet-type': "Public"}});
JavaScript
ec2.Vpc.fromLookup(this, 'PublicVpc', {tags: {'aws-cdk:subnet-type': "Public"}});
Python
ec2.Vpc.from_lookup(self, "PublicVpc", tags={"aws-cdk:subnet-type": "Public"})
Java
Vpc.fromLookup(this, "PublicVpc", VpcLookupOptions.builder() .tags(java.util.Map.of("aws-cdk:subnet-type", "Public")) // Java 9 or later .build());
C#
Vpc.FromLookup(this, id = "PublicVpc", new VpcLookupOptions { Tags = new Dictionary<string, string> { ["aws-cdk:subnet-type"] = "Public" });
Go
ec2.Vpc_FromLookup(this, jsii.String("DefaultVpc"), &ec2.VpcLookupOptions{ Tags: &map[string]*string{"aws-cdk:subnet-type": jsii.String("Public")}, })

의 결과는 프로젝트 파일에 캐시됩니다. Vpc.fromLookup() cdk.context.json (런타임 컨텍스트를 참조하세요.) 앱이 동일한 Amazon VPC를 계속 참조할 수 있도록 이 파일을 버전 관리에 커밋하십시오. 이는 나중에 VPC의 속성을 변경하여 다른 VPC가 선택되도록 하는 경우에도 작동합니다. 이는 CDK Pipelines와 같이 VPC를 정의하는 AWS 계정에 액세스할 수 없는 환경에 스택을 배포하는 경우 특히 중요합니다.

AWS CDK 앱에 정의된 유사한 리소스를 사용하는 곳 어디에서나 외부 리소스를 사용할 수 있지만 수정할 수는 없습니다. 예를 들어 외부에서 addToResourcePolicy (Python:add_to_resource_policy) 를 s3.Bucket 호출해도 아무 작업도 수행되지 않습니다.

리소스 물리적 이름

에 AWS CloudFormation 있는 리소스의 논리적 이름은 배포한 AWS Management Console 다음에 표시되는 리소스 이름과 다릅니다 AWS CloudFormation. 이 AWS CDK 호출은 이러한 최종 이름을 물리적 이름으로 부릅니다.

예를 AWS CloudFormation 들어, 물리적 이름을 가진 이전 예제의 논리적 ID를 Stack2MyBucket4DD88B4F 사용하여 Amazon S3 버킷을 생성할 수 stack2mybucket4dd88b4f-iuv1rbv9z3to 있습니다.

Name 속성을 사용하여 리소스를 나타내는 구성을 작성할 때 물리적 <resourceType>이름을 지정할 수 있습니다. 다음 예제는 물리적 이름을 사용하여 Amazon S3 버킷을 생성합니다my-bucket-name.

TypeScript
const bucket = new s3.Bucket(this, 'MyBucket', { bucketName: 'my-bucket-name', });
JavaScript
const bucket = new s3.Bucket(this, 'MyBucket', { bucketName: 'my-bucket-name' });
Python
bucket = s3.Bucket(self, "MyBucket", bucket_name="my-bucket-name")
Java
Bucket bucket = Bucket.Builder.create(this, "MyBucket") .bucketName("my-bucket-name").build();
C#
var bucket = new Bucket(this, "MyBucket", new BucketProps { BucketName = "my-bucket-name" });
Go
bucket := s3.NewBucket(this, jsii.String("MyBucket"), &s3.BucketProps{ BucketName: jsii.String("my-bucket-name"), })

리소스에 물리적 이름을 할당하면 몇 가지 단점이 있습니다. AWS CloudFormation가장 중요한 것은 생성 후 변경할 수 없는 리소스 속성 변경과 같이 리소스 교체가 필요한 배포된 리소스에 대한 모든 변경 사항은 리소스에 물리적 이름이 할당된 경우 실패한다는 것입니다. 이 상태가 되면 AWS CloudFormation 스택을 삭제한 다음 AWS CDK 앱을 다시 배포하는 것만이 유일한 해결책입니다. 자세한 내용은 AWS CloudFormation 설명서를 참조하십시오.

환경 간 참조를 사용하여 AWS CDK 앱을 만드는 경우와 같이 일부 경우에는 가 제대로 AWS CDK 작동하려면 물리적 이름이 필요합니다. 이러한 경우 실제 이름을 직접 만들고 싶지 않다면 이름을 대신 지정하면 됩니다 AWS CDK . 이렇게 하려면 다음과 같이 특수 값을 PhysicalName.GENERATE_IF_NEEDED 사용하십시오.

TypeScript
const bucket = new s3.Bucket(this, 'MyBucket', { bucketName: core.PhysicalName.GENERATE_IF_NEEDED, });
JavaScript
const bucket = new s3.Bucket(this, 'MyBucket', { bucketName: core.PhysicalName.GENERATE_IF_NEEDED });
Python
bucket = s3.Bucket(self, "MyBucket", bucket_name=core.PhysicalName.GENERATE_IF_NEEDED)
Java
Bucket bucket = Bucket.Builder.create(this, "MyBucket") .bucketName(PhysicalName.GENERATE_IF_NEEDED).build();
C#
var bucket = new Bucket(this, "MyBucket", new BucketProps { BucketName = PhysicalName.GENERATE_IF_NEEDED });
Go
bucket := s3.NewBucket(this, jsii.String("MyBucket"), &s3.BucketProps{ BucketName: awscdk.PhysicalName_GENERATE_IF_NEEDED(), })

고유한 리소스 식별자 전달

가능하면 이전 섹션에서 설명한 대로 참조를 통해 리소스를 전달해야 합니다. 하지만 속성 중 하나로 리소스를 참조하는 것 외에는 다른 선택의 여지가 없는 경우도 있습니다. 사용 사례의 예는 다음과 같습니다.

  • 저수준 AWS CloudFormation 리소스를 사용하는 경우.

  • 환경 변수를 통해 Lambda 함수를 참조하는 경우와 같이 AWS CDK 애플리케이션의 런타임 구성 요소에 리소스를 노출해야 하는 경우

이러한 식별자는 다음과 같이 리소스의 속성으로 사용할 수 있습니다.

TypeScript
bucket.bucketName lambdaFunc.functionArn securityGroup.groupArn
JavaScript
bucket.bucketName lambdaFunc.functionArn securityGroup.groupArn
Python
bucket.bucket_name lambda_func.function_arn security_group_arn
Java

Java AWS CDK 바인딩은 속성에 게터 메서드를 사용합니다.

bucket.getBucketName() lambdaFunc.getFunctionArn() securityGroup.getGroupArn()
C#
bucket.BucketName lambdaFunc.FunctionArn securityGroup.GroupArn
Go
bucket.BucketName() fn.FunctionArn()

다음 예제는 생성된 버킷 이름을 AWS Lambda 함수에 전달하는 방법을 보여줍니다.

TypeScript
const bucket = new s3.Bucket(this, 'Bucket'); new lambda.Function(this, 'MyLambda', { // ... environment: { BUCKET_NAME: bucket.bucketName, }, });
JavaScript
const bucket = new s3.Bucket(this, 'Bucket'); new lambda.Function(this, 'MyLambda', { // ... environment: { BUCKET_NAME: bucket.bucketName } });
Python
bucket = s3.Bucket(self, "Bucket") lambda.Function(self, "MyLambda", environment=dict(BUCKET_NAME=bucket.bucket_name))
Java
final Bucket bucket = new Bucket(this, "Bucket"); Function.Builder.create(this, "MyLambda") .environment(java.util.Map.of( // Java 9 or later "BUCKET_NAME", bucket.getBucketName())) .build();
C#
var bucket = new Bucket(this, "Bucket"); new Function(this, "MyLambda", new FunctionProps { Environment = new Dictionary<string, string> { ["BUCKET_NAME"] = bucket.BucketName } });
Go
bucket := s3.NewBucket(this, jsii.String("Bucket"), &s3.BucketProps{}) lambda.NewFunction(this, jsii.String("MyLambda"), &lambda.FunctionProps{ Environment: &map[string]*string{"BUCKET_NAME": bucket.BucketName()}, })

리소스 간 권한 부여

상위 수준 구조는 권한 요구 사항을 명시하는 간단한 인텐트 기반 API를 제공하여 최소 권한 달성을 가능하게 합니다. 예를 들어, 많은 L2 구조는 IAM 권한 설명을 수동으로 생성할 필요 없이 개체 (예: IAM 역할 또는 사용자) 에게 리소스를 사용할 수 있는 권한을 부여하는 데 사용할 수 있는 부여 방법을 제공합니다.

다음 예제는 Lambda 함수의 실행 역할이 특정 Amazon S3 버킷에 객체를 읽고 쓸 수 있도록 권한을 생성합니다. Amazon S3 버킷이 AWS KMS 키로 암호화된 경우, 이 메서드는 Lambda 함수의 실행 역할에 키로 복호화할 수 있는 권한도 부여합니다.

TypeScript
if (bucket.grantReadWrite(func).success) { // ... }
JavaScript
if ( bucket.grantReadWrite(func).success) { // ... }
Python
if bucket.grant_read_write(func).success: # ...
Java
if (bucket.grantReadWrite(func).getSuccess()) { // ... }
C#
if (bucket.GrantReadWrite(func).Success) { // ... }
Go
if *bucket.GrantReadWrite(function, nil).Success() { // ... }

권한 부여 메서드는 객체를 반환합니다. iam.Grant Grant객체의 success 속성을 사용하여 권한 부여가 효과적으로 적용되었는지 여부를 확인할 수 있습니다 (예: 외부 리소스에 적용되지 않았을 수 있음). Grant객체의 assertSuccess (Python:assert_success) 메서드를 사용하여 권한 부여가 성공적으로 적용되었는지 확인할 수도 있습니다.

특정 사용 사례에 특정 권한 부여 방법을 사용할 수 없는 경우 일반 권한 부여 방법을 사용하여 지정된 작업 목록으로 새 권한 부여를 정의할 수 있습니다.

다음 예제는 Lambda 함수에 Amazon DynamoDB 작업에 대한 액세스 권한을 부여하는 방법을 보여줍니다. CreateBackup

TypeScript
table.grant(func, 'dynamodb:CreateBackup');
JavaScript
table.grant(func, 'dynamodb:CreateBackup');
Python
table.grant(func, "dynamodb:CreateBackup")
Java
table.grant(func, "dynamodb:CreateBackup");
C#
table.Grant(func, "dynamodb:CreateBackup");
Go
table := dynamodb.NewTable(this, jsii.String("MyTable"), &dynamodb.TableProps{}) table.Grant(function, jsii.String("dynamodb:CreateBackup"))

Lambda 함수와 같은 많은 리소스는 코드를 실행할 때 역할을 맡아야 합니다. 구성 속성을 사용하면 를 지정할 수 있습니다. iam.IRole 역할을 지정하지 않은 경우 함수는 해당 용도에 맞는 역할을 자동으로 생성합니다. 그런 다음 리소스에서 부여 메서드를 사용하여 역할에 명령문을 추가할 수 있습니다.

권한 부여 방법은 IAM 정책 처리를 위한 하위 수준 API를 사용하여 구축됩니다. 정책은 객체로 모델링됩니다. PolicyDocument 메서드 (Python:) 를 사용하여 역할 (또는 구문의 연결된 역할) 에 명령문을 직접 추가하거나 (Python:add_to_role_policy) addToRolePolicy 메서드를 사용하여 리소스의 Bucket 정책 addToResourcePolicy (예: 정책add_to_resource_policy) 에 명령문을 추가합니다.

리소스 메트릭 및 알람

많은 리소스에서 모니터링 대시보드 및 경보를 설정하는 데 사용할 수 있는 CloudWatch 지표를 내보냅니다. 상위 수준 구조에는 사용할 올바른 이름을 찾지 않고도 지표에 액세스할 수 있는 지표 메서드가 있습니다.

다음 예제는 Amazon SQS 대기열의 수가 100을 ApproximateNumberOfMessagesNotVisible 초과할 때 경보를 정의하는 방법을 보여줍니다.

TypeScript
import * as cw from '@aws-cdk/aws-cloudwatch'; import * as sqs from '@aws-cdk/aws-sqs'; import { Duration } from '@aws-cdk/core'; const queue = new sqs.Queue(this, 'MyQueue'); const metric = queue.metricApproximateNumberOfMessagesNotVisible({ label: 'Messages Visible (Approx)', period: Duration.minutes(5), // ... }); metric.createAlarm(this, 'TooManyMessagesAlarm', { comparisonOperator: cw.ComparisonOperator.GREATER_THAN_THRESHOLD, threshold: 100, // ... });
JavaScript
const cw = require('@aws-cdk/aws-cloudwatch'); const sqs = require('@aws-cdk/aws-sqs'); const { Duration } = require('@aws-cdk/core'); const queue = new sqs.Queue(this, 'MyQueue'); const metric = queue.metricApproximateNumberOfMessagesNotVisible({ label: 'Messages Visible (Approx)', period: Duration.minutes(5) // ... }); metric.createAlarm(this, 'TooManyMessagesAlarm', { comparisonOperator: cw.ComparisonOperator.GREATER_THAN_THRESHOLD, threshold: 100 // ... });
Python
import aws_cdk.aws_cloudwatch as cw import aws_cdk.aws_sqs as sqs from aws_cdk.core import Duration queue = sqs.Queue(self, "MyQueue") metric = queue.metric_approximate_number_of_messages_not_visible( label="Messages Visible (Approx)", period=Duration.minutes(5), # ... ) metric.create_alarm(self, "TooManyMessagesAlarm", comparison_operator=cw.ComparisonOperator.GREATER_THAN_THRESHOLD, threshold=100, # ... )
Java
import software.amazon.awscdk.core.Duration; import software.amazon.awscdk.services.sqs.Queue; import software.amazon.awscdk.services.cloudwatch.Metric; import software.amazon.awscdk.services.cloudwatch.MetricOptions; import software.amazon.awscdk.services.cloudwatch.CreateAlarmOptions; import software.amazon.awscdk.services.cloudwatch.ComparisonOperator; Queue queue = new Queue(this, "MyQueue"); Metric metric = queue .metricApproximateNumberOfMessagesNotVisible(MetricOptions.builder() .label("Messages Visible (Approx)") .period(Duration.minutes(5)).build()); metric.createAlarm(this, "TooManyMessagesAlarm", CreateAlarmOptions.builder() .comparisonOperator(ComparisonOperator.GREATER_THAN_THRESHOLD) .threshold(100) // ... .build());
C#
using cdk = Amazon.CDK; using cw = Amazon.CDK.AWS.CloudWatch; using sqs = Amazon.CDK.AWS.SQS; var queue = new sqs.Queue(this, "MyQueue"); var metric = queue.MetricApproximateNumberOfMessagesNotVisible(new cw.MetricOptions { Label = "Messages Visible (Approx)", Period = cdk.Duration.Minutes(5), // ... }); metric.CreateAlarm(this, "TooManyMessagesAlarm", new cw.CreateAlarmOptions { ComparisonOperator = cw.ComparisonOperator.GREATER_THAN_THRESHOLD, Threshold = 100, // .. });
Go
import ( "github.com/aws/aws-cdk-go/awscdk/v2" "github.com/aws/jsii-runtime-go" cw "github.com/aws/aws-cdk-go/awscdk/v2/awscloudwatch" sqs "github.com/aws/aws-cdk-go/awscdk/v2/awssqs" ) queue := sqs.NewQueue(this, jsii.String("MyQueue"), &sqs.QueueProps{}) metric := queue.MetricApproximateNumberOfMessagesNotVisible(&cw.MetricOptions{ Label: jsii.String("Messages Visible (Approx)"), Period: awscdk.Duration_Minutes(jsii.Number(5)), }) metric.CreateAlarm(this, jsii.String("TooManyMessagesAlarm"), &cw.CreateAlarmOptions{ ComparisonOperator: cw.ComparisonOperator_GREATER_THAN_THRESHOLD, Threshold: jsii.Number(100), })

특정 측정치에 대한 방법이 없는 경우 일반 측정치 방법을 사용하여 측정치 이름을 수동으로 지정할 수 있습니다.

CloudWatch 대시보드에 지표를 추가할 수도 있습니다. CloudWatch 섹션을 참조하세요.

네트워크 트래픽

대부분의 경우, 컴퓨팅 인프라가 지속성 계층에 액세스해야 하는 경우와 같이 애플리케이션이 작동하려면 네트워크에서 권한을 활성화해야 합니다. 연결을 설정하거나 수신 대기하는 리소스는 보안 그룹 규칙 또는 네트워크 ACL 설정을 포함하여 트래픽 흐름을 가능하게 하는 방법을 노출합니다.

IConnectable 리소스에는 네트워크 트래픽 규칙 connections 구성의 게이트웨이인 속성이 있습니다.

메서드를 사용하여 지정된 네트워크 경로를 통해 데이터가 흐르도록 할 수 있습니다. allow 다음 예제는 웹에 대한 HTTPS 연결과 Amazon EC2 Auto Scaling 그룹에서 들어오는 연결을 활성화합니다. fleet2

TypeScript
import * as asg from '@aws-cdk/aws-autoscaling'; import * as ec2 from '@aws-cdk/aws-ec2'; const fleet1: asg.AutoScalingGroup = asg.AutoScalingGroup(/*...*/); // Allow surfing the (secure) web fleet1.connections.allowTo(new ec2.Peer.anyIpv4(), new ec2.Port({ fromPort: 443, toPort: 443 })); const fleet2: asg.AutoScalingGroup = asg.AutoScalingGroup(/*...*/); fleet1.connections.allowFrom(fleet2, ec2.Port.AllTraffic());
JavaScript
const asg = require('@aws-cdk/aws-autoscaling'); const ec2 = require('@aws-cdk/aws-ec2'); const fleet1 = asg.AutoScalingGroup(); // Allow surfing the (secure) web fleet1.connections.allowTo(new ec2.Peer.anyIpv4(), new ec2.Port({ fromPort: 443, toPort: 443 })); const fleet2 = asg.AutoScalingGroup(); fleet1.connections.allowFrom(fleet2, ec2.Port.AllTraffic());
Python
import aws_cdk.aws_autoscaling as asg import aws_cdk.aws_ec2 as ec2 fleet1 = asg.AutoScalingGroup( ... ) # Allow surfing the (secure) web fleet1.connections.allow_to(ec2.Peer.any_ipv4(), ec2.Port(PortProps(from_port=443, to_port=443))) fleet2 = asg.AutoScalingGroup( ... ) fleet1.connections.allow_from(fleet2, ec2.Port.all_traffic())
Java
import software.amazon.awscdk.services.autoscaling.AutoScalingGroup; import software.amazon.awscdk.services.ec2.Peer; import software.amazon.awscdk.services.ec2.Port; AutoScalingGroup fleet1 = AutoScalingGroup.Builder.create(this, "MyFleet") /* ... */.build(); // Allow surfing the (secure) Web fleet1.getConnections().allowTo(Peer.anyIpv4(), Port.Builder.create().fromPort(443).toPort(443).build()); AutoScalingGroup fleet2 = AutoScalingGroup.Builder.create(this, "MyFleet2") /* ... */.build(); fleet1.getConnections().allowFrom(fleet2, Port.allTraffic());
C#
using cdk = Amazon.CDK; using asg = Amazon.CDK.AWS.AutoScaling; using ec2 = Amazon.CDK.AWS.EC2; // Allow surfing the (secure) Web var fleet1 = new asg.AutoScalingGroup(this, "MyFleet", new asg.AutoScalingGroupProps { /* ... */ }); fleet1.Connections.AllowTo(ec2.Peer.AnyIpv4(), new ec2.Port(new ec2.PortProps { FromPort = 443, ToPort = 443 }); var fleet2 = new asg.AutoScalingGroup(this, "MyFleet2", new asg.AutoScalingGroupProps { /* ... */ }); fleet1.Connections.AllowFrom(fleet2, ec2.Port.AllTraffic());
Go
import ( "github.com/aws/aws-cdk-go/awscdk/v2" "github.com/aws/jsii-runtime-go" autoscaling "github.com/aws/aws-cdk-go/awscdk/v2/awsautoscaling" ec2 "github.com/aws/aws-cdk-go/awscdk/v2/awsec2" ) fleet1 := autoscaling.NewAutoScalingGroup(this, jsii.String("MyFleet1"), &autoscaling.AutoScalingGroupProps{}) fleet1.Connections().AllowTo(ec2.Peer_AnyIpv4(),ec2.NewPort(&ec2.PortProps{ FromPort: jsii.Number(443), ToPort: jsii.Number(443) }),jsii.String("secure web")) fleet2 := autoscaling.NewAutoScalingGroup(this, jsii.String("MyFleet2"), &autoscaling.AutoScalingGroupProps{}) fleet1.Connections().AllowFrom(fleet2, ec2.Port_AllTraffic(),jsii.String("all traffic"))

특정 리소스에는 기본 포트가 연결되어 있습니다. 퍼블릭 포트의 로드 밸런서 리스너, 데이터베이스 엔진이 Amazon RDS 데이터베이스 인스턴스 연결을 수락하는 포트 등을 예로 들 수 있습니다. 이 경우 포트를 수동으로 지정하지 않고도 네트워크를 엄격하게 제어할 수 있습니다. 이렇게 하려면 allowDefaultPortFromallowToDefaultPort 메서드 (Python:allow_default_port_from,allow_to_default_port) 를 사용하십시오.

다음 예는 모든 IPV4 주소의 연결과 Auto Scaling 그룹의 연결을 활성화하여 데이터베이스에 액세스할 수 있도록 하는 방법을 보여줍니다.

TypeScript
listener.connections.allowDefaultPortFromAnyIpv4('Allow public access'); fleet.connections.allowToDefaultPort(rdsDatabase, 'Fleet can access database');
JavaScript
listener.connections.allowDefaultPortFromAnyIpv4('Allow public access'); fleet.connections.allowToDefaultPort(rdsDatabase, 'Fleet can access database');
Python
listener.connections.allow_default_port_from_any_ipv4("Allow public access") fleet.connections.allow_to_default_port(rds_database, "Fleet can access database")
Java
listener.getConnections().allowDefaultPortFromAnyIpv4("Allow public access"); fleet.getConnections().AllowToDefaultPort(rdsDatabase, "Fleet can access database");
C#
listener.Connections.AllowDefaultPortFromAnyIpv4("Allow public access"); fleet.Connections.AllowToDefaultPort(rdsDatabase, "Fleet can access database");
Go
listener.Connections().AllowDefaultPortFromAnyIpv4(jsii.String("Allow public Access")) fleet.Connections().AllowToDefaultPort(rdsDatabase, jsii.String("Fleet can access database"))

이벤트 처리

일부 리소스는 이벤트 소스로 작동할 수 있습니다. (Python:add_event_notification) addEventNotification 메서드를 사용하여 리소스에서 내보내는 특정 이벤트 유형에 이벤트 대상을 등록합니다. 이 외에도 addXxxNotification 메서드는 일반적인 이벤트 유형에 대한 핸들러를 등록하는 간단한 방법을 제공합니다.

다음 예제는 객체가 Amazon S3 버킷에 추가될 때 Lambda 함수를 트리거하는 방법을 보여줍니다.

TypeScript
import * as s3nots from '@aws-cdk/aws-s3-notifications'; const handler = new lambda.Function(this, 'Handler', { /*…*/ }); const bucket = new s3.Bucket(this, 'Bucket'); bucket.addObjectCreatedNotification(new s3nots.LambdaDestination(handler));
JavaScript
const s3nots = require('@aws-cdk/aws-s3-notifications'); const handler = new lambda.Function(this, 'Handler', { /*…*/ }); const bucket = new s3.Bucket(this, 'Bucket'); bucket.addObjectCreatedNotification(new s3nots.LambdaDestination(handler));
Python
import aws_cdk.aws_s3_notifications as s3_nots handler = lambda_.Function(self, "Handler", ...) bucket = s3.Bucket(self, "Bucket") bucket.add_object_created_notification(s3_nots.LambdaDestination(handler))
Java
import software.amazon.awscdk.services.s3.Bucket; import software.amazon.awscdk.services.lambda.Function; import software.amazon.awscdk.services.s3.notifications.LambdaDestination; Function handler = Function.Builder.create(this, "Handler")/* ... */.build(); Bucket bucket = new Bucket(this, "Bucket"); bucket.addObjectCreatedNotification(new LambdaDestination(handler));
C#
using lambda = Amazon.CDK.AWS.Lambda; using s3 = Amazon.CDK.AWS.S3; using s3Nots = Amazon.CDK.AWS.S3.Notifications; var handler = new lambda.Function(this, "Handler", new lambda.FunctionProps { .. }); var bucket = new s3.Bucket(this, "Bucket"); bucket.AddObjectCreatedNotification(new s3Nots.LambdaDestination(handler));
Go
import ( "github.com/aws/aws-cdk-go/awscdk/v2" "github.com/aws/jsii-runtime-go" s3 "github.com/aws/aws-cdk-go/awscdk/v2/awss3" s3nots "github.com/aws/aws-cdk-go/awscdk/v2/awss3notifications" ) handler := lambda.NewFunction(this, jsii.String("MyFunction"), &lambda.FunctionProps{}) bucket := s3.NewBucket(this, jsii.String("Bucket"), &s3.BucketProps{}) bucket.AddObjectCreatedNotification(s3nots.NewLambdaDestination(handler), nil)

제거 정책

데이터베이스, Amazon S3 버킷, Amazon ECR 레지스트리와 같이 영구 데이터를 유지 관리하는 리소스에는 제거 정책이 있습니다. 제거 정책은 영구 객체를 포함하는 AWS CDK 스택이 삭제될 때 영구 객체를 삭제할지 여부를 나타냅니다. 제거 정책을 지정하는 값은 모듈의 RemovalPolicy 열거를 통해 사용할 수 있습니다. AWS CDK core

참고

데이터를 영구적으로 저장하는 리소스 이외의 리소스에는 다른 용도로 사용되는 리소스가 removalPolicy 있을 수도 있습니다. 예를 들어, Lambda 함수 버전은 속성을 사용하여 removalPolicy 새 버전이 배포될 때 지정된 버전을 유지할지 여부를 결정합니다. 이는 Amazon S3 버킷 또는 DynamoDB 테이블의 제거 정책과 다른 의미와 기본값을 갖습니다.

의미
RemovalPolicy.RETAIN 스택을 파괴할 때 리소스의 내용을 보관하십시오 (기본값). 리소스가 스택에서 분리되었으므로 수동으로 삭제해야 합니다. 리소스가 아직 있는 상태에서 스택을 재배포하려고 하면 이름 충돌로 인한 오류 메시지가 나타납니다.
RemovalPolicy.DESTROY 리소스는 스택과 함께 삭제됩니다.

AWS CloudFormation 제거 정책이 로 설정되어 있더라도 파일이 포함된 Amazon S3 버킷은 제거하지 않습니다. DESTROY 그렇게 하려고 하면 오류가 발생합니다. AWS CloudFormation 버킷을 AWS CDK 삭제하기 전에 버킷에서 모든 파일을 삭제하도록 하려면 버킷의 autoDeleteObjects 속성을 로 설정하십시오. true

다음은 RemovalPolicy of DESTROY 및 로 autoDeleteOjbects 설정된 Amazon S3 버킷을 생성하는 예제입니다true.

TypeScript
import * as cdk from '@aws-cdk/core'; import * as s3 from '@aws-cdk/aws-s3'; export class CdkTestStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const bucket = new s3.Bucket(this, 'Bucket', { removalPolicy: cdk.RemovalPolicy.DESTROY, autoDeleteObjects: true }); } }
JavaScript
const cdk = require('@aws-cdk/core'); const s3 = require('@aws-cdk/aws-s3'); class CdkTestStack extends cdk.Stack { constructor(scope, id, props) { super(scope, id, props); const bucket = new s3.Bucket(this, 'Bucket', { removalPolicy: cdk.RemovalPolicy.DESTROY, autoDeleteObjects: true }); } } module.exports = { CdkTestStack }
Python
import aws_cdk.core as cdk import aws_cdk.aws_s3 as s3 class CdkTestStack(cdk.stack): def __init__(self, scope: cdk.Construct, id: str, **kwargs): super().__init__(scope, id, **kwargs) bucket = s3.Bucket(self, "Bucket", removal_policy=cdk.RemovalPolicy.DESTROY, auto_delete_objects=True)
Java
software.amazon.awscdk.core.*; import software.amazon.awscdk.services.s3.*; public class CdkTestStack extends Stack { public CdkTestStack(final Construct scope, final String id) { this(scope, id, null); } public CdkTestStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); Bucket.Builder.create(this, "Bucket") .removalPolicy(RemovalPolicy.DESTROY) .autoDeleteObjects(true).build(); } }
C#
using Amazon.CDK; using Amazon.CDK.AWS.S3; public CdkTestStack(Construct scope, string id, IStackProps props) : base(scope, id, props) { new Bucket(this, "Bucket", new BucketProps { RemovalPolicy = RemovalPolicy.DESTROY, AutoDeleteObjects = true }); }
Go
import ( "github.com/aws/aws-cdk-go/awscdk/v2" "github.com/aws/jsii-runtime-go" s3 "github.com/aws/aws-cdk-go/awscdk/v2/awss3" ) s3.NewBucket(this, jsii.String("Bucket"), &s3.BucketProps{ RemovalPolicy: awscdk.RemovalPolicy_DESTROY, AutoDeleteObjects: jsii.Bool(true), })

applyRemovalPolicy()메서드를 통해 기본 AWS CloudFormation 리소스에 직접 제거 정책을 적용할 수도 있습니다. 이 메서드는 L2 리소스의 props에 removalPolicy 속성이 없는 일부 스테이트풀 리소스에서 사용할 수 있습니다. 예는 다음과 같습니다.

  • AWS CloudFormation 스택

  • Amazon Cognito 사용자 풀

  • 아마존 DocumentDB 데이터베이스 인스턴스

  • 아마존 EC2 볼륨

  • 아마존 OpenSearch 서비스 도메인

  • 아마존 FSx 파일 시스템

  • Amazon SQS 대기열

TypeScript
const resource = bucket.node.findChild('Resource') as cdk.CfnResource; resource.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
JavaScript
const resource = bucket.node.findChild('Resource'); resource.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
Python
resource = bucket.node.find_child('Resource') resource.apply_removal_policy(cdk.RemovalPolicy.DESTROY);
Java
CfnResource resource = (CfnResource)bucket.node.findChild("Resource"); resource.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
C#
var resource = (CfnResource)bucket.node.findChild('Resource'); resource.ApplyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
참고

AWS CDK는 로 RemovalPolicy 번역됩니다. AWS CloudFormationDeletionPolicy 하지만 기본값은 데이터를 보존하는 것인데, 이는 AWS CloudFormation 기본값과 반대입니다. AWS CDK