AWS CDK 구성 - AWS Cloud Development Kit (AWS CDK) v2

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

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

AWS CDK 구성

구조는 AWS Cloud Development Kit (AWS CDK) 애플리케이션의 기본 구성 요소입니다. 구성은 애플리케이션 내에서 하나 이상의 AWS CloudFormation 리소스와 해당 구성을 나타내는 구성 요소입니다. 구성 요소를 가져오고 구성하여 애플리케이션을 개별적으로 빌드합니다.

구성 요소 가져오기 및 사용

Constructs는 AWS Construct Library 에서 CDK 애플리케이션으로 가져오는 클래스입니다. 자체 구성 요소를 생성 및 배포하거나 타사 개발자가 생성한 구성 요소를 사용할 수도 있습니다.

구성은 구성 프로그래밍 모델()의 일부입니다CPM. 다음과 같은 다른 도구와 함께 사용할 수 CDK 있습니다.Terraform (CDKtf), CDK에 대해 Kubernetes (CDK8s) 및 Projen.

또한 수많은 타사에서 와 호환되는 구성 요소를 게시했습니다 AWS CDK. 구성 허브를 방문하여 AWS CDK 구성 파트너 에코시스템을 살펴보세요.

구성 수준

Construct Library의 AWS 구조는 세 가지 수준으로 분류됩니다. 각 수준은 추상화 수준을 높입니다. 추상화가 높을수록 구성이 더 쉬워지고 전문 지식이 덜 필요합니다. 추상화가 작을수록 더 많은 사용자 지정이 가능하므로 더 많은 전문 지식이 필요합니다.

레벨 1(L1) 구성

CFN 리소스 라고도 하는 L1 구성은 가장 낮은 수준의 구성이며 추상화를 제공하지 않습니다. 각 L1 구성은 단일 AWS CloudFormation 리소스에 직접 매핑됩니다. L1 구성 요소를 사용하면 특정 AWS CloudFormation 리소스를 나타내는 구성 요소를 가져올 수 있습니다. 그런 다음 구성 인스턴스 내에서 리소스의 속성을 정의합니다.

L1 구성은 AWS 리소스 속성을 정의하는 데 익숙 AWS CloudFormation 하고 완전한 제어가 필요할 때 사용하기 좋습니다.

AWS 구성 라이브러리에서 L1 구성의 이름은 로 시작하고Cfn, 그 뒤에는 에서 나타내는 AWS CloudFormation 리소스의 식별자가 붙습니다. 예를 들어, CfnBucket 구성은 AWS::S3::Bucket AWS CloudFormation 리소스를 나타내는 L1 구성입니다.

L1 구성은 AWS CloudFormation 리소스 사양 에서 생성됩니다. 리소스가 에 있는 경우 AWS CloudFormation에서 L1 구성 AWS CDK 으로 사용할 수 있습니다. 새 리소스 또는 속성을 AWS Construct Library에서 사용하려면 최대 1주일이 걸릴 수 있습니다. 자세한 내용은 AWS CloudFormation 사용 설명서AWS 리소스 및 속성 유형 참조를 참조하세요.

레벨 2(L2) 구성

큐레이팅된 구조체라고도 하는 L2 구조체는 CDK 팀이 신중하게 개발하며 일반적으로 가장 널리 사용되는 구조체 유형입니다. L2 구성은 L1 구성과 마찬가지로 단일 AWS CloudFormation 리소스에 직접 매핑됩니다. L1 구성과 비교하여 L2 구성은 직관적인 의도 기반 를 통해 더 높은 수준의 추상화를 제공합니다API. L2 구성에는 합리적인 기본 속성 구성, 모범 사례 보안 정책이 포함되며, 많은 상용구 코드와 풀 로직이 생성됩니다.

또한 L2 구성은 대부분의 리소스에 도우미 메서드를 제공하여 속성, 권한, 리소스 간 이벤트 기반 상호 작용 등을 더 간단하고 빠르게 정의할 수 있습니다.

s3.Bucket 클래스는 Amazon Simple Storage Service(Amazon S3) 버킷 리소스에 대한 L2 구성의 예입니다.

AWS Construct Library에는 안정적이고 프로덕션용으로 준비된 L2 구성 요소가 포함되어 있습니다. 개발 중인 L2 구성의 경우 실험용으로 지정되고 별도의 모듈에서 제공됩니다.

레벨 3(L3) 구성

패턴이라고도 하는 L3 구성은 가장 높은 수준의 추상화입니다. 각 L3 구성에는 애플리케이션 내에서 특정 작업 또는 서비스를 수행하기 위해 함께 작동하도록 구성된 리소스 모음이 포함될 수 있습니다. L3 구성은 애플리케이션의 특정 사용 사례에 대한 전체 AWS 아키텍처를 생성하는 데 사용됩니다.

전체 시스템 설계 또는 대규모 시스템의 상당 부분을 제공하기 위해 L3 구성은 의견에 따른 기본 속성 구성을 제공합니다. 문제를 해결하고 솔루션을 제공하기 위한 특정 접근 방식을 기반으로 구축됩니다. L3 구성 요소를 사용하면 입력 및 코드를 최소화하면서 여러 리소스를 빠르게 생성하고 구성할 수 있습니다.

ecsPatterns.ApplicationLoadBalancedFargateService 클래스는 Amazon Elastic Container Service(Amazon ECS) 클러스터에서 실행되고 애플리케이션 로드 밸런서가 앞에 있는 AWS Fargate 서비스를 나타내는 L3 구성의 예입니다.

L2 구성과 마찬가지로 프로덕션에 사용할 준비가 된 L3 구성은 AWS 구성 라이브러리에 포함됩니다. 개발 중인 모듈은 별도의 모듈로 제공됩니다.

구성 정의

구성

구성은 구조를 통해 상위 수준 추상화를 정의하는 주요 패턴입니다. 상위 수준 구성은 여러 하위 수준 구성으로 구성할 수 있습니다. 상향식 관점에서는 구성 요소를 사용하여 배포하려는 개별 AWS 리소스를 구성합니다. 필요한 만큼의 수준으로 목적에 편리한 추상화를 사용할 수 있습니다.

구성을 사용하면 재사용 가능한 구성 요소를 정의하고 다른 코드와 같이 공유할 수 있습니다. 예를 들어 팀은 백업, 글로벌 복제, 자동 조정 및 모니터링을 포함하여 Amazon DynamoDB 테이블에 대한 회사의 모범 사례를 구현하는 구성을 정의할 수 있습니다. 팀은 다른 팀과 내부적으로 또는 공개적으로 구성 요소를 공유할 수 있습니다.

팀은 다른 라이브러리 패키지와 같은 구성을 사용할 수 있습니다. 라이브러리가 업데이트되면 개발자는 다른 코드 라이브러리와 마찬가지로 새 버전의 개선 사항 및 버그 수정에 액세스할 수 있습니다.

Initialization(초기화)

구성은 Construct 기본 클래스를 확장하는 클래스로 구현됩니다. 클래스를 인스턴스화하여 구조를 정의합니다. 모든 구성은 초기화될 때 3개의 파라미터를 사용합니다.

  • 범위 - 구성 요소의 상위 또는 소유자입니다. 스택 또는 다른 구성 요소일 수 있습니다. 범위는 구성 트리 의 구성 위치를 결정합니다. 일반적으로 this (self in Python)는 범위에 대한 현재 객체를 나타냅니다.

  • id - 범위 내에서 고유해야 하는 식별자입니다. 식별자는 구성 내에 정의된 모든 의 네임스페이스 역할을 합니다. 리소스 이름 및 AWS CloudFormation 논리적 과 같은 고유 식별자를 생성하는 데 사용됩니다IDs.

    식별자는 범위 내에서만 고유해야 합니다. 이를 통해 구성 요소 및 식별자에 대한 걱정 없이 구성 요소를 인스턴스화하고 재사용할 수 있으며, 구성 요소를 더 높은 수준의 추상화로 구성할 수 있습니다. 또한 범위를 사용하면 한 번에 모든 구성 요소 그룹을 참조할 수 있습니다. 예를 들어 에 태그를 지정하거나 구성 요소를 배포할 위치를 지정하는 것이 있습니다.

  • 프롭 - 언어에 따라 구성 요소의 초기 구성을 정의하는 속성 또는 키워드 인수 집합입니다. 상위 수준 구성은 더 많은 기본값을 제공하며 모든 프롭 요소가 선택 사항인 경우 프롭 파라미터를 완전히 생략할 수 있습니다.

구성

대부분의 구성은 구성의 구성을 정의하는 이름/값 컬렉션인 세 번째 인수(또는 Python에서 키워드 인수)props로 수락합니다. 다음 예제에서는 AWS Key Management Service (AWS KMS) 암호화 및 정적 웹 사이트 호스팅이 활성화된 버킷을 정의합니다. 암호화 키를 명시적으로 지정하지 않으므로 Bucket 구성은 새 를 정의하고 버킷kms.Key과 연결합니다.

TypeScript
new s3.Bucket(this, 'MyEncryptedBucket', { encryption: s3.BucketEncryption.KMS, websiteIndexDocument: 'index.html' });
JavaScript
new s3.Bucket(this, 'MyEncryptedBucket', { encryption: s3.BucketEncryption.KMS, websiteIndexDocument: 'index.html' });
Python
s3.Bucket(self, "MyEncryptedBucket", encryption=s3.BucketEncryption.KMS, website_index_document="index.html")
Java
Bucket.Builder.create(this, "MyEncryptedBucket") .encryption(BucketEncryption.KMS_MANAGED) .websiteIndexDocument("index.html").build();
C#
new Bucket(this, "MyEncryptedBucket", new BucketProps { Encryption = BucketEncryption.KMS_MANAGED, WebsiteIndexDocument = "index.html" });
Go
awss3.NewBucket(stack, jsii.String("MyEncryptedBucket"), &awss3.BucketProps{ Encryption: awss3.BucketEncryption_KMS, WebsiteIndexDocument: jsii.String("index.html"), })

구성 요소와 상호 작용

Constructs는 기본 Construct 클래스를 확장하는 클래스입니다. 구성 요소를 인스턴스화하면 구성 요소 객체는 구성 요소와 상호 작용하고 시스템의 다른 부분에 대한 참조로 전달할 수 있는 일련의 메서드와 속성을 노출합니다.

AWS CDK 프레임워크는 구성 APIs 요소의 에 제한을 두지 않습니다. 작성자는 원하는 모든 를 정의할 수 API 있습니다. 그러나 와 같은 AWS 구성 라이브러리에 포함된 AWS 구성은 지침과 일반적인 패턴을 s3.Bucket따릅니다. 이를 통해 모든 AWS 리소스에서 일관된 경험을 제공합니다.

대부분의 AWS 구성 요소에는 해당 구성 요소에 대한 AWS Identity and Access Management (IAM) 권한을 보안 주체에게 부여하는 데 사용할 수 있는 권한 부여 방법 집합이 있습니다. 다음 예제에서는 IAM 그룹에 Amazon S3 버킷 에서 읽을 수 있는 data-science 권한을 부여합니다raw-data.

TypeScript
const rawData = new s3.Bucket(this, 'raw-data'); const dataScience = new iam.Group(this, 'data-science'); rawData.grantRead(dataScience);
JavaScript
const rawData = new s3.Bucket(this, 'raw-data'); const dataScience = new iam.Group(this, 'data-science'); rawData.grantRead(dataScience);
Python
raw_data = s3.Bucket(self, 'raw-data') data_science = iam.Group(self, 'data-science') raw_data.grant_read(data_science)
Java
Bucket rawData = new Bucket(this, "raw-data"); Group dataScience = new Group(this, "data-science"); rawData.grantRead(dataScience);
C#
var rawData = new Bucket(this, "raw-data"); var dataScience = new Group(this, "data-science"); rawData.GrantRead(dataScience);
Go
rawData := awss3.NewBucket(stack, jsii.String("raw-data"), nil) dataScience := awsiam.NewGroup(stack, jsii.String("data-science"), nil) rawData.GrantRead(dataScience, nil)

또 다른 일반적인 패턴은 AWS 구성 요소가 다른 곳에서 제공된 데이터에서 리소스 속성 중 하나를 설정하는 것입니다. 속성에는 Amazon 리소스 이름(ARNs), 이름 또는 가 포함될 수 있습니다URLs.

다음 코드는 AWS Lambda 함수를 정의하고 환경 변수의 대기열을 통해 Amazon Simple Queue Service(AmazonSQS) 대기열URL과 연결합니다.

TypeScript
const jobsQueue = new sqs.Queue(this, 'jobs'); const createJobLambda = new lambda.Function(this, 'create-job', { runtime: lambda.Runtime.NODEJS_18_X, handler: 'index.handler', code: lambda.Code.fromAsset('./create-job-lambda-code'), environment: { QUEUE_URL: jobsQueue.queueUrl } });
JavaScript
const jobsQueue = new sqs.Queue(this, 'jobs'); const createJobLambda = new lambda.Function(this, 'create-job', { runtime: lambda.Runtime.NODEJS_18_X, handler: 'index.handler', code: lambda.Code.fromAsset('./create-job-lambda-code'), environment: { QUEUE_URL: jobsQueue.queueUrl } });
Python
jobs_queue = sqs.Queue(self, "jobs") create_job_lambda = lambda_.Function(self, "create-job", runtime=lambda_.Runtime.NODEJS_18_X, handler="index.handler", code=lambda_.Code.from_asset("./create-job-lambda-code"), environment=dict( QUEUE_URL=jobs_queue.queue_url ) )
Java
final Queue jobsQueue = new Queue(this, "jobs"); Function createJobLambda = Function.Builder.create(this, "create-job") .handler("index.handler") .code(Code.fromAsset("./create-job-lambda-code")) .environment(java.util.Map.of( // Map.of is Java 9 or later "QUEUE_URL", jobsQueue.getQueueUrl()) .build();
C#
var jobsQueue = new Queue(this, "jobs"); var createJobLambda = new Function(this, "create-job", new FunctionProps { Runtime = Runtime.NODEJS_18_X, Handler = "index.handler", Code = Code.FromAsset(@".\create-job-lambda-code"), Environment = new Dictionary<string, string> { ["QUEUE_URL"] = jobsQueue.QueueUrl } });
Go
createJobLambda := awslambda.NewFunction(stack, jsii.String("create-job"), &awslambda.FunctionProps{ Runtime: awslambda.Runtime_NODEJS_18_X(), Handler: jsii.String("index.handler"), Code: awslambda.Code_FromAsset(jsii.String(".\\create-job-lambda-code"), nil), Environment: &map[string]*string{ "QUEUE_URL": jsii.String(*jobsQueue.QueueUrl()), }, })

AWS 구성 라이브러리의 가장 일반적인 API 패턴에 대한 자세한 내용은 섹션을 참조하세요리소스 및 AWS CDK.

앱 및 스택 구성

AWS 구성 라이브러리의 AppStack 클래스는 고유한 구성 요소입니다. 다른 구성과 비교하여 리소스를 자체 AWS 적으로 구성하지 않습니다. 대신 다른 구성에 대한 컨텍스트를 제공하는 데 사용됩니다. 리소스를 나타내는 AWS 모든 구성은 Stack 구성의 범위 내에서 직접 또는 간접적으로 정의되어야 합니다. Stack 구성은 App 구성의 범위 내에서 정의됩니다.

CDK 앱에 대한 자세한 내용은 섹션을 참조하세요AWS CDK 앱. CDK 스택에 대한 자세한 내용은 섹션을 참조하세요AWS CDK 스택.

다음 예제에서는 단일 스택이 있는 앱을 정의합니다. 스택 내에서 L2 구성은 Amazon S3 버킷 리소스를 구성하는 데 사용됩니다.

TypeScript
import { App, Stack, StackProps } from 'aws-cdk-lib'; import * as s3 from 'aws-cdk-lib/aws-s3'; class HelloCdkStack extends Stack { constructor(scope: App, id: string, props?: StackProps) { super(scope, id, props); new s3.Bucket(this, 'MyFirstBucket', { versioned: true }); } } const app = new App(); new HelloCdkStack(app, "HelloCdkStack");
JavaScript
const { App , Stack } = require('aws-cdk-lib'); const s3 = require('aws-cdk-lib/aws-s3'); class HelloCdkStack extends Stack { constructor(scope, id, props) { super(scope, id, props); new s3.Bucket(this, 'MyFirstBucket', { versioned: true }); } } const app = new App(); new HelloCdkStack(app, "HelloCdkStack");
Python
from aws_cdk import App, Stack import aws_cdk.aws_s3 as s3 from constructs import Construct class HelloCdkStack(Stack): def __init__(self, scope: Construct, id: str, **kwargs) -> None: super().__init__(scope, id, **kwargs) s3.Bucket(self, "MyFirstBucket", versioned=True) app = App() HelloCdkStack(app, "HelloCdkStack")
Java

HelloCdkStack.java 파일에 정의된 스택:

import software.constructs.Construct; import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; import software.amazon.awscdk.services.s3.*; public class HelloCdkStack extends Stack { public HelloCdkStack(final Construct scope, final String id) { this(scope, id, null); } public HelloCdkStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); Bucket.Builder.create(this, "MyFirstBucket") .versioned(true).build(); } }

HelloCdkApp.java 파일에 정의된 앱:

import software.amazon.awscdk.App; import software.amazon.awscdk.StackProps; public class HelloCdkApp { public static void main(final String[] args) { App app = new App(); new HelloCdkStack(app, "HelloCdkStack", StackProps.builder() .build()); app.synth(); } }
C#
using Amazon.CDK; using Amazon.CDK.AWS.S3; namespace HelloCdkApp { internal static class Program { public static void Main(string[] args) { var app = new App(); new HelloCdkStack(app, "HelloCdkStack"); app.Synth(); } } public class HelloCdkStack : Stack { public HelloCdkStack(Construct scope, string id, IStackProps props=null) : base(scope, id, props) { new Bucket(this, "MyFirstBucket", new BucketProps { Versioned = true }); } } }
Go
func NewHelloCdkStack(scope constructs.Construct, id string, props *HelloCdkStackProps) awscdk.Stack { var sprops awscdk.StackProps if props != nil { sprops = props.StackProps } stack := awscdk.NewStack(scope, &id, &sprops) awss3.NewBucket(stack, jsii.String("MyFirstBucket"), &awss3.BucketProps{ Versioned: jsii.Bool(true), }) return stack }

구성 요소 작업

L1 구성 작업

L1 구성은 개별 AWS CloudFormation 리소스에 직접 매핑합니다. 리소스의 필수 구성을 제공해야 합니다.

이 예제에서는 CfnBucket L1 구성 요소를 사용하여 bucket 객체를 생성합니다.

TypeScript
const bucket = new s3.CfnBucket(this, "amzn-s3-demo-bucket", { bucketName: "amzn-s3-demo-bucket" });
JavaScript
const bucket = new s3.CfnBucket(this, "amzn-s3-demo-bucket", { bucketName: "amzn-s3-demo-bucket" });
Python
bucket = s3.CfnBucket(self, "amzn-s3-demo-bucket", bucket_name="amzn-s3-demo-bucket")
Java
CfnBucket bucket = new CfnBucket.Builder().bucketName("amzn-s3-demo-bucket").build();
C#
var bucket = new CfnBucket(this, "amzn-s3-demo-bucket", new CfnBucketProps { BucketName= "amzn-s3-demo-bucket" });
Go
awss3.NewCfnBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.CfnBucketProps{ BucketName: jsii.String("amzn-s3-demo-bucket"), })

부울, 문자열, 숫자 또는 컨테이너가 아닌 구성 속성은 지원되는 언어로 다르게 처리됩니다.

TypeScript
const bucket = new s3.CfnBucket(this, "amzn-s3-demo-bucket", { bucketName: "amzn-s3-demo-bucket", corsConfiguration: { corsRules: [{ allowedOrigins: ["*"], allowedMethods: ["GET"] }] } });
JavaScript
const bucket = new s3.CfnBucket(this, "amzn-s3-demo-bucket", { bucketName: "amzn-s3-demo-bucket", corsConfiguration: { corsRules: [{ allowedOrigins: ["*"], allowedMethods: ["GET"] }] } });
Python

Python에서 이러한 속성은 L1 구성의 내부 클래스로 정의된 유형으로 표시됩니다. 예를 들어 cors_configuration의 선택적 속성에는 유형의 래퍼가 CfnBucket 필요합니다CfnBucket.CorsConfigurationProperty. 여기서는 CfnBucket 인스턴스cors_configuration에 대해 정의합니다.

bucket = CfnBucket(self, "amzn-s3-demo-bucket", bucket_name="amzn-s3-demo-bucket", cors_configuration=CfnBucket.CorsConfigurationProperty( cors_rules=[CfnBucket.CorsRuleProperty( allowed_origins=["*"], allowed_methods=["GET"] )] ) )
Java

Java에서 이러한 속성은 L1 구성의 내부 클래스로 정의된 유형으로 표시됩니다. 예를 들어 corsConfiguration의 선택적 속성에는 유형의 래퍼가 CfnBucket 필요합니다CfnBucket.CorsConfigurationProperty. 여기서는 CfnBucket 인스턴스corsConfiguration에 대해 정의합니다.

CfnBucket bucket = CfnBucket.Builder.create(this, "amzn-s3-demo-bucket") .bucketName("amzn-s3-demo-bucket") .corsConfiguration(new CfnBucket.CorsConfigurationProperty.Builder() .corsRules(Arrays.asList(new CfnBucket.CorsRuleProperty.Builder() .allowedOrigins(Arrays.asList("*")) .allowedMethods(Arrays.asList("GET")) .build())) .build()) .build();
C#

C#에서 이러한 속성은 L1 구성의 내부 클래스로 정의된 유형으로 표시됩니다. 예를 들어 CorsConfiguration의 선택적 속성에는 유형의 래퍼가 CfnBucket 필요합니다CfnBucket.CorsConfigurationProperty. 여기서는 CfnBucket 인스턴스CorsConfiguration에 대해 정의합니다.

var bucket = new CfnBucket(this, "amzn-s3-demo-bucket", new CfnBucketProps { BucketName = "amzn-s3-demo-bucket", CorsConfiguration = new CfnBucket.CorsConfigurationProperty { CorsRules = new object[] { new CfnBucket.CorsRuleProperty { AllowedOrigins = new string[] { "*" }, AllowedMethods = new string[] { "GET" }, } } } });
Go

Go에서 이러한 유형은 L1 구성의 이름, 밑줄 및 속성 이름을 사용하여 이름이 지정됩니다. 예를 들어 CorsConfiguration의 선택적 속성에는 유형의 래퍼가 CfnBucket 필요합니다CfnBucket_CorsConfigurationProperty. 여기서는 CfnBucket 인스턴스CorsConfiguration에 대해 정의합니다.

awss3.NewCfnBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.CfnBucketProps{ BucketName: jsii.String("amzn-s3-demo-bucket"), CorsConfiguration: &awss3.CfnBucket_CorsConfigurationProperty{ CorsRules: []awss3.CorsRule{ awss3.CorsRule{ AllowedOrigins: jsii.Strings("*"), AllowedMethods: &[]awss3.HttpMethods{"GET"}, }, }, }, })
중요

L2 속성 유형은 L2L1 구성과 함께 사용할 수 없으며, 그 반대의 경우도 마찬가지입니다. L1 구성으로 작업할 때는 항상 사용 중인 L1 구성에 정의된 유형을 사용합니다. 다른 L1 구성의 유형을 사용하지 마세요(일부는 이름이 동일할 수 있지만 유형이 동일하지는 않음).

언어별 API 참조 중 일부는 현재 L1 속성 유형 경로에 오류가 있거나 이러한 클래스를 전혀 문서화하지 않습니다. 이 문제를 곧 해결하겠습니다. 그 동안 이러한 유형은 항상 사용 중인 L1 구성의 내부 클래스라는 점을 기억하세요.

L2 구성 작업

다음 예제에서는 Bucket L2 구성에서 객체를 생성하여 Amazon S3 버킷을 정의합니다.

TypeScript
import * as s3 from 'aws-cdk-lib/aws-s3'; // "this" is HelloCdkStack new s3.Bucket(this, 'MyFirstBucket', { versioned: true });
JavaScript
const s3 = require('aws-cdk-lib/aws-s3'); // "this" is HelloCdkStack new s3.Bucket(this, 'MyFirstBucket', { versioned: true });
Python
import aws_cdk.aws_s3 as s3 # "self" is HelloCdkStack s3.Bucket(self, "MyFirstBucket", versioned=True)
Java
import software.amazon.awscdk.services.s3.*; public class HelloCdkStack extends Stack { public HelloCdkStack(final Construct scope, final String id) { this(scope, id, null); } public HelloCdkStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); Bucket.Builder.create(this, "MyFirstBucket") .versioned(true).build(); } }
C#
using Amazon.CDK.AWS.S3; // "this" is HelloCdkStack new Bucket(this, "MyFirstBucket", new BucketProps { Versioned = true });
Go
import ( "github.com/aws/aws-cdk-go/awscdk/v2/awss3" "github.com/aws/jsii-runtime-go" ) // stack is HelloCdkStack awss3.NewBucket(stack, jsii.String("MyFirstBucket"), &awss3.BucketProps{ Versioned: jsii.Bool(true), })>

MyFirstBucket 는 가 AWS CloudFormation 생성하는 버킷의 이름이 아닙니다. CDK 앱 컨텍스트 내에서 새 구성에 지정된 논리적 식별자입니다. physicalName 값은 AWS CloudFormation 리소스의 이름을 지정하는 데 사용됩니다.

타사 구성 요소 작업

Construct Hub는 AWS, 타사 및 오픈 소스 CDK 커뮤니티에서 추가 구성 요소를 발견하는 데 도움이 되는 리소스입니다.

자체 구성 요소 작성

기존 구성 요소를 사용하는 것 외에도 자체 구성 요소를 작성하고 누구나 앱에서 사용할 수 있도록 할 수도 있습니다. 모든 구성은 에서 동일합니다 AWS CDK. AWS Construct Library의 구성은 를 통해 게시된 타사 라이브러리의 구성과 동일하게 처리됩니다.NPM, Maven, 또는 PyPI. 회사의 내부 패키지 리포지토리에 게시된 구조도 동일한 방식으로 처리됩니다.

새 구성을 선언하려면 constructs 패키지에서 구성 기본 클래스를 확장하는 클래스를 생성한 다음 초기화기 인수의 패턴을 따릅니다.

다음 예제에서는 Amazon S3 버킷을 나타내는 구성을 선언하는 방법을 보여줍니다. S3 버킷은 누군가 파일을 업로드할 때마다 Amazon Simple Notification Service(Amazon SNS) 알림을 보냅니다.

TypeScript
export interface NotifyingBucketProps { prefix?: string; } export class NotifyingBucket extends Construct { constructor(scope: Construct, id: string, props: NotifyingBucketProps = {}) { super(scope, id); const bucket = new s3.Bucket(this, 'bucket'); const topic = new sns.Topic(this, 'topic'); bucket.addObjectCreatedNotification(new s3notify.SnsDestination(topic), { prefix: props.prefix }); } }
JavaScript
class NotifyingBucket extends Construct { constructor(scope, id, props = {}) { super(scope, id); const bucket = new s3.Bucket(this, 'bucket'); const topic = new sns.Topic(this, 'topic'); bucket.addObjectCreatedNotification(new s3notify.SnsDestination(topic), { prefix: props.prefix }); } } module.exports = { NotifyingBucket }
Python
class NotifyingBucket(Construct): def __init__(self, scope: Construct, id: str, *, prefix=None): super().__init__(scope, id) bucket = s3.Bucket(self, "bucket") topic = sns.Topic(self, "topic") bucket.add_object_created_notification(s3notify.SnsDestination(topic), s3.NotificationKeyFilter(prefix=prefix))
Java
public class NotifyingBucket extends Construct { public NotifyingBucket(final Construct scope, final String id) { this(scope, id, null, null); } public NotifyingBucket(final Construct scope, final String id, final BucketProps props) { this(scope, id, props, null); } public NotifyingBucket(final Construct scope, final String id, final String prefix) { this(scope, id, null, prefix); } public NotifyingBucket(final Construct scope, final String id, final BucketProps props, final String prefix) { super(scope, id); Bucket bucket = new Bucket(this, "bucket"); Topic topic = new Topic(this, "topic"); if (prefix != null) bucket.addObjectCreatedNotification(new SnsDestination(topic), NotificationKeyFilter.builder().prefix(prefix).build()); } }
C#
public class NotifyingBucketProps : BucketProps { public string Prefix { get; set; } } public class NotifyingBucket : Construct { public NotifyingBucket(Construct scope, string id, NotifyingBucketProps props = null) : base(scope, id) { var bucket = new Bucket(this, "bucket"); var topic = new Topic(this, "topic"); bucket.AddObjectCreatedNotification(new SnsDestination(topic), new NotificationKeyFilter { Prefix = props?.Prefix }); } }
Go
type NotifyingBucketProps struct { awss3.BucketProps Prefix *string } func NewNotifyingBucket(scope constructs.Construct, id *string, props *NotifyingBucketProps) awss3.Bucket { var bucket awss3.Bucket if props == nil { bucket = awss3.NewBucket(scope, jsii.String(*id+"Bucket"), nil) } else { bucket = awss3.NewBucket(scope, jsii.String(*id+"Bucket"), &props.BucketProps) } topic := awssns.NewTopic(scope, jsii.String(*id+"Topic"), nil) if props == nil { bucket.AddObjectCreatedNotification(awss3notifications.NewSnsDestination(topic)) } else { bucket.AddObjectCreatedNotification(awss3notifications.NewSnsDestination(topic), &awss3.NotificationKeyFilter{ Prefix: props.Prefix, }) } return bucket }
참고

NotifyingBucket 구성은 에서Bucket가 아닌 에서 상속됩니다Construct. 상속이 아닌 구성을 사용하여 Amazon S3 버킷과 Amazon SNS 주제를 함께 번들링합니다. 일반적으로 구성은 AWS CDK 구성 요소를 개발할 때 상속보다 선호됩니다.

NotifyingBucket 생성기의 일반적인 구성 서명은 scope, id및 입니다props. 마지막 인수인 는 모든 프롭props이 선택 사항이므로 선택 사항입니다(기본값 가 됨{}). (기본 Construct 클래스는 props 인수를 취하지 않습니다.) 를 사용하지 않고 앱에서 이 구성의 인스턴스를 정의할 수 있습니다props. 예를 들면 다음과 같습니다.

TypeScript
new NotifyingBucket(this, 'MyNotifyingBucket');
JavaScript
new NotifyingBucket(this, 'MyNotifyingBucket');
Python
NotifyingBucket(self, "MyNotifyingBucket")
Java
new NotifyingBucket(this, "MyNotifyingBucket");
C#
new NotifyingBucket(this, "MyNotifyingBucket");
Go
NewNotifyingBucket(stack, jsii.String("MyNotifyingBucket"), nil)

또는 props (Java에서 추가 파라미터)를 사용하여 필터링할 경로 접두사를 지정할 수 있습니다. 예를 들어,

TypeScript
new NotifyingBucket(this, 'MyNotifyingBucket', { prefix: 'images/' });
JavaScript
new NotifyingBucket(this, 'MyNotifyingBucket', { prefix: 'images/' });
Python
NotifyingBucket(self, "MyNotifyingBucket", prefix="images/")
Java
new NotifyingBucket(this, "MyNotifyingBucket", "/images");
C#
new NotifyingBucket(this, "MyNotifyingBucket", new NotifyingBucketProps { Prefix = "/images" });
Go
NewNotifyingBucket(stack, jsii.String("MyNotifyingBucket"), &NotifyingBucketProps{ Prefix: jsii.String("images/"), })

일반적으로 구성 요소에 일부 속성 또는 메서드를 노출하는 것이 좋습니다. 구성 요소 사용자가 구독할 수 없으므로 구성 요소 뒤에 주제를 숨기는 것은 그리 유용하지 않습니다. 다음 예제와 같이 topic 속성을 추가하면 소비자가 내부 주제에 액세스할 수 있습니다.

TypeScript
export class NotifyingBucket extends Construct { public readonly topic: sns.Topic; constructor(scope: Construct, id: string, props: NotifyingBucketProps) { super(scope, id); const bucket = new s3.Bucket(this, 'bucket'); this.topic = new sns.Topic(this, 'topic'); bucket.addObjectCreatedNotification(new s3notify.SnsDestination(this.topic), { prefix: props.prefix }); } }
JavaScript
class NotifyingBucket extends Construct { constructor(scope, id, props) { super(scope, id); const bucket = new s3.Bucket(this, 'bucket'); this.topic = new sns.Topic(this, 'topic'); bucket.addObjectCreatedNotification(new s3notify.SnsDestination(this.topic), { prefix: props.prefix }); } } module.exports = { NotifyingBucket };
Python
class NotifyingBucket(Construct): def __init__(self, scope: Construct, id: str, *, prefix=None, **kwargs): super().__init__(scope, id) bucket = s3.Bucket(self, "bucket") self.topic = sns.Topic(self, "topic") bucket.add_object_created_notification(s3notify.SnsDestination(self.topic), s3.NotificationKeyFilter(prefix=prefix))
Java
public class NotifyingBucket extends Construct { public Topic topic = null; public NotifyingBucket(final Construct scope, final String id) { this(scope, id, null, null); } public NotifyingBucket(final Construct scope, final String id, final BucketProps props) { this(scope, id, props, null); } public NotifyingBucket(final Construct scope, final String id, final String prefix) { this(scope, id, null, prefix); } public NotifyingBucket(final Construct scope, final String id, final BucketProps props, final String prefix) { super(scope, id); Bucket bucket = new Bucket(this, "bucket"); topic = new Topic(this, "topic"); if (prefix != null) bucket.addObjectCreatedNotification(new SnsDestination(topic), NotificationKeyFilter.builder().prefix(prefix).build()); } }
C#
public class NotifyingBucket : Construct { public readonly Topic topic; public NotifyingBucket(Construct scope, string id, NotifyingBucketProps props = null) : base(scope, id) { var bucket = new Bucket(this, "bucket"); topic = new Topic(this, "topic"); bucket.AddObjectCreatedNotification(new SnsDestination(topic), new NotificationKeyFilter { Prefix = props?.Prefix }); } }
Go

Go에서 이 작업을 수행하려면 약간의 추가 배관이 필요합니다. 원래 NewNotifyingBucket 함수는 를 반환했습니다awss3.Bucket. NotifyingBucket 구조를 생성하여 topic 멤버를 Bucket 포함하도록 확장해야 합니다. 그러면 함수가 이 유형을 반환합니다.

type NotifyingBucket struct { awss3.Bucket topic awssns.Topic } func NewNotifyingBucket(scope constructs.Construct, id *string, props *NotifyingBucketProps) NotifyingBucket { var bucket awss3.Bucket if props == nil { bucket = awss3.NewBucket(scope, jsii.String(*id+"Bucket"), nil) } else { bucket = awss3.NewBucket(scope, jsii.String(*id+"Bucket"), &props.BucketProps) } topic := awssns.NewTopic(scope, jsii.String(*id+"Topic"), nil) if props == nil { bucket.AddObjectCreatedNotification(awss3notifications.NewSnsDestination(topic)) } else { bucket.AddObjectCreatedNotification(awss3notifications.NewSnsDestination(topic), &awss3.NotificationKeyFilter{ Prefix: props.Prefix, }) } var nbucket NotifyingBucket nbucket.Bucket = bucket nbucket.topic = topic return nbucket }

이제 소비자는 다음과 같이 주제를 구독할 수 있습니다.

TypeScript
const queue = new sqs.Queue(this, 'NewImagesQueue'); const images = new NotifyingBucket(this, '/images'); images.topic.addSubscription(new sns_sub.SqsSubscription(queue));
JavaScript
const queue = new sqs.Queue(this, 'NewImagesQueue'); const images = new NotifyingBucket(this, '/images'); images.topic.addSubscription(new sns_sub.SqsSubscription(queue));
Python
queue = sqs.Queue(self, "NewImagesQueue") images = NotifyingBucket(self, prefix="Images") images.topic.add_subscription(sns_sub.SqsSubscription(queue))
Java
NotifyingBucket images = new NotifyingBucket(this, "MyNotifyingBucket", "/images"); images.topic.addSubscription(new SqsSubscription(queue));
C#
var queue = new Queue(this, "NewImagesQueue"); var images = new NotifyingBucket(this, "MyNotifyingBucket", new NotifyingBucketProps { Prefix = "/images" }); images.topic.AddSubscription(new SqsSubscription(queue));
Go
queue := awssqs.NewQueue(stack, jsii.String("NewImagesQueue"), nil) images := NewNotifyingBucket(stack, jsii.String("MyNotifyingBucket"), &NotifyingBucketProps{ Prefix: jsii.String("/images"), }) images.topic.AddSubscription(awssnssubscriptions.NewSqsSubscription(queue, nil))

자세히 알아보기

다음 비디오에서는 CDK 구성에 대한 포괄적인 개요를 제공하고 CDK 앱에서 구성 요소를 사용하는 방법을 설명합니다.