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 클라우드 인프라를 정의합니다.

AWS CDK 라이브러리 가져오기

AWS CDK 라이브러리는 종종 TypeScript 패키지 이름인 aws-cdk-lib로 불립니다. 실제 패키지 이름은 언어에 따라 다릅니다. 다음은 CDK 라이브러리를 설치하고 가져오는 방법의 예입니다.

TypeScript
Install npm install aws-cdk-lib
Import import * as cdk from 'aws-cdk-lib';
JavaScript
Install npm install aws-cdk-lib
Import const cdk = require('aws-cdk-lib');
Python
Install python -m pip install aws-cdk-lib
Import import aws_cdk as cdk
Java
pom.xml에서 추가 Group software.amazon.awscdk; artifact aws-cdk-lib
Import import software.amazon.awscdk.App;
C#
Install dotnet add package Amazon.CDK.Lib
Import using Amazon.CDK;
Go
Install go get github.com/aws/aws-cdk-go/awscdk/v2
Import
import ( "github.com/aws/aws-cdk-go/awscdk/v2" )

construct 기본 클래스 및 지원 코드는 constructs 라이브러리에 있습니다. API가 아직 개선 중인 실험 구문은 별도의 모듈로 배포됩니다.

AWS CDK API 참조 사용

AWS CDK로 개발할 때 AWS CDK API 참조를 사용합니다.

각 모듈의 참조 자료는 다음 섹션으로 나뉩니다.

  • 개요: 개념과 예를 AWS CDK포함하여 에서 서비스를 사용하기 위해 알아야 할 소개 자료입니다.

  • 구문: 하나 이상의 구체적인 AWS 리소스를 나타내는 라이브러리 클래스입니다. 이는 안전한 기본값이 포함된 상위 수준 인터페이스를 제공하는 ’큐레이팅’(L2) 리소스 또는 패턴(L3 리소스)입니다.

  • 클래스: 모듈의 구문에서 사용하는 기능을 제공하는 비구문 클래스입니다.

  • 구조체: 속성(구문의 props 인수) 및 옵션과 같은 복합 값의 구조를 정의하는 데이터 구조(속성 번들)입니다.

  • 인터페이스: 이름이 모두 ’I’로 시작하는 인터페이스는 해당 구문 또는 기타 클래스에 대한 절대 최소 기능을 정의합니다. CDK는 구문 인터페이스를 사용하여 AWS CDK 앱 외부에서 정의되고 Bucket.fromBucketArn()와 같은 메서드에 의해 참조되는 AWS 리소스를 나타냅니다.

  • 열거형: 특정 구문 파라미터를 지정하는 데 사용할 이름이 지정된 값의 컬렉션입니다. 열거형 값을 사용하면 CDK가 합성 중 이러한 값의 유효성을 확인할 수 있습니다.

  • CloudFormation 리소스: 이름이 ’Cfn’으로 시작하는 이러한 L1 구문은 CloudFormation 사양에 정의된 리소스를 정확히 나타냅니다. 각 CDK 릴리스에서 해당 사양에서 자동으로 생성됩니다. 각 L2 또는 L3 구문은 하나 이상의 CloudFormation 리소스를 캡슐화합니다.

  • CloudFormation 속성 유형: 각 CloudFormation 리소스의 속성을 정의하는 명명된 값의 컬렉션입니다.

구문 클래스와 비교한 인터페이스

AWS CDK는 인터페이스를 프로그래밍 개념으로 알고 있더라도 명확하지 않을 수 있는 특정 방식으로 인터페이스를 사용합니다.

AWS CDK는 Bucket.fromBucketArn()와 같은 방법을 사용하여 CDK 애플리케이션 외부에서 정의된 리소스 사용을 지원합니다. 외부 리소스는 수정할 수 없으며 Bucket 클래스를 사용하여 CDK 앱에 정의된 리소스에서 모든 기능을 사용할 수 있는 것은 아닙니다. 그런 다음 인터페이스는 외부 리소스를 포함하여 지정된 AWS 리소스 유형에 대해 CDK에서 사용할 수 있는 기본 최소 기능을 나타냅니다.

CDK 앱에서 리소스를 인스턴스화할 때는 항상 Bucket과 같은 구체적인 클래스를 사용해야 합니다. 자체 구문 중 하나에서 수락하는 인수 유형을 지정할 때는 외부 리소스를 처리할 준비가 된 경우(즉, 변경할 필요가 없음) IBucket과 같은 인터페이스 유형을 사용합니다. CDK 정의 구문이 필요한 경우 사용할 수 있는 가장 일반적인 유형을 지정합니다.

일부 인터페이스는 구문이 아닌 특정 클래스와 연결된 속성 또는 옵션 번들의 최소 버전입니다. 이러한 인터페이스는 부모 클래스에 전달할 인수를 수락하기 위해 서브클래싱할 때 유용할 수 있습니다. 하나 이상의 추가 속성이 필요한 경우 이 인터페이스 또는 보다 구체적인 유형에서 구현하거나 파생해야 합니다.

참고

AWS CDK에서 지원하는 일부 프로그래밍 언어에는 인터페이스 기능이 없습니다. 이러한 언어에서 인터페이스는 일반 클래스에 불과합니다. 첫글자 ‘I’ 뒤에 다른 구문이 오는 패턴(예: IBucket)을 따르는 이름으로 인터페이스를 식별할 수 있습니다. 동일한 규칙이 적용됩니다.

종속성 관리

AWS CDK 앱 또는 라이브러리의 종속성은 패키지 관리 도구를 사용하여 관리됩니다. 이러한 도구는 대개 프로그래밍 언어와 함께 사용됩니다.

일반적으로 AWS CDK는 언어의 표준 또는 공식 패키지 관리 도구가 있는 경우 이를 지원합니다. 그렇지 않으면 AWS CDK에서 언어의 가장 인기 있거나 널리 지원되는 언어를 지원합니다. 다른 도구를 사용할 수도 있습니다. 특히 지원되는 도구로 작업하는 경우 더욱 그렇습니다. 그러나 다른 도구에 대한 공식 지원은 제한됩니다.

AWS CDK는 다음 패키지 관리자를 지원합니다.

언어 지원되는 패키지 관리 도구
TypeScript/JavaScript NPM(Node Package Manager) 또는 Yarn
Python PIP(Python용 패키지 설치 관리자)
Java Maven
C# NuGet
Go Go 모듈

AWS CDK CLI cdk init 명령을 사용하여 새 프로젝트를 생성하면 CDK 코어 라이브러리와 안정적인 구문에 대한 종속성이 자동으로 지정됩니다.

지원되는 프로그래밍 언어의 종속성 관리에 대한 자세한 내용은 다음을 참조하세요.

다른 언어와 TypeScript의 AWS CDK 비교하기

TypeScript는 AWS CDK 애플리케이션 개발에 지원되는 첫 번째 언어입니다. 따라서 상당량의 예제 CDK 코드가 TypeScript로 작성됩니다. 다른 언어로 개발하는 경우 선택한 언어와 비교하여 TypeScript에서 AWS CDK 코드가 구현되는 방법을 비교하는 것이 유용할 수 있습니다. 이렇게 하면 설명서 전체에서 예를 사용하는 데 도움이 될 수 있습니다.

모듈 가져오기

TypeScript/JavaScript

TypeScript는 네임스페이스에서 전체 네임스페이스 또는 개별 객체 가져오기를 지원합니다. 각 네임스페이스에는 지정된 AWS 서비스와 함께 사용할 수 있는 구문 및 기타 클래스가 포함되어 있습니다.

// Import main CDK library as cdk import * as cdk from 'aws-cdk-lib'; // ES6 import preferred in TS const cdk = require('aws-cdk-lib'); // Node.js require() preferred in JS // Import specific core CDK classes import { Stack, App } from 'aws-cdk-lib'; const { Stack, App } = require('aws-cdk-lib'); // Import AWS S3 namespace as s3 into current namespace import { aws_s3 as s3 } from 'aws-cdk-lib'; // TypeScript const s3 = require('aws-cdk-lib/aws-s3'); // JavaScript // Having imported cdk already as above, this is also valid const s3 = cdk.aws_s3; // Now use s3 to access the S3 types const bucket = s3.Bucket(...); // Selective import of s3.Bucket import { Bucket } from 'aws-cdk-lib/aws-s3'; // TypeScript const { Bucket } = require('aws-cdk-lib/aws-s3'); // JavaScript // Now use Bucket to instantiate an S3 bucket const bucket = Bucket(...);
Python

TypeScript와 마찬가지로 Python은 네임스페이스 모듈 가져오기 및 선택적 가져오기를 지원합니다. Python의 네임스페이스는 aws_cdk.xxx와 같습니다. 여기서 xxx는 Amazon S3의 s3와 같은 AWS 서비스 이름을 나타냅니다. (이 예에서는 Amazon S3를 사용합니다).

# Import main CDK library as cdk import aws_cdk as cdk # Selective import of specific core classes from aws_cdk import Stack, App # Import entire module as s3 into current namespace import aws_cdk.aws_s3 as s3 # s3 can now be used to access classes it contains bucket = s3.Bucket(...) # Selective import of s3.Bucket into current namespace from aws_cdk.s3 import Bucket # Bucket can now be used to instantiate a bucket bucket = Bucket(...)
Java

Java의 가져오기는 TypeScript와 다르게 작동합니다. 각 가져오기 문은 지정된 패키지에서 단일 클래스 이름을 가져오거나 해당 패키지에 정의된 모든 클래스를 가져옵니다(* 사용). 클래스를 가져온 경우 클래스 이름 자체 또는 패키지를 포함한 적격 클래스 이름을 사용하여 클래스에 액세스할 수 있습니다.

AWS Construct 라이브러리의 경우 라이브러리 이름은 software.amazon.awscdk.services.xxx와 같습니다. 기본 라이브러리는 software.amazon.awscdk입니다. AWS CDK 패키지의 Maven 그룹 ID는 software.amazon.awscdk입니다.

// Make certain core classes available import software.amazon.awscdk.Stack; import software.amazon.awscdk.App; // Make all Amazon S3 construct library classes available import software.amazon.awscdk.services.s3.*; // Make only Bucket and EventType classes available import software.amazon.awscdk.services.s3.Bucket; import software.amazon.awscdk.services.s3.EventType; // An imported class may now be accessed using the simple class name (assuming that name // does not conflict with another class) Bucket bucket = Bucket.Builder.create(...).build(); // We can always use the qualified name of a class (including its package) even without an // import directive software.amazon.awscdk.services.s3.Bucket bucket = software.amazon.awscdk.services.s3.Bucket.Builder.create(...) .build(); // Java 10 or later can use var keyword to avoid typing the type twice var bucket = software.amazon.awscdk.services.s3.Bucket.Builder.create(...) .build();
C#

C#에서는 using 지시문을 사용하여 유형을 가져옵니다. 두 가지 스타일이 있습니다. 하나는 일반 이름을 사용하여 지정된 네임스페이스의 모든 유형에 액세스할 수 있는 권한을 부여합니다. 다른 별칭을 사용하여 네임스페이스 자체를 참조할 수 있습니다.

AWS Construct Library 패키지의 경우 패키지 이름은 Amazon.CDK.AWS.xxx와 같습니다. 코어 모듈은 Amazon.CDK입니다.

// Make CDK base classes available under cdk using cdk = Amazon.CDK; // Make all Amazon S3 construct library classes available using Amazon.CDK.AWS.S3; // Now we can access any S3 type using its name var bucket = new Bucket(...); // Import the S3 namespace under an alias using s3 = Amazon.CDK.AWS.S3; // Now we can access an S3 type through the namespace alias var bucket = new s3.Bucket(...); // We can always use the qualified name of a type (including its namespace) even without a // using directive var bucket = new Amazon.CDK.AWS.S3.Bucket(...)
Go

각 AWS Construct 라이브러리 모듈은 Go 패키지로 제공됩니다.

import ( "github.com/aws/aws-cdk-go/awscdk/v2" // CDK core package "github.com/aws/aws-cdk-go/awscdk/v2/awss3" // AWS S3 construct library module ) // now instantiate a bucket bucket := awss3.NewBucket(...) // use aliases for brevity/clarity import ( cdk "github.com/aws/aws-cdk-go/awscdk/v2" // CDK core package s3 "github.com/aws/aws-cdk-go/awscdk/v2/awss3" // AWS S3 construct library module ) bucket := s3.NewBucket(...)

구문 인스턴스화

AWS CDK 구문 클래스의 이름은 지원되는 모든 언어에서 동일합니다. 대부분의 언어는 new 키워드를 사용하여 클래스를 인스턴스화합니다(Python 및 Go는 그렇지 않음). 또한 대부분의 언어에서 키워드 this는 현재 인스턴스를 나타냅니다. Python은 규칙에 따라 self를 사용합니다. 현재 인스턴스에 대한 참조를 생성한 모든 구문에 scope 파라미터로 전달해야 합니다.

AWS CDK 구문에 대한 세 번째 인수는 props이며, 구문을 빌드하는 데 필요한 속성을 포함하는 객체입니다. 이 인수는 선택 사항일 수 있지만 필요한 경우 지원되는 언어가 이 인수를 특이한 방식으로 처리합니다. 속성의 이름도 언어의 표준 이름 지정 패턴에 맞게 조정됩니다.

TypeScript/JavaScript
// Instantiate default Bucket const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket'); // Instantiate Bucket with bucketName and versioned properties const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', { bucketName: 'amzn-s3-demo-bucket', versioned: true, }); // Instantiate Bucket with websiteRedirect, which has its own sub-properties const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', { websiteRedirect: {host: 'aws.amazon.com'}});
Python

Python은 클래스를 인스턴스화할 때 new 키워드를 사용하지 않습니다. 속성 인수는 키워드 인수를 사용하여 표시되고 인수는 snake_case를 사용하여 이름이 지정됩니다.

속성 값이 그 자체로 속성 번들인 경우 속성 뒤에 이름이 지정된 클래스로 표시되며, 하위 속성에 대한 키워드 인수를 수락합니다.

Python에서는 현재 인스턴스가 첫 번째 인수로 메서드에 전달되며, 규칙에 따라 self라는 이름이 지정됩니다.

# Instantiate default Bucket bucket = s3.Bucket(self, "amzn-s3-demo-bucket") # Instantiate Bucket with bucket_name and versioned properties bucket = s3.Bucket(self, "amzn-s3-demo-bucket", bucket_name="amzn-s3-demo-bucket", versioned=true) # Instantiate Bucket with website_redirect, which has its own sub-properties bucket = s3.Bucket(self, "amzn-s3-demo-bucket", website_redirect=s3.WebsiteRedirect( host_name="aws.amazon.com"))
Java

Java에서 props 인수는 XxxxProps라는 클래스로 표현됩니다(예: Bucket 구문의 props의 경우 BucketProps). 빌더 패턴을 사용하여 속성 인수를 빌드합니다.

XxxxProps 클래스에는 빌더가 있습니다. 또한 다음 예와 같이 한 단계로 소품과 구문을 빌드하는 각 구문에 대한 편리한 빌더가 있습니다.

Props의 이름은 camelCase를 사용하여 TypeScript에서와 동일합니다.

// Instantiate default Bucket Bucket bucket = Bucket(self, "amzn-s3-demo-bucket"); // Instantiate Bucket with bucketName and versioned properties Bucket bucket = Bucket.Builder.create(self, "amzn-s3-demo-bucket") .bucketName("amzn-s3-demo-bucket").versioned(true) .build(); # Instantiate Bucket with websiteRedirect, which has its own sub-properties Bucket bucket = Bucket.Builder.create(self, "amzn-s3-demo-bucket") .websiteRedirect(new websiteRedirect.Builder() .hostName("aws.amazon.com").build()) .build();
C#

C#에서 속성은 객체 이니셜라이저를 사용하여 XxxxProps라는 클래스로 지정됩니다(예: Bucket 구문의 속성의 경우 BucketProps).

속성의 이름은 PascalCase를 사용하는 경우를 제외하고 TypeScript와 비슷하게 지정됩니다.

구문을 인스턴스화할 때 var 키워드를 사용하는 것이 편리하므로 클래스 이름을 두 번 입력할 필요가 없습니다. 그러나 로컬 코드 스타일 가이드는 다를 수 있습니다.

// Instantiate default Bucket var bucket = Bucket(self, "amzn-s3-demo-bucket"); // Instantiate Bucket with BucketName and Versioned properties var bucket = Bucket(self, "amzn-s3-demo-bucket", new BucketProps { BucketName = "amzn-s3-demo-bucket", Versioned = true}); // Instantiate Bucket with WebsiteRedirect, which has its own sub-properties var bucket = Bucket(self, "amzn-s3-demo-bucket", new BucketProps { WebsiteRedirect = new WebsiteRedirect { HostName = "aws.amazon.com" }});
Go

Go에서 구문을 생성하려면 Xxxxxxx가 구문의 이름인 함수 NewXxxxxx를 직접적으로 호출합니다. 구문의 속성은 구조체로 정의됩니다.

Go에서 모든 구문 파라미터는 숫자, 부울 및 문자열과 같은 값을 포함한 포인터입니다. jsii.String과 같은 편의 함수를 사용하여 이러한 포인터를 생성합니다.

// Instantiate default Bucket bucket := awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), nil) // Instantiate Bucket with BucketName and Versioned properties bucket1 := awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.BucketProps{ BucketName: jsii.String("amzn-s3-demo-bucket"), Versioned: jsii.Bool(true), }) // Instantiate Bucket with WebsiteRedirect, which has its own sub-properties bucket2 := awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.BucketProps{ WebsiteRedirect: &awss3.RedirectTarget{ HostName: jsii.String("aws.amazon.com"), }})

멤버 액세스

일반적으로 구문 및 기타 AWS CDK 클래스의 속성 또는 속성을 참조하고 이러한 값을 입력으로 사용하여 다른 구문을 빌드합니다. 메서드에 대해 앞서 설명한 이름 지정 차이도 여기에 적용됩니다. 또한 Java에서는 멤버에 직접 액세스할 수 없습니다. 대신 getter 메서드가 제공됩니다.

TypeScript/JavaScript

이름은 camelCase입니다.

bucket.bucketArn
Python

이름은 snake_case입니다.

bucket.bucket_arn
Java

각 속성에 대해 getter 메서드가 제공되며, 이러한 이름은 camelCase입니다.

bucket.getBucketArn()
C#

이름은 PascalCase입니다.

bucket.BucketArn
Go

이름은 PascalCase입니다.

bucket.BucketArn

열거형 상수

열거형 상수는 클래스로 범위가 지정되며 모든 언어(때로는 SCREAMING_SNAKE_CASE라고도 함)로 밑줄이 그어진 대문자 이름이 있습니다. 클래스 이름도 Go를 제외한 지원되는 모든 언어에서 동일한 케이싱을 사용하므로, 인증된 열거형 이름도 이러한 언어에서 동일합니다.

s3.BucketEncryption.KMS_MANAGED

Go에서 열거형 상수는 모듈 네임스페이스의 속성이며 다음과 같이 작성됩니다.

awss3.BucketEncryption_KMS_MANAGED

객체 인터페이스

AWS CDK는 TypeScript 객체 인터페이스를 사용하여 클래스가 예상 메서드 및 속성 세트를 구현함을 나타냅니다. 객체 인터페이스의 이름은 I로 시작되므로 인식할 수 있습니다. 구체적인 클래스는 implements 키워드를 사용하여 구현하는 인터페이스를 나타냅니다.

TypeScript/JavaScript
참고

JavaScript에는 인터페이스 기능이 없습니다. implements 키워드와 키워드 뒤에 오는 클래스 이름을 무시할 수 있습니다.

import { IAspect, IConstruct } from 'aws-cdk-lib'; class MyAspect implements IAspect { public visit(node: IConstruct) { console.log('Visited', node.node.path); } }
Python

Python에는 인터페이스 기능이 없습니다. 그러나 AWS CDK의 경우 클래스를 @jsii.implements(interface)로 장식하여 인터페이스 구현을 표시할 수 있습니다.

from aws_cdk import IAspect, IConstruct import jsii @jsii.implements(IAspect) class MyAspect(): def visit(self, node: IConstruct) -> None: print("Visited", node.node.path)
Java
import software.amazon.awscdk.IAspect; import software.amazon.awscdk.IConstruct; public class MyAspect implements IAspect { public void visit(IConstruct node) { System.out.format("Visited %s", node.getNode().getPath()); } }
C#
using Amazon.CDK; public class MyAspect : IAspect { public void Visit(IConstruct node) { System.Console.WriteLine($"Visited ${node.Node.Path}"); } }
Go

Go 구조는 구현하는 인터페이스를 명시적으로 선언할 필요가 없습니다. Go 컴파일러는 구조에서 사용할 수 있는 메서드 및 속성을 기반으로 구현을 결정합니다. 예를 들어, 다음 코드에서는 MyAspect가 구문을 사용하는 Visit 메서드를 제공하기 때문에 IAspect 인터페이스를 구현합니다.

type MyAspect struct { } func (a MyAspect) Visit(node constructs.IConstruct) { fmt.Println("Visited", *node.Node().Path()) }