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

v AWS CDK 2 개발자 안내서입니다. 이전 CDK v1은 2022년 6월 1일에 유지 관리에 들어갔고 2023년 6월 1일에 지원을 종료했습니다.

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

리소스 및 AWS CDK

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

구성 요소를 사용하여 리소스 구성

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

해당 구성 요소를 사용하여 리소스의 인스턴스를 생성하려면 범위를 첫 번째 인수, 구성 요소의 논리적 ID 및 구성 속성(프롭) 세트로 전달합니다. 예를 들어, AWS 다음은 구성 라이브러리의 sqs.Queue 구성 요소를 사용하여 AWS KMS 암호화를 사용하여 Amazon SQS 대기열을 생성하는 방법입니다.

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, })

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

Resource attributes

AWS 구조 라이브러리의 대부분의 리소스는 속성을 노출하며, 이 속성은 에 의해 배포 시점에 확인됩니다 AWS CloudFormation. 속성은 유형 이름이 접두사인 리소스 클래스의 속성 형태로 노출됩니다. 다음 예제에서는 queueUrl (Python: 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 인코딩하는 방법에 대한 자세한 내용은 토큰 및 AWS CDK 섹션을 참조하세요.

참조 리소스

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

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

  • Amazon CloudFront 배포에는 소스 코드가 포함된 Amazon Simple Storage Service(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을 정의합니다. 예를 들어 는 데이터 스토리지에 버킷을 사용하는 AWS Glue 테이블을 정의할 stack2 수 있습니다.

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 자동으로 합성하여 해당 정보를 한 스택에서 다른 스택으로 전송합니다.

종속성 교착 상태 해결

다른 스택의 한 스택에서 리소스를 참조하면 두 스택 간에 종속성이 발생합니다. 이렇게 하면 올바른 순서로 배포됩니다. 스택이 배포된 후에는 이 종속성이 구체적입니다. 그런 다음 소비 스택에서 공유 리소스 사용을 제거하면 예기치 않은 배포 실패가 발생할 수 있습니다. 이는 두 스택 간에 동일한 순서로 강제로 배포되는 또 다른 종속성이 있는 경우 발생합니다. Toolkit에서 먼저 배포CDK하도록 생산 스택을 선택한 경우에도 종속성 없이 발생할 수 있습니다. AWS CloudFormation 내보내기는 더 이상 필요하지 않기 때문에 생산 스택에서 제거되지만, 업데이트가 아직 배포되지 않았기 때문에 내보낸 리소스가 여전히 소비 스택에서 사용되고 있습니다. 따라서 생산자 스택 배포가 실패합니다.

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

AWS 계정의 리소스 참조

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

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

다음 예제에서는 ARN arn:aws:s3::amzn-s3-demo-bucket1이 있는 기존 버킷을 기반으로 버킷을 참조하고 특정 IDVPC가 있는 기존 를 기반으로 Amazon Virtual Private Cloud를 참조하는 방법을 보여줍니다.

TypeScript
// Construct a proxy for a bucket by its name (must be same account) s3.Bucket.fromBucketName(this, 'amzn-s3-demo-bucket', 'amzn-s3-demo-bucket1'); // Construct a proxy for a bucket by its full ARN (can be another account) s3.Bucket.fromBucketArn(this, 'amzn-s3-demo-bucket', 'arn:aws:s3:::amzn-s3-demo-bucket1'); // 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, 'amzn-s3-demo-bucket', 'amzn-s3-demo-bucket1'); // Construct a proxy for a bucket by its full ARN (can be another account) s3.Bucket.fromBucketArn(this, 'amzn-s3-demo-bucket', 'arn:aws:s3:::amzn-s3-demo-bucket1'); // 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, "amzn-s3-demo-bucket", "amzn-s3-demo-bucket1") # Construct a proxy for a bucket by its full ARN (can be another account) s3.Bucket.from_bucket_arn(self, "amzn-s3-demo-bucket", "arn:aws:s3:::amzn-s3-demo-bucket1") # 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, "amzn-s3-demo-bucket", "amzn-s3-demo-bucket1"); // Construct a proxy for a bucket by its full ARN (can be another account) Bucket.fromBucketArn(this, "amzn-s3-demo-bucket", "arn:aws:s3:::amzn-s3-demo-bucket1"); // 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, "amzn-s3-demo-bucket", "amzn-s3-demo-bucket1"); // Construct a proxy for a bucket by its full ARN (can be another account) Bucket.FromBucketArn(this, "amzn-s3-demo-bucket", "arn:aws:s3:::amzn-s3-demo-bucket1"); // 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("amzn-s3-demo-bucket"), jsii.String("amzn-s3-demo-bucket1")) // Define a proxy for a bucket by its full ARN (can be another account) s3.Bucket_FromBucketArn(stack, jsii.String("amzn-s3-demo-bucket"), jsii.String("arn:aws:s3:::amzn-s3-demo-bucket1")) // 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 구성에는 합성 시 AWS 계정을 쿼리VPC하여 원하는 Amazon을 조회할 수 있는 fromLookup 정적 메서드(Python: from_lookup)가 있습니다.

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

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

계정VPC AWS 에서 를 고유하게 식별하기에 충분한 Vpc.fromLookup() 속성을 제공해야 합니다. 예를 들어 기본값은 하나뿐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 속성을 사용하여 태그VPCs별로 쿼리할 수도 있습니다. AWS CloudFormation 또는 를 사용하여 생성 VPC 시 Amazon에 태그를 추가할 수 있습니다 AWS CDK. AWS Management Console, AWS CLI또는 를 사용하여 생성 후 언제든지 태그를 편집할 수 있습니다 AWS SDK. 직접 추가하는 태그 외에도 는 VPCs 생성하는 모든 에 다음 태그를 AWS CDK 자동으로 추가합니다.

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

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

  • aws-cdk:subnet-type – 서브넷의 유형: 퍼블릭, 프라이빗 또는 격리됨.

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")}, })

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

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

리소스 물리적 이름

에서 리소스의 논리적 이름은 에서 배포한 후 에 AWS Management Console 표시된 리소스의 이름과 AWS CloudFormation 다릅니다 AWS CloudFormation. 는 이러한 최종 이름의 물리적 이름 을 AWS CDK 호출합니다.

예를 들어, 이전 예제Stack2amzn-s3-demo-bucket4DD88B4F에서 물리적 이름 로 논리적 ID를 사용하여 Amazon S3 버킷을 생성할 수 AWS CloudFormation 있습니다stack2amzn-s3-demo-bucket4dd88b4f-iuv1rbv9z3to.

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

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

리소스에 물리적 이름을 할당하면 에서 몇 가지 단점이 있습니다 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, 'amzn-s3-demo-bucket', { bucketName: core.PhysicalName.GENERATE_IF_NEEDED, });
JavaScript
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', { bucketName: core.PhysicalName.GENERATE_IF_NEEDED });
Python
bucket = s3.Bucket(self, "amzn-s3-demo-bucket", bucket_name=core.PhysicalName.GENERATE_IF_NEEDED)
Java
Bucket bucket = Bucket.Builder.create(this, "amzn-s3-demo-bucket") .bucketName(PhysicalName.GENERATE_IF_NEEDED).build();
C#
var bucket = new Bucket(this, "amzn-s3-demo-bucket", new BucketProps { BucketName = PhysicalName.GENERATE_IF_NEEDED });
Go
bucket := s3.NewBucket(this, jsii.String("amzn-s3-demo-bucket"), &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 바인딩은 속성에 getter 메서드를 사용합니다.

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()}, })

리소스 간 권한 부여

상위 수준의 구성은 권한 요구 사항을 표현APIs하기 위한 간단한 의도 기반 권한을 제공하여 최소 권한 권한을 달성할 수 있습니다. 예를 들어, 많은 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) 메서드를 사용하여 권한 부여가 성공적으로 적용되었는지 확인할 수도 있습니다.

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

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

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 정책 처리를 APIs 위해 하위 수준을 사용하여 구축됩니다. 정책은 PolicyDocument 객체로 모델링됩니다. addToRolePolicy 메서드(Python: )를 사용하여 역할(또는 구성 요소의 연결된 역할add_to_role_policy)에 직접 문을 추가하거나 (Python: ) 메서드를 사용하여 리소스의 정책addToResourcePolicy(예: Bucket 정책add_to_resource_policy)에 문을 추가합니다.

리소스 지표 및 경보

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

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

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.

네트워크 트래픽

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

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

allow 메서드를 사용하여 데이터가 지정된 네트워크 경로에서 흐를 수 있도록 합니다. 다음 예제에서는 Amazon EC2 Auto Scaling 그룹 에서 웹HTTPS에 대한 연결 및 수신 연결을 활성화합니다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"))

이벤트 처리

일부 리소스는 이벤트 소스 역할을 할 수 있습니다. addEventNotification 메서드(Python: add_event_notification)를 사용하여 리소스에서 내보내는 특정 이벤트 유형에 이벤트 대상을 등록합니다. 또한 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 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 리소스의 프롭에 removalPolicy 속성이 없는 일부 상태 저장 리소스에서 사용할 수 있습니다. 예는 다음과 같습니다.

  • AWS CloudFormation 스택

  • Amazon Cognito 사용자 풀

  • Amazon DocumentDB 데이터베이스 인스턴스

  • Amazon EC2 볼륨

  • Amazon OpenSearch Service 도메인

  • Amazon 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는 AWS CloudFormation의 로 RemovalPolicy 변환됩니다DeletionPolicy. 그러나 의 기본값 AWS CDK 은 AWS CloudFormation 기본값과 반대인 데이터를 유지하는 것입니다.