v AWS CDK 2 개발자 안내서입니다. 이전 CDK v1은 2022년 6월 1일에 유지 관리에 들어갔으며 2023년 6월 1일에 지원이 종료되었습니다.
기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
구조체는 AWS Cloud Development Kit (AWS CDK) 애플리케이션의 기본 구성 요소입니다. 구문은 애플리케이션 내에서 하나 이상의 AWS CloudFormation 리소스와 해당 구성을 나타내는 구성 요소입니다. 구문을 가져오고 구성하여 애플리케이션을 하나씩 빌드합니다.
구문 가져오기 및 사용
구문은 AWS Construct Library에서 CDK 애플리케이션으로 가져오는 클래스입니다. 구문을 직접 생성하고 배포하거나 타사 개발자가 생성한 구문을 사용할 수도 있습니다.
구문은 CPM(Construct Programming Model)의 일부이며 Terraform(CDKtf), CDK for Kubernetes(CDK8s), Projen 등의 다른 도구와 함께 사용할 수 있습니다.
많은 타사에서 AWS CDK와 호환되는 구문을 게시했습니다. Construct Hub
구문 수준
Construct Library의 AWS 구문은 세 가지 수준으로 분류됩니다. 각 수준은 점점 더 상위 추상화를 제공합니다. 추상화 수준이 높을수록 구성이 더 쉬워지고 전문 지식이 덜 필요합니다. 추상화 수준이 낮을수록 더 많은 사용자 지정이 가능하고 전문 지식이 더 많이 필요합니다.
- 수준 1(L1) 구문
-
CFN 리소스라고도 하는 L1 구문은 최하위 구문이며 추상화를 제공하지 않습니다. 각 L1 구문은 단일 AWS CloudFormation 리소스에 직접 매핑됩니다. L1 구문을 사용하면 특정 AWS CloudFormation 리소스를 나타내는 구문을 가져옵니다. 그런 다음 구문 인스턴스 내에서 리소스의 속성을 정의합니다.
L1 구문은에 익숙 AWS CloudFormation 하고 AWS 리소스 속성 정의를 완벽하게 제어해야 할 때 사용하기에 적합합니다.
AWS Construct Library에서 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 구문은 문제를 해결하고 솔루션을 제공하기 위한 특정 접근 방식을 중심으로 빌드됩니다. L3 구문을 사용하면 입력과 코드를 최소화하면서 여러 리소스를 빠르게 생성하고 구성할 수 있습니다.
ecsPatterns.ApplicationLoadBalancedFargateService
클래스는 Amazon Elastic Container Service(Amazon ECS) 클러스터에서 실행되고 애플리케이션 로드 밸런서가 앞에 있는 AWS Fargate 서비스를 나타내는 L3 구문의 예입니다.L2 구문과 마찬가지로 프로덕션에 사용할 준비가 된 L3 구문은 AWS Construct Library에 포함됩니다. 개발 중인 L3 구문은 별도의 모듈로 제공됩니다.
구문 정의
구성
구성은 구문을 통해 상위 추상화를 정의하기 위한 주요 패턴입니다. 하위 수준의 여러 구문으로 상위 구문을 구성할 수 있습니다. 상향식 관점에서는 구문을 사용하여 배포하려는 개별 AWS 리소스를 구성합니다. 필요한 만큼의 수준으로 목적에 맞는 편리한 추상화를 사용할 수 있습니다.
구성을 사용하면 재사용 가능한 구성 요소를 정의하고 다른 코드와 같이 공유할 수 있습니다. 예를 들어, 팀은 백업, 글로벌 복제, 자동 규모 조정 및 모니터링을 포함하여 Amazon DynamoDB 테이블에 대한 회사의 모범 사례를 구현하는 구문을 정의할 수 있습니다. 팀은 다른 팀과 내부적으로 또는 공개적으로 구문을 공유할 수 있습니다.
팀은 다른 라이브러리 패키지와 마찬가지로 구문을 사용할 수 있습니다. 라이브러리가 업데이트되면 개발자는 다른 코드 라이브러리와 마찬가지로 새 버전의 개선 사항과 버그 수정에 액세스할 수 있습니다.
Initialization(초기화)
구성은 Construct
기본 클래스를 확장하는 클래스로 구현됩니다. 클래스를 인스턴스화하여 구문을 정의합니다. 모든 구성은 초기화될 때 3개의 파라미터를 사용합니다.
-
scope - 구문의 부모 또는 소유자입니다. 스택 또는 다른 구문일 수 있습니다. Scope는 구문 트리에서 구문의 위치를 결정합니다. 일반적으로 scope에는 현재 객체를 나타내는
this
(Python의 경우self
)를 전달해야 합니다. -
id - scope 내에서 고유해야 하는 식별자입니다. 식별자는 구문 내에 정의된 모든 것의 네임스페이스 역할을 하며, 리소스 이름 및 AWS CloudFormation 논리적 IDs와 같은 고유 식별자를 생성하는 데 사용됩니다.
식별자는 scope 내에서만 고유해야 합니다. 이를 통해 포함된 구문과 식별자에 대한 걱정 없이 구문을 인스턴스화하고 재사용할 수 있으며, 구문을 상위 추상화로 구성할 수 있습니다. 또한 scope를 사용하면 여러 구문 그룹을 모두 한 번에 참조할 수 있습니다. 태깅 또는 구문이 배포될 위치 지정 등을 예로 들 수 있습니다.
-
props - 언어에 따라 구문의 초기 구성을 정의하는 속성 또는 키워드 인수 세트입니다. 상위 구문은 더 많은 기본값을 제공하며 모든 prop 요소가 선택 사항인 경우 props 파라미터를 완전히 생략할 수 있습니다.
구성
대부분의 구문은 구문의 구성을 정의하는 이름/값 컬렉션인 props
를 세 번째 인수 또는 키워드 인수(Python의 경우)로 수락합니다. 다음 예제에서는 AWS Key Management Service (AWS KMS) 암호화 및 정적 웹 사이트 호스팅이 활성화된 버킷을 정의합니다. Bucket
구문은 암호화 키를 명시적으로 지정하지 않기 때문에 새로운 kms.Key
를 정의하고 버킷과 연결합니다.
new s3.Bucket(this, 'MyEncryptedBucket', {
encryption: s3.BucketEncryption.KMS,
websiteIndexDocument: 'index.html'
});
구문과 상호 작용
구문은 기본 Construct 클래스를 확장하는 클래스입니다. 구문을 인스턴스화하면 구문 객체는 일련의 메서드와 속성을 노출하며, 이를 통해 구문과 상호 작용하고 이를 시스템의 다른 부분에 대한 참조로 전달할 수 있습니다.
AWS CDK 프레임워크는 구문APIs에 제한을 두지 않습니다. 작성자는 원하는 모든 API를 정의할 수 있습니다. 그러나와 같이 AWS Construct Library에 포함된 AWS 구문은 지침과 일반적인 패턴을 s3.Bucket
따릅니다. 이렇게 하면 모든 AWS 리소스에서 일관된 경험을 얻을 수 있습니다.
대부분의 AWS 구문에는 해당 구문에 대한 AWS Identity and Access Management (IAM) 권한을 보안 주체에게 부여하는 데 사용할 수 있는 권한 부여 방법 세트가 있습니다. 다음 예에서는 IAM 그룹 data-science
에 Amazon S3 버킷 raw-data
에서 읽을 수 있는 권한을 부여합니다.
const rawData = new s3.Bucket(this, 'raw-data');
const dataScience = new iam.Group(this, 'data-science');
rawData.grantRead(dataScience);
또 다른 일반적인 패턴은 AWS 구문이 다른 곳에서 제공된 데이터에서 리소스 속성 중 하나를 설정하는 것입니다. 속성에는 Amazon 리소스 이름(ARN), 이름 또는 URL이 포함될 수 있습니다.
다음 코드는 AWS Lambda 함수를 정의하고 환경 변수의 대기열 URL을 통해 Amazon Simple Queue Service(Amazon SQS) 대기열과 연결합니다.
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
}
});
AWS Construct Library의 가장 일반적인 API 패턴에 대한 자세한 내용은 섹션을 참조하세요리소스 및 AWS CDK.
앱 및 스택 구문
AWS Construct Library의 App
및 Stack
클래스는 고유한 구문입니다. 다른 구문과 비교하여 AWS 리소스를 자체적으로 구성하지 않습니다. 대신 다른 구문에 대한 컨텍스트를 제공하는 데 사용됩니다. AWS
리소스를 나타내는 모든 구문은 Stack
구문의 범위 내에 직접 또는 간접적으로 정의되어야 합니다. Stack
구문은 App
구문의 범위 내에 정의됩니다.
CDK 앱에 대해 자세히 알아보려면 AWS CDK 앱 섹션을 참조하세요. CDK 스택에 대해 자세히 알아보려면 AWS CDK 스택 소개 섹션을 참조하세요.
다음 예에서는 단일 스택으로 앱을 정의합니다. 스택 내에서 L2 구문은 Amazon S3 버킷 리소스를 구성하는 데 사용됩니다.
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");
구문 작업
L1 구문 작업
L1 구문은 개별 AWS CloudFormation 리소스에 직접 매핑됩니다. 리소스의 필수 구성을 제공해야 합니다.
이 예에서는 CfnBucket
L1 구문을 사용하여 bucket
객체를 생성합니다.
const bucket = new s3.CfnBucket(this, "amzn-s3-demo-bucket", {
bucketName: "amzn-s3-demo-bucket"
});
간단한 부울, 문자열, 숫자 또는 컨테이너가 아닌 구문 속성은 지원되는 언어로 다르게 처리됩니다.
const bucket = new s3.CfnBucket(this, "amzn-s3-demo-bucket", {
bucketName: "amzn-s3-demo-bucket",
corsConfiguration: {
corsRules: [{
allowedOrigins: ["*"],
allowedMethods: ["GET"]
}]
}
});
중요
L2 속성 유형을 L1 구문과 함께 사용할 수 없으며 그 반대의 경우도 마찬가지입니다. L1 구문으로 작업할 때는 항상 사용 중인 L1 구문에 정의된 유형을 사용하세요. 다른 L1 구문의 유형을 사용하지 마세요. 일부는 이름이 동일할 수 있지만 유형이 동일하지는 않습니다.
언어별 API 참조 중 일부는 현재 L1 속성 유형에 대한 경로에 오류가 있거나 이러한 클래스를 전혀 문서화하지 않습니다. 이 문제는 곧 수정될 예정입니다 그동안 이러한 유형은 항상 함께 사용되는 L1 구문의 내부 클래스라는 점을 기억하세요.
L2 구문 작업
다음 예에서는 Bucket
L2 구문에서 객체를 생성하여 Amazon S3 버킷을 정의합니다.
import * as s3 from 'aws-cdk-lib/aws-s3';
// "this" is HelloCdkStack
new s3.Bucket(this, 'MyFirstBucket', {
versioned: true
});
MyFirstBucket
는가 AWS CloudFormation 생성하는 버킷의 이름이 아닙니다. 이는 CDK 앱의 컨텍스트 내에서 새 구문에 지정된 논리적 식별자입니다. physicalName 값은 AWS CloudFormation 리소스의 이름을 지정하는 데 사용됩니다.
타사 구문 작업
Construct Hub
자체 구문 작성
기존 구문을 사용하는 것 외에도 자체 구문을 작성하고 누구나 앱에서 사용하도록 할 수도 있습니다. AWS CDK에서 모든 구문은 동일합니다. AWS Construct Library의 구문은 NPM, Maven또는를 통해 게시된 타사 라이브러리의 구문과 동일하게 처리됩니다PyPI. 회사의 내부 패키지 리포지토리에 게시된 구문도 동일한 방식으로 처리됩니다.
새 구문을 선언하려면 constructs
패키지에서 구문 기본 클래스를 확장하는 클래스를 생성한 다음 이니셜라이저 인수의 패턴을 따릅니다.
다음 예에서는 Amazon S3 버킷을 나타내는 구문을 선언하는 방법을 보여줍니다. S3 버킷은 누군가 파일을 업로드할 때마다 Amazon Simple Notification Service(Amazon SNS) 알림을 보냅니다.
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 });
}
}
참고
NotifyingBucket
구문은 Bucket
이 아닌 Construct
에서 상속됩니다. Amazon S3 버킷과 Amazon SNS 주제를 함께 번들링하기 위해 상속이 아닌 구성을 사용하고 있습니다. 일반적으로 구성은 AWS CDK 구문을 개발할 때 상속보다 선호됩니다.
NotifyingBucket
생성자는 scope
, id
, props
라는 일반적인 구문 서명을 갖습니다. 마지막 인수인 props
는 선택 사항입니다(기본값 {}
가져오기). 모든 props가 선택 사항이기 때문입니다. 기본 Construct
클래스는 props
인수를 취하지 않습니다. props
없이 앱에서 이 구문의 인스턴스를 정의할 수 있습니다. 예를 들면 다음과 같습니다.
new NotifyingBucket(this, 'MyNotifyingBucket');
또는 props
(Java의 경우 추가 파라미터)를 사용하여 필터링할 경로 접두사를 지정할 수 있습니다. 예를 들면 다음과 같습니다.
new NotifyingBucket(this, 'MyNotifyingBucket', { prefix: 'images/' });
일반적으로 구문에서 일부 속성이나 메서드를 노출하고 싶을 수도 있습니다. 구문 사용자가 토픽을 구독할 수 없으므로 구문 뒤에 토픽을 숨기는 것은 별로 유용하지 않습니다. 다음 예와 같이 topic
속성을 추가하면 소비자가 내부 주제에 액세스할 수 있습니다.
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 });
}
}
이제 소비자는 주제를 구독할 수 있습니다. 예를 들면 다음과 같습니다.
const queue = new sqs.Queue(this, 'NewImagesQueue');
const images = new NotifyingBucket(this, '/images');
images.topic.addSubscription(new sns_sub.SqsSubscription(queue));
자세히 알아보기
다음 동영상에서는 CDK 구문에 대한 포괄적인 개요를 제공하고 CDK 앱에서 이를 사용하는 방법을 설명합니다.