v AWS CDK 2 개발자 안내서입니다. 이전 CDK v1은 2022년 6월 1일에 유지 관리에 들어갔으며 2023년 6월 1일에 지원을 종료했습니다.
기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
AWS CDK 구문
구문은 AWS Cloud Development Kit (AWS CDK) 애플리케이션의 기본 구성 요소입니다. 구문은 애플리케이션 내에서 하나 이상의 AWS CloudFormation 리소스와 해당 구성을 나타내는 구성 요소입니다. 구문을 가져오고 구성하여 애플리케이션을 하나씩 빌드합니다.
구문 가져오기 및 사용
구문은 AWS Construct 라이브러리에서 CDK 애플리케이션으로 가져오는 클래스입니다. 구문을 직접 생성하고 배포하거나 타사 개발자가 생성한 구문을 사용할 수도 있습니다.
구문은 CPM(Construct Programming Model)의 일부이며 Terraform(CDKtf), CDK for Kubernetes(CDK8s), Projen 등의 다른 도구와 함께 사용할 수 있습니다.
많은 타사에서 AWS CDK와 호환되는 구문을 게시했습니다. Construct Hub를 방문하여 AWS CDK 구문 파트너 생태계를 살펴보세요.
구문 수준
AWS Construct 라이브러리의 구문은 세 가지 수준으로 분류됩니다. 각 수준은 점점 더 상위 추상화를 제공합니다. 추상화 수준이 높을수록 구성이 더 쉬워지고 전문 지식이 덜 필요합니다. 추상화 수준이 낮을수록 더 많은 사용자 지정이 가능하고 전문 지식이 더 많이 필요합니다.
- 수준 1(L1) 구문
-
CFN 리소스라고도 하는 L1 구문은 최하위 구문이며 추상화를 제공하지 않습니다. 각 L1 구문은 단일 AWS CloudFormation 리소스에 직접 매핑됩니다. L1 구문을 사용하면 특정 AWS CloudFormation 리소스를 나타내는 구문을 가져옵니다. 그런 다음 구문 인스턴스 내에서 리소스의 속성을 정의합니다.
L1 구문은 AWS CloudFormation에 익숙하고 AWS 리소스 속성 정의를 완벽하게 제어해야 할 때 사용하기 좋습니다.
AWS Construct 라이브러리에서 L1 구문의 이름은 Cfn
으로 시작하고, 그 뒤에 해당 구문이 나타내는 AWS CloudFormation 리소스의 식별자가 붙습니다. 예를 들어, CfnBucket
구문은 AWS::S3::Bucket
AWS CloudFormation 리소스를 나타내는 L1 구문입니다.
L1 구문은 AWS CloudFormation 리소스 사양 에서 생성됩니다. 리소스가 AWS CloudFormation에 있는 경우 AWS CDK에서 L1 구문으로 사용할 수 있습니다. 새로운 리소스나 속성이 AWS Construct 라이브러리에서 사용 가능하게 되려면 최대 일주일이 걸릴 수 있습니다. 자세한 내용은 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 라이브러리에는 안정적이고 프로덕션용으로 지정된 L2 구문이 포함되어 있습니다. 개발 중인 L2 구문의 경우 실험용으로 지정되어 별도의 모듈로 제공됩니다.
- 수준 3(L3) 구문
-
패턴이라고도 하는 L3 구문은 최상위 추상화입니다. 각 L3 구문에는 애플리케이션 내에서 특정 태스크 또는 서비스를 수행하기 위해 함께 작동하도록 구성된 리소스 컬렉션이 포함될 수 있습니다. L3 구문은 애플리케이션의 특정 사용 사례에 대한 전체 AWS 아키텍처를 생성하는 데 사용됩니다.
전체 시스템 설계 또는 대규모 시스템의 상당 부분을 제공하기 위해 L3 구문은 독단적 기본 속성 구성을 제공합니다. L3 구문은 문제를 해결하고 솔루션을 제공하기 위한 특정 접근 방식을 중심으로 구축됩니다. L3 구문을 사용하면 입력과 코드를 최소화하면서 여러 리소스를 빠르게 생성하고 구성할 수 있습니다.
ecsPatterns.ApplicationLoadBalancedFargateService
클래스는 Amazon Elastic Container Service(Amazon ECS) 클러스터에서 실행되고 Application Load Balancer 뒤에 있는 AWS Fargate 서비스를 나타내는 L3 구문의 예입니다.
L2 구문과 마찬가지로 프로덕션 환경에서 사용할 수 있는 L3 구문은 AWS Construct 라이브러리에 포함됩니다. 개발 중인 L3 구문은 별도의 모듈로 제공됩니다.
구문 정의
구성
구성은 구문을 통해 상위 추상화를 정의하기 위한 주요 패턴입니다. 하위 수준의 여러 구문으로 상위 구문을 구성할 수 있습니다. 상향식 관점에서는 구문을 사용하여 배포하려는 개별 AWS 리소스를 구성합니다. 필요한 만큼의 수준으로 목적에 맞는 편리한 추상화를 사용할 수 있습니다.
구성을 사용하면 재사용 가능한 구성 요소를 정의하고 다른 코드와 같이 공유할 수 있습니다. 예를 들어, 팀은 백업, 글로벌 복제, 자동 규모 조정 및 모니터링을 포함하여 Amazon DynamoDB 테이블에 대한 회사의 모범 사례를 구현하는 구문을 정의할 수 있습니다. 팀은 다른 팀과 내부적으로 또는 공개적으로 구문을 공유할 수 있습니다.
팀은 다른 라이브러리 패키지와 마찬가지로 구문을 사용할 수 있습니다. 라이브러리가 업데이트되면 개발자는 다른 코드 라이브러리와 마찬가지로 새 버전의 개선 사항과 버그 수정에 액세스할 수 있습니다.
Initialization(초기화)
구성은 Construct
기본 클래스를 확장하는 클래스로 구현됩니다. 클래스를 인스턴스화하여 구문을 정의합니다. 모든 구성은 초기화될 때 3개의 파라미터를 사용합니다.
-
scope - 구문의 부모 또는 소유자입니다. 스택 또는 다른 구문일 수 있습니다. Scope는 구문 트리에서 구문의 위치를 결정합니다. 일반적으로 범위에는 현재 객체를 나타내는 this
(Python의 경우 self
)를 전달해야 합니다.
-
id - 범위 내에서 고유해야 하는 식별자입니다. 식별자는 구문 내에 정의된 모든 것의 네임스페이스 역할을 하며, 리소스 이름, AWS CloudFormation 논리적 ID 등의 고유 식별자를 생성하는 데 사용됩니다.
식별자는 범위 내에서만 고유해야 합니다. 이를 통해 포함된 구문과 식별자에 대한 걱정 없이 구문을 인스턴스화하고 재사용할 수 있으며, 구문을 상위 추상화로 구성할 수 있습니다. 또한 범위를 사용하면 여러 구문 그룹을 모두 한 번에 참조할 수 있습니다. 태깅 또는 구문이 배포될 위치 지정 등을 예로 들 수 있습니다.
-
props - 언어에 따라 구문의 초기 구성을 정의하는 속성 또는 키워드 인수 세트입니다. 상위 구문은 더 많은 기본값을 제공하며 모든 prop 요소가 선택 사항인 경우 props 파라미터를 완전히 생략할 수 있습니다.
구성
대부분의 구문은 구문의 구성을 정의하는 이름/값 컬렉션인 props
를 세 번째 인수 또는 키워드 인수(Python의 경우)로 수락합니다. 다음 예에서는 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"),
})
구문과 상호 작용
구문은 기본 Construct 클래스를 확장하는 클래스입니다. 구문을 인스턴스화하면 구문 객체는 일련의 메서드와 속성을 노출하며, 이를 통해 구문과 상호 작용하고 이를 시스템의 다른 부분에 대한 참조로 전달할 수 있습니다.
AWS CDK 프레임워크는 구문의 API에 어떠한 제한도 두지 않습니다. 작성자는 원하는 모든 API를 정의할 수 있습니다. 그러나 s3.Bucket
과 같이 AWS Construct 라이브러리에 포함된 AWS 구문은 지침과 일반적인 패턴을 따릅니다. 이는 모든 AWS 리소스에서 일관된 경험을 제공합니다.
대부분의 AWS 구문에는 위탁자에게 해당 구문에 대한 AWS Identity and Access Management(IAM) 권한을 부여하는 데 사용할 수 있는 grant 메서드 세트가 있습니다. 다음 예에서는 IAM 그룹 data-science
에 Amazon S3 버킷 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 리소스 이름(ARN), 이름 또는 URL이 포함될 수 있습니다.
다음 코드는 AWS Lambda 함수를 정의하고 환경 변수의 대기열 URL을 통해 Amazon Simple Queue Service(Amazon SQS) 대기열과 연결합니다.
- 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 Construct 라이브러리의 가장 일반적인 API 패턴에 대한 자세한 내용은 리소스 및 AWS CDK 섹션을 참조하세요.
앱 및 스택 구문
AWS Construct 라이브러리의 App
및 Stack
클래스는 고유한 구문입니다. 다른 구문과 비교했을 때, 이들 클래스는 자체적으로 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 구문의 내부 클래스로 정의된 유형으로 표시됩니다. 예를 들어 CfnBucket
의 선택적 속성에는cors_configuration
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 구문의 내부 클래스로 정의된 유형으로 표시됩니다. 예를 들어 CfnBucket
의 선택적 속성에는corsConfiguration
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 구문의 내부 클래스로 정의된 유형으로 표시됩니다. 예를 들어 CfnBucket
의 선택적 속성에는CorsConfiguration
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 구문의 이름, 밑줄 및 속성 이름을 사용하여 이름이 지정됩니다. 예를 들어 CfnBucket
의 선택적 속성에는CorsConfiguration
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 속성 유형을 L1 구문과 함께 사용할 수 없으며 그 반대의 경우도 마찬가지입니다. 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 라이브러리의 구문은 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
는 선택 사항입니다(기본값 {}
가져오기). 모든 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 앱에서 이를 사용하는 방법을 설명합니다.