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추가 그룹 software.amazon.awscdk, 아티팩트 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 API 참조를 사용합니다 AWS CDK.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

참고

에서 지원하는 일부 프로그래밍 언어에는 인터페이스 기능이 AWS CDK 없습니다. 이러한 언어에서는 인터페이스가 일반적인 클래스일 뿐입니다. 이름별로 식별할 수 있으며, 초기 'I'의 패턴 다음에 다른 구성 요소(예: IBucket)의 이름이 붙습니다. 동일한 규칙이 적용됩니다.

종속성 관리

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

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

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

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

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

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

AWS CDK 에서 비교 TypeScript 다른 언어 사용

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

와 마찬가지로 TypeScriptPython은 네임스페이스 모듈 가져오기 및 선택적 가져오기를 지원합니다. 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 Librarysoftware.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 Library 모듈은 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(예: BucketProps Bucket 구성 요소의 props). 빌더 패턴을 사용하여 props 인수를 빌드합니다.

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

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

// 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(예: BucketProps Bucket 구성 요소의 프롭).

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

구성 요소를 인스턴스화할 때 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에서 구성 요소를 생성하려면 가 구성 요소의 이름NewXxxxxxXxxxxxx인 함수를 호출합니다. 구성 요소의 속성은 구조로 정의됩니다.

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

객체 인터페이스

는 TypeScript 객체 인터페이스를 AWS CDK 사용하여 클래스가 예상 메서드 및 속성 세트를 구현함을 나타냅니다. 객체 인터페이스의 이름은 로 시작되므로 객체 인터페이스를 인식할 수 있습니다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 structs는 구현하는 인터페이스를 명시적으로 선언할 필요가 없습니다. Go 컴파일러는 구조에서 사용할 수 있는 메서드 및 속성을 기반으로 구현을 결정합니다. 예를 들어, 다음 코드에서는 가 구성을 수행하는 Visit 메서드를 제공하기 때문에 IAspect 인터페이스를 MyAspect 구현합니다.

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