튜토리얼: 첫 번째 AWS CDK 앱 만들기 - AWS Cloud Development Kit (AWS CDK) v2

AWS CDK v2 개발자 안내서입니다. 구형 CDK v1은 2022년 6월 1일에 유지 보수에 들어갔고 2023년 6월 1일에 지원이 종료되었습니다.

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

튜토리얼: 첫 번째 AWS CDK 앱 만들기

첫 번째 CDK AWS Cloud Development Kit (AWS CDK) 앱을 만들어 사용을 시작하세요.

사전 조건 

이 튜토리얼을 시작하기 전에 의 모든 설정 단계를 완료하세요. 시작하기 AWS CDK

이 자습서 소개

이 자습서에서는 를 AWS 사용하여 간단한 응용 프로그램을 만들고 배포합니다 AWS CDK. 응용 프로그램은 호출 시 Hello World! 메시지를 반환하는 AWS Lambda 함수로 구성되어 있습니다. 함수는 Lambda 함수의 전용 HTTP (S) 엔드포인트 역할을 하는 Lambda 함수 URL을 통해 호출됩니다.

이 자습서를 통해 다음을 수행하게 됩니다.

  • AWS CDK 명령줄 인터페이스 (AWS CDK CLI) cdk init 명령을 사용하여 CDK 프로젝트를 생성합니다.

  • AWS 구성 라이브러리의 구문을 사용하여 Lambda 함수 및 Lambda 함수 URL 리소스를 정의합니다.

  • CDK를 사용하여 앱을 CLI 빌드하고, AWS CloudFormation 템플릿을 합성하고, CDK 스택을 배포할 수 있습니다.

  • 에서 배포된 애플리케이션과 상호작용하세요. AWS

  • CDK CLI cdk diff 명령으로 애플리케이션을 수정하고 변경 내용을 확인합니다.

  • CDK 스택을 배포하여 변경 사항을 구현하십시오.

  • CDK 명령어를 사용하여 CDK 스택을 삭제합니다. CLI cdk destroy

1단계: CDK 프로젝트 만들기

이 단계에서는 새 CDK 프로젝트를 생성합니다. CDK 프로젝트는 자체 로컬 모듈 종속 항목이 있는 자체 디렉터리에 있어야 합니다.

CDK 프로젝트를 만들려면
  1. 선택한 시작 디렉터리에서 다음과 같은 디렉터리를 만들고 탐색합니다. hello-cdk

    $ mkdir hello-cdk && cd hello-cdk
    중요

    프로젝트 디렉터리의 hello-cdk 이름을 여기에 표시된 대로 정확히 지정해야 합니다. CLICDK는 이 디렉터리 이름을 사용하여 CDK 코드 내의 이름을 지정합니다. 다른 디렉터리 이름을 사용하는 경우 이 자습서에서 문제가 발생할 수 있습니다.

  2. hello-cdk디렉터리에서 명령을 사용하여 새 CDK 프로젝트를 초기화합니다. AWS CDK CLI cdk init 다음 옵션을 사용하여 app 템플릿과 선호하는 프로그래밍 언어를 지정합니다. --language

    TypeScript
    $ cdk init app --language typescript
    JavaScript
    $ cdk init app --language javascript
    Python
    $ cdk init app --language python

    앱을 만든 후 다음 두 명령도 입력합니다. 이렇게 하면 앱의 Python 가상 환경이 활성화되고 AWS CDK 핵심 종속성이 설치됩니다.

    $ source .venv/bin/activate # On Windows, run `.\venv\Scripts\activate` instead $ python -m pip install -r requirements.txt
    Java
    $ cdk init app --language java

    IDE를 사용하는 경우 이제 프로젝트를 열거나 가져올 수 있습니다. 예를 Eclipse 들어 에서 [파일] > [가져오기] > [Maven] > [기존 Maven 프로젝트] 를 선택합니다. 프로젝트 설정이 Java 8 (1.8) 을 사용하도록 설정되어 있는지 확인하십시오.

    C#
    $ cdk init app --language csharp

    Visual Studio를 사용하는 경우 src 디렉터리에서 솔루션 파일을 여십시오.

    Go
    $ cdk init app --language go

    앱을 만든 후에는 다음 명령도 입력하여 앱에 필요한 AWS Construct Library 모듈을 설치합니다.

    $ go get

cdk init 명령은 hello-cdk 디렉터리 내에 파일 및 폴더 구조를 생성하여 CDK 앱의 소스 코드를 정리하는 데 도움이 됩니다. 이러한 파일 및 폴더 구조를 CDK 프로젝트라고 합니다. 잠시 시간을 내어 CDK 프로젝트를 살펴보세요.

Git설치가 완료되면 사용하여 생성한 각 프로젝트도 cdk init 저장소로 초기화됩니다. Git

프로젝트 초기화 과정에서 CDK는 단일 CDK CLI 스택이 포함된 CDK 앱을 생성합니다. CDK 앱 인스턴스는 구문을 사용하여 생성됩니다. App 다음은 CDK 애플리케이션 파일에 있는 이 코드의 일부입니다.

TypeScript

위치: bin/hello-cdk.ts

#!/usr/bin/env node import 'source-map-support/register'; import * as cdk from 'aws-cdk-lib'; import { HelloCdkStack } from '../lib/hello-cdk-stack'; const app = new cdk.App(); new HelloCdkStack(app, 'HelloCdkStack', { });
JavaScript

위치bin/hello-cdk.js:

#!/usr/bin/env node const cdk = require('aws-cdk-lib'); const { HelloCdkStack } = require('../lib/hello-cdk-stack'); const app = new cdk.App(); new HelloCdkStack(app, 'HelloCdkStack', { });
Python

위치app.py:

#!/usr/bin/env python3 import os import aws_cdk as cdk from hello_cdk.hello_cdk_stack import HelloCdkStack app = cdk.App() HelloCdkStack(app, "HelloCdkStack",) app.synth()
Java

위치src/main/java/.../HelloCdkApp.java:

package com.myorg; import software.amazon.awscdk.App; import software.amazon.awscdk.Environment; import software.amazon.awscdk.StackProps; import java.util.Arrays; public class HelloCdkApp { public static void main(final String[] args) { App app = new App(); new HelloCdkStack(app, "HelloCdkStack", StackProps.builder() .build()); app.synth(); } }
C#

위치src/HelloCdk/Program.cs:

using Amazon.CDK; using System; using System.Collections.Generic; using System.Linq; namespace HelloCdk { sealed class Program { public static void Main(string[] args) { var app = new App(); new HelloCdkStack(app, "HelloCdkStack", new StackProps {}); app.Synth(); } } }
Go

위치hello-cdk.go:

package main import ( "github.com/aws/aws-cdk-go/awscdk/v2" "github.com/aws/constructs-go/constructs/v10" "github.com/aws/jsii-runtime-go" ) // ... func main() { defer jsii.Close() app := awscdk.NewApp(nil) NewHelloCdkStack(app, "HelloCdkStack", &HelloCdkStackProps{ awscdk.StackProps{ Env: env(), }, }) app.Synth(nil) } // ...

CDK 스택은 Stack 구문을 사용하여 생성됩니다. 다음은 CDK 스택 파일에서 가져온 이 코드의 일부입니다.

TypeScript

위치: lib/hello-cdk-stack.ts

import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; export class HelloCdkStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // Define your constructs here } }
JavaScript

위치lib/hello-cdk-stack.js:

const { Stack } = require('aws-cdk-lib'); class HelloCdkStack extends Stack { constructor(scope, id, props) { super(scope, id, props); // Define your constructs here } } module.exports = { HelloCdkStack }
Python

위치hello_cdk/hello_cdk_stack.py:

from aws_cdk import ( Stack, ) from constructs import Construct class HelloCdkStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # Define your constructs here
Java

위치src/main/java/.../HelloCdkStack.java:

package com.myorg; import software.constructs.Construct; import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; 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); // Define your constructs here } }
C#

위치src/HelloCdk/HelloCdkStack.cs:

using Amazon.CDK; using Constructs; namespace HelloCdk { public class HelloCdkStack : Stack { internal HelloCdkStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // Define your constructs here } } }
Go

위치hello-cdk.go:

package main import ( "github.com/aws/aws-cdk-go/awscdk/v2" "github.com/aws/constructs-go/constructs/v10" "github.com/aws/jsii-runtime-go" ) type HelloCdkStackProps struct { awscdk.StackProps } 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) return stack } // ...

2단계: CDK 앱 빌드하기

대부분의 프로그래밍 환경에서는 코드를 변경한 후 빌드하거나 컴파일합니다. CDK가 이 단계를 CLI 자동으로 AWS CDK 수행하므로 에서는 이 작업을 수행할 필요가 없습니다. 하지만 구문 및 유형 오류를 포착하려는 경우에는 여전히 수동으로 빌드할 수 있습니다. 다음은 그 예제입니다.

TypeScript
$ npm run build > hello-cdk@0.1.0 build > tsc
JavaScript

빌드 단계는 필요하지 않습니다.

Python

빌드 단계는 필요하지 않습니다.

Java
$ mvn compile -q

또는 Control-B Eclipse에서 누르세요 (다른 Java IDE는 다를 수 있음).

C#
$ dotnet build src

또는 비주얼 스튜디오에서 F6을 누릅니다.

Go
$ go build

3단계: 앱의 CDK 스택 나열

이제 단일 CDK 스택이 포함된 CDK 앱이 있어야 합니다. 확인하려면 CDK CLI cdk list 명령어를 사용하여 스택을 표시하세요. 출력에는 다음과 같은 이름의 단일 스택이 표시되어야 합니다. HelloCdkStack

$ cdk list HelloCdkStack

이 출력이 보이지 않으면 프로젝트의 작업 디렉터리가 올바른지 확인하고 다시 시도하세요. 그래도 스택이 보이지 않으면 1단계: CDK 프로젝트 만들기 반복해서 다시 시도하세요.

4단계: Lambda 함수를 정의합니다.

이 단계에서는 AWS 구성 라이브러리에서 aws_lambda 모듈을 가져와서 Function L2 구문을 사용합니다.

CDK 스택 파일을 다음과 같이 수정합니다.

TypeScript

위치: lib/hello-cdk-stack.ts

import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; // Import the Lambda module import * as lambda from 'aws-cdk-lib/aws-lambda'; export class HelloCdkStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // Define the Lambda function resource const myFunction = new lambda.Function(this, "HelloWorldFunction", { runtime: lambda.Runtime.NODEJS_20_X, // Provide any supported Node.js runtime handler: "index.handler", code: lambda.Code.fromInline(` exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; `), }); } }
JavaScript

위치lib/hello-cdk-stack.js:

const { Stack } = require('aws-cdk-lib'); // Import the Lambda module const lambda = require('aws-cdk-lib/aws-lambda'); class HelloCdkStack extends Stack { constructor(scope, id, props) { super(scope, id, props); // Define the Lambda function resource const myFunction = new lambda.Function(this, "HelloWorldFunction", { runtime: lambda.Runtime.NODEJS_20_X, // Provide any supported Node.js runtime handler: "index.handler", code: lambda.Code.fromInline(` exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; `), }); } } module.exports = { HelloCdkStack }
Python

위치hello_cdk/hello_cdk_stack.py:

from aws_cdk import ( Stack, aws_lambda as _lambda, # Import the Lambda module ) from constructs import Construct class HelloCdkStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # Define the Lambda function resource my_function = _lambda.Function( self, "HelloWorldFunction", runtime = _lambda.Runtime.NODEJS_20_X, # Provide any supported Node.js runtime handler = "index.handler", code = _lambda.Code.from_inline( """ exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; """ ), )
Java

위치src/main/java/.../HelloCdkStack.java:

package com.myorg; import software.constructs.Construct; import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; // Import Lambda function import software.amazon.awscdk.services.lambda.Code; import software.amazon.awscdk.services.lambda.Function; import software.amazon.awscdk.services.lambda.Runtime; 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); // Define the Lambda function resource Function myFunction = Function.Builder.create(this, "HelloWorldFunction") .runtime(Runtime.NODEJS_20_X) // Provide any supported Node.js runtime .handler("index.handler") .code(Code.fromInline( "exports.handler = async function(event) {" + " return {" + " statusCode: 200," + " body: JSON.stringify('Hello World!')" + " };" + "};")) .build(); } }
C#

위치src/main/java/.../HelloCdkStack.java:

using Amazon.CDK; using Constructs; // Import the Lambda module using Amazon.CDK.AWS.Lambda; namespace HelloCdk { public class HelloCdkStack : Stack { internal HelloCdkStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // Define the Lambda function resource var myFunction = new Function(this, "HelloWorldFunction", new FunctionProps { Runtime = Runtime.NODEJS_20_X, // Provide any supported Node.js runtime Handler = "index.handler", Code = Code.FromInline(@" exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; "), }); } } }
Go

위치hello-cdk.go:

package main import ( "github.com/aws/aws-cdk-go/awscdk/v2" "github.com/aws/constructs-go/constructs/v10" "github.com/aws/jsii-runtime-go" // Import the Lambda module "github.com/aws/aws-cdk-go/awscdk/v2/awslambda" ) type HelloCdkStackProps struct { awscdk.StackProps } 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) // Define the Lambda function resource myFunction := awslambda.NewFunction(stack, jsii.String("HelloWorldFunction"), &awslambda.FunctionProps{ Runtime: awslambda.Runtime_NODEJS_20_X(), // Provide any supported Node.js runtime Handler: jsii.String("index.handler"), Code: awslambda.Code_FromInline(jsii.String(` exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; `)), }) return stack } // ...

Function구조를 좀 더 자세히 살펴보겠습니다. 모든 구문과 마찬가지로 이 Function 클래스는 세 개의 매개변수를 사용합니다.

  • 범위Stack 인스턴스를 Function 구문의 부모로 정의합니다. AWS 리소스를 정의하는 모든 구조는 스택 범위 내에서 생성됩니다. 구문 내에 구문을 정의하여 계층 (트리) 을 만들 수 있습니다. 여기서는 대부분의 경우 범위가 this (selfinPython) 입니다.

  • Id — AWS CDK 앱 Function 내 논리적 ID입니다. 이 ID와 스택 내 함수 위치에 기반한 해시를 더하면 배포 중에 함수를 고유하게 식별할 수 있습니다. AWS CDK 또한 앱에서 구문을 업데이트하고 배포된 리소스를 업데이트하기 위해 재배포할 때도 이 ID를 참조합니다. 여기서 논리 ID는 HelloWorldFunction 다음과 같습니다. 함수는 functionName 속성과 함께 지정된 이름을 가질 수도 있습니다. 이는 논리적 ID와 다릅니다.

  • props — 함수의 속성을 정의하는 값 묶음입니다. 여기서는runtime,handler, code 속성을 정의합니다.

    Props는 에서 지원하는 언어에 따라 다르게 표현됩니다. AWS CDK

    • TypeScriptIn 및JavaScript, props 는 단일 인수이며 원하는 속성이 포함된 객체를 전달합니다.

    • Python에서는 props가 키워드 인수로 전달됩니다.

    • Java에서는 props를 전달하기 위한 빌더가 제공됩니다. 두 가지가 있습니다. 하나는 FunctionProps for이고 다른 하나는 Function for로 구성과 props 객체를 한 번에 빌드할 수 있게 해줍니다. 이 코드는 후자를 사용합니다.

    • C#에서는 개체 이니셜라이저를 사용하여 FunctionProps 개체를 인스턴스화하고 이를 세 번째 매개 변수로 전달합니다.

    구문의 props가 선택 사항인 경우 매개 변수를 완전히 생략할 수 있습니다. props

모든 구문은 이와 같은 세 개의 인수를 사용하므로 새로운 인수를 익혀도 방향을 잡기가 쉽습니다. 예상할 수 있듯이, 원하는 구문을 서브클래스화하여 필요에 맞게 확장하거나 기본값을 변경하려는 경우에도 사용할 수 있습니다.

5단계: Lambda 함수 URL을 정의합니다.

이 단계에서는 Function 구문의 addFunctionUrl 도우미 메서드를 사용하여 Lambda 함수 URL을 정의합니다. 배포 시 이 URL의 값을 출력하려면 구문을 사용하여 AWS CloudFormation 출력을 생성해야 합니다. CfnOutput

CDK 스택 파일에 다음을 추가하세요.

TypeScript

위치: lib/hello-cdk-stack.ts

// ... export class HelloCdkStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // Define the Lambda function resource // ... // Define the Lambda function URL resource const myFunctionUrl = myFunction.addFunctionUrl({ authType: lambda.FunctionUrlAuthType.NONE, }); // Define a CloudFormation output for your URL new cdk.CfnOutput(this, "myFunctionUrlOutput", { value: myFunctionUrl.url, }) } }
JavaScript

위치lib/hello-cdk-stack.js:

const { Stack, CfnOutput } = require('aws-cdk-lib'); // Import CfnOutput class HelloCdkStack extends Stack { constructor(scope, id, props) { super(scope, id, props); // Define the Lambda function resource // ... // Define the Lambda function URL resource const myFunctionUrl = myFunction.addFunctionUrl({ authType: lambda.FunctionUrlAuthType.NONE, }); // Define a CloudFormation output for your URL new CfnOutput(this, "myFunctionUrlOutput", { value: myFunctionUrl.url, }) } } module.exports = { HelloCdkStack }
Python

위치hello_cdk/hello_cdk_stack.py:

from aws_cdk import ( # ... CfnOutput # Import CfnOutput ) from constructs import Construct class HelloCdkStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # Define the Lambda function resource # ... # Define the Lambda function URL resource my_function_url = my_function.add_function_url( auth_type = _lambda.FunctionUrlAuthType.NONE, ) # Define a CloudFormation output for your URL CfnOutput(self, "myFunctionUrlOutput", value=my_function_url.url)
Java

위치src/main/java/.../HelloCdkStack.java:

package com.myorg; // ... // Import Lambda function URL import software.amazon.awscdk.services.lambda.FunctionUrl; import software.amazon.awscdk.services.lambda.FunctionUrlAuthType; import software.amazon.awscdk.services.lambda.FunctionUrlOptions; // Import CfnOutput import software.amazon.awscdk.CfnOutput; 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); // Define the Lambda function resource // ... // Define the Lambda function URL resource FunctionUrl myFunctionUrl = myFunction.addFunctionUrl(FunctionUrlOptions.builder() .authType(FunctionUrlAuthType.NONE) .build()); // Define a CloudFormation output for your URL CfnOutput.Builder.create(this, "myFunctionUrlOutput") .value(myFunctionUrl.getUrl()) .build(); } }
C#

위치src/main/java/.../HelloCdkStack.java:

// ... namespace HelloCdk { public class HelloCdkStack : Stack { internal HelloCdkStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // Define the Lambda function resource // ... // Define the Lambda function URL resource var myFunctionUrl = myFunction.AddFunctionUrl(new FunctionUrlOptions { AuthType = FunctionUrlAuthType.NONE }); // Define a CloudFormation output for your URL new CfnOutput(this, "myFunctionUrlOutput", new CfnOutputProps { Value = myFunctionUrl.Url }); } } }
Go

위치hello-cdk.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) // Define the Lambda function resource // ... // Define the Lambda function URL resource myFunctionUrl := myFunction.AddFunctionUrl(&awslambda.FunctionUrlOptions{ AuthType: awslambda.FunctionUrlAuthType_NONE, }) // Define a CloudFormation output for your URL awscdk.NewCfnOutput(stack, jsii.String("myFunctionUrlOutput"), &awscdk.CfnOutputProps{ Value: myFunctionUrl.Url(), }) return stack } // ...
주의

이 자습서를 간단하게 하기 위해 Lambda 함수 URL은 인증 없이 정의되어 있습니다. 배포되면 함수를 호출하는 데 사용할 수 있는 공개적으로 액세스 가능한 엔드포인트가 생성됩니다. 이 자습서를 모두 마치면 다음 단계를 11단계: 애플리케이션 삭제 따라 리소스를 삭제하세요.

6단계: 템플릿 합성 CloudFormation

이 단계에서는 CDK CLI cdk synth 명령으로 CloudFormation 템플릿을 합성하여 배포를 준비합니다. 이 명령은 CDK 코드의 기본 검증을 수행하고, CDK 앱을 실행하고, CDK 스택에서 CloudFormation 템플릿을 생성합니다.

앱에 둘 이상의 스택이 포함된 경우 합성할 스택을 지정해야 합니다. 앱에 단일 스택이 포함되어 있으므로 CDK는 합성할 스택을 CLI 자동으로 감지합니다.

템플릿을 합성하지 않으면 배포 시 CDK가 이 단계를 CLI 자동으로 수행합니다. 하지만 각 배포 전에 이 단계를 실행하여 합성 오류를 확인하는 것이 좋습니다.

템플릿을 합성하기 전에 선택적으로 구문 및 유형 오류를 포착하도록 애플리케이션을 빌드할 수 있습니다. 자세한 내용은 2단계: CDK 앱 빌드하기 섹션을 참조하세요.

CloudFormation 템플릿을 합성하려면 프로젝트 루트에서 다음을 실행하세요.

$ cdk synth
참고

다음과 같은 오류가 발생하는 경우, hello-cdk 디렉터리에 있는지 확인하고 다시 시도하세요.

--app is required either in command-line, in cdk.json or in ~/.cdk.json

성공하면 CLI CDK는 YAML —형식의 CloudFormation 템플릿을 프로젝트 디렉터리에 stdout 출력하고 JSON —형식의 템플릿을 프로젝트 디렉터리에 cdk.out 저장합니다.

다음은 템플릿의 출력 예시입니다. CloudFormation

Resources: HelloWorldFunctionServiceRoleunique-identifier: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Action: sts:AssumeRole Effect: Allow Principal: Service: lambda.amazonaws.com Version: "2012-10-17" ManagedPolicyArns: - Fn::Join: - "" - - "arn:" - Ref: AWS::Partition - :iam::aws:policy/service-role/AWSLambdaBasicExecutionRole Metadata: aws:cdk:path: HelloCdkStack/HelloWorldFunction/ServiceRole/Resource HelloWorldFunctionunique-identifier: Type: AWS::Lambda::Function Properties: Code: ZipFile: " \ exports.handler = async function(event) { \ return { \ statusCode: 200, \ body: JSON.stringify('Hello World!'), \ }; \ }; \ " Handler: index.handler Role: Fn::GetAtt: - HelloWorldFunctionServiceRoleunique-identifier - Arn Runtime: nodejs20.x DependsOn: - HelloWorldFunctionServiceRoleunique-identifier Metadata: aws:cdk:path: HelloCdkStack/HelloWorldFunction/Resource HelloWorldFunctionFunctionUrlunique-identifier: Type: AWS::Lambda::Url Properties: AuthType: NONE TargetFunctionArn: Fn::GetAtt: - HelloWorldFunctionunique-identifier - Arn Metadata: aws:cdk:path: HelloCdkStack/HelloWorldFunction/FunctionUrl/Resource HelloWorldFunctioninvokefunctionurlunique-identifier: Type: AWS::Lambda::Permission Properties: Action: lambda:InvokeFunctionUrl FunctionName: Fn::GetAtt: - HelloWorldFunctionunique-identifier - Arn FunctionUrlAuthType: NONE Principal: "*" Metadata: aws:cdk:path: HelloCdkStack/HelloWorldFunction/invoke-function-url CDKMetadata: Type: AWS::CDK::Metadata Properties: Analytics: v2:deflate64:unique-identifier Metadata: aws:cdk:path: HelloCdkStack/CDKMetadata/Default Condition: CDKMetadataAvailable Outputs: myFunctionUrlOutput: Value: Fn::GetAtt: - HelloWorldFunctionFunctionUrlunique-identifier - FunctionUrl Conditions: CDKMetadataAvailable: Fn::Or: - Fn::Or: - Fn::Equals: - Ref: AWS::Region - af-south-1 - Fn::Equals: - Ref: AWS::Region - ap-east-1 - Fn::Equals: - Ref: AWS::Region - ap-northeast-1 - Fn::Equals: - Ref: AWS::Region - ap-northeast-2 - Fn::Equals: - Ref: AWS::Region - ap-south-1 - Fn::Equals: - Ref: AWS::Region - ap-southeast-1 - Fn::Equals: - Ref: AWS::Region - ap-southeast-2 - Fn::Equals: - Ref: AWS::Region - ca-central-1 - Fn::Equals: - Ref: AWS::Region - cn-north-1 - Fn::Equals: - Ref: AWS::Region - cn-northwest-1 - Fn::Or: - Fn::Equals: - Ref: AWS::Region - eu-central-1 - Fn::Equals: - Ref: AWS::Region - eu-north-1 - Fn::Equals: - Ref: AWS::Region - eu-south-1 - Fn::Equals: - Ref: AWS::Region - eu-west-1 - Fn::Equals: - Ref: AWS::Region - eu-west-2 - Fn::Equals: - Ref: AWS::Region - eu-west-3 - Fn::Equals: - Ref: AWS::Region - il-central-1 - Fn::Equals: - Ref: AWS::Region - me-central-1 - Fn::Equals: - Ref: AWS::Region - me-south-1 - Fn::Equals: - Ref: AWS::Region - sa-east-1 - Fn::Or: - Fn::Equals: - Ref: AWS::Region - us-east-1 - Fn::Equals: - Ref: AWS::Region - us-east-2 - Fn::Equals: - Ref: AWS::Region - us-west-1 - Fn::Equals: - Ref: AWS::Region - us-west-2 Parameters: BootstrapVersion: Type: AWS::SSM::Parameter::Value<String> Default: /cdk-bootstrap/unique-identifier/version Description: Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip] Rules: CheckBootstrapVersion: Assertions: - Assert: Fn::Not: - Fn::Contains: - - "1" - "2" - "3" - "4" - "5" - Ref: BootstrapVersion AssertDescription: CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.
참고

생성된 모든 템플릿에는 기본적으로 AWS::CDK::Metadata 리소스가 포함되어 있습니다. AWS CDK 팀은 이 메타데이터를 사용하여 AWS CDK 사용에 대한 통찰력을 얻고 개선 방법을 찾습니다. 버전 보고를 거부하는 방법을 비롯한 자세한 내용은 을 참조하십시오버전 보고.

는 단일 L2 구조를 정의함으로써 애플리케이션 내에서 리소스가 상호 작용하는 데 필요한 권한 및 글루 로직과 함께 Lambda 리소스를 포함하는 광범위한 CloudFormation 템플릿을 AWS CDK 생성합니다.

7단계: (선택 사항) 환경 부트스트랩

이 자습서에서는 사용자 환경에 배포해 보겠습니다. default 이 환경은 시작 프로세스 중에 구성 및 부트스트랩됩니다.

이 애플리케이션을 다른 환경에 배포하려면 CDK 코드에 환경을 지정하고 환경을 부트스트랩해야 합니다. 지침은 다음을 참조하세요.

8단계: CDK 스택 배포

이 단계에서는 CDK CLI cdk deploy 명령어를 사용하여 CDK 스택을 배포합니다. 이 명령은 생성된 CloudFormation 템플릿을 검색하여 배포하며 AWS CloudFormation, 이를 통해 리소스를 스택의 일부로 프로비저닝합니다. CloudFormation

프로젝트 루트에서 다음을 실행합니다. 메시지가 표시되면 변경 내용을 확인합니다.

$ cdk deploy ✨ Synthesis time: 2.69s HelloCdkStack: start: Building unique-identifier:current_account-current_region HelloCdkStack: success: Built unique-identifier:current_account-current_region HelloCdkStack: start: Publishing unique-identifier:current_account-current_region HelloCdkStack: success: Published unique-identifier:current_account-current_region This deployment will make potentially sensitive changes according to your current security approval level (--require-approval broadening). Please confirm you intend to make the following modifications: IAM Statement Changes ┌───┬───────────────────────────────────────┬────────┬──────────────────────────┬──────────────────────────────┬───────────┐ │ │ Resource │ Effect │ Action │ Principal │ Condition │ ├───┼───────────────────────────────────────┼────────┼──────────────────────────┼──────────────────────────────┼───────────┤ │ + │ ${HelloWorldFunction.Arn} │ Allow │ lambda:InvokeFunctionUrl │ * │ │ ├───┼───────────────────────────────────────┼────────┼──────────────────────────┼──────────────────────────────┼───────────┤ │ + │ ${HelloWorldFunction/ServiceRole.Arn} │ Allow │ sts:AssumeRole │ Service:lambda.amazonaws.com │ │ └───┴───────────────────────────────────────┴────────┴──────────────────────────┴──────────────────────────────┴───────────┘ IAM Policy Changes ┌───┬───────────────────────────────────┬────────────────────────────────────────────────────────────────────────────────┐ │ │ Resource │ Managed Policy ARN │ ├───┼───────────────────────────────────┼────────────────────────────────────────────────────────────────────────────────┤ │ + │ ${HelloWorldFunction/ServiceRole} │ arn:${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole │ └───┴───────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────┘ (NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299) Do you wish to deploy these changes (y/n)? y

마찬가지로 앱에는 단일 스택이 포함되어 있으므로 AWS CDK 스택을 지정할 필요가 없습니다. cdk synth

배포 중에는 스택이 배포될 때 CDK에 진행 정보가 CLI 표시됩니다. 완료되면 AWS CloudFormation 콘솔로 이동하여 HelloCdkStack 스택을 확인할 수 있습니다. Lambda 콘솔로 이동하여 리소스를 볼 수도 있습니다. HelloWorldFunction

배포가 완료되면 CDK가 엔드포인트 URL을 CLI 출력합니다. 다음 단계를 위해 이 URL을 복사하세요. 다음은 그 예제입니다.

... HelloCdkStack: deploying... [1/1] HelloCdkStack: creating CloudFormation changeset... ✅ HelloCdkStack ✨ Deployment time: 41.65s Outputs: HelloCdkStack.myFunctionUrlOutput = https://<api-id>.lambda-url.<Region>.on.aws/ Stack ARN: arn:aws:cloudformation:Region:account-id:stack/HelloCdkStack/unique-identifier ✨ Total time: 44.34s

9단계: 에서 애플리케이션과 상호 작용하십시오. AWS

이 단계에서는 함수 URL을 통해 Lambda 함수를 AWS 호출하여 애플리케이션과 상호 작용합니다. URL에 액세스하면 Lambda 함수가 메시지를 반환합니다. Hello World!

함수를 호출하려면 브라우저 또는 명령줄을 통해 함수 URL에 액세스하십시오. 다음은 그 예제입니다.

$ curl https://<api-id>.lambda-url.<Region>.on.aws/ "Hello World!"%

10단계: 애플리케이션 수정

이 단계에서는 Lambda 함수가 호출 시 반환하는 메시지를 수정합니다. CDK CLI cdk diff 명령을 사용하여 diff를 수행하여 변경 사항을 미리 보고 배포하여 애플리케이션을 업데이트합니다. 그런 다음 에서 애플리케이션과 상호 AWS 작용하여 새 메시지를 확인합니다.

CDK 스택 파일의 myFunction 인스턴스를 다음과 같이 수정합니다.

TypeScript

위치: lib/hello-cdk-stack.ts

// ... export class HelloCdkStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // Modify the Lambda function resource const myFunction = new lambda.Function(this, "HelloWorldFunction", { runtime: lambda.Runtime.NODEJS_20_X, // Provide any supported Node.js runtime handler: "index.handler", code: lambda.Code.fromInline(` exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello CDK!'), }; }; `), }); // ...
JavaScript

위치lib/hello-cdk-stack.js:

// ... class HelloCdkStack extends Stack { constructor(scope, id, props) { super(scope, id, props); // Modify the Lambda function resource const myFunction = new lambda.Function(this, "HelloWorldFunction", { runtime: lambda.Runtime.NODEJS_20_X, // Provide any supported Node.js runtime handler: "index.handler", code: lambda.Code.fromInline(` exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello CDK!'), }; }; `), }); // ... } } module.exports = { HelloCdkStack }
Python

위치hello_cdk/hello_cdk_stack.py:

# ... class HelloCdkStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # Modify the Lambda function resource my_function = _lambda.Function( self, "HelloWorldFunction", runtime = _lambda.Runtime.NODEJS_20_X, # Provide any supported Node.js runtime handler = "index.handler", code = _lambda.Code.from_inline( """ exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello CDK!'), }; }; """ ), ) # ...
Java

위치src/main/java/.../HelloCdkStack.java:

// ... 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); // Modify the Lambda function resource Function myFunction = Function.Builder.create(this, "HelloWorldFunction") .runtime(Runtime.NODEJS_20_X) // Provide any supported Node.js runtime .handler("index.handler") .code(Code.fromInline( "exports.handler = async function(event) {" + " return {" + " statusCode: 200," + " body: JSON.stringify('Hello CDK!')" + " };" + "};")) .build(); // ... } }
C#

// ... namespace HelloCdk { public class HelloCdkStack : Stack { internal HelloCdkStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // Modify the Lambda function resource var myFunction = new Function(this, "HelloWorldFunction", new FunctionProps { Runtime = Runtime.NODEJS_20_X, // Provide any supported Node.js runtime Handler = "index.handler", Code = Code.FromInline(@" exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello CDK!'), }; }; "), }); // ... } } }
Go

// ... type HelloCdkStackProps struct { awscdk.StackProps } 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) // Modify the Lambda function resource myFunction := awslambda.NewFunction(stack, jsii.String("HelloWorldFunction"), &awslambda.FunctionProps{ Runtime: awslambda.Runtime_NODEJS_20_X(), // Provide any supported Node.js runtime Handler: jsii.String("index.handler"), Code: awslambda.Code_FromInline(jsii.String(` exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello CDK!'), }; }; `)), }) // ...

현재 코드 변경으로 배포된 Lambda 리소스가 직접 업데이트되지는 않았습니다. 코드는 리소스의 원하는 상태를 정의합니다. 배포된 리소스를 수정하려면 CLI CDK를 사용하여 원하는 상태를 새 AWS CloudFormation 템플릿에 합성합니다. 그런 다음 새 CloudFormation 템플릿을 변경 세트로 배포합니다. 변경 세트는 원하는 새 상태에 도달하는 데 필요한 변경만 수행합니다.

변경 내용을 미리 보려면 cdk diff 명령을 실행합니다. 다음은 그 예제입니다.

$ cdk diff Stack HelloCdkStack Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff) Resources [~] AWS::Lambda::Function HelloWorldFunction HelloWorldFunctionunique-identifier └─ [~] Code └─ [~] .ZipFile: ├─ [-] exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; └─ [+] exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello CDK!'), }; }; ✨ Number of stacks with differences: 1

이 diff를 생성하기 위해 CDK는 AWS 계정 계정에 스택용 최신 AWS CloudFormation 템플릿을 CLI 쿼리합니다HelloCdkStack. 그런 다음 최신 템플릿을 앱에서 방금 합성한 템플릿과 비교합니다.

변경사항을 적용하려면 명령어를 실행하세요. cdk deploy 다음은 그 예제입니다.

$ cdk deploy ✨ Synthesis time: 2.12s HelloCdkStack: start: Building unique-identifier:current_account-current_region HelloCdkStack: success: Built unique-identifier:current_account-current_region HelloCdkStack: start: Publishing unique-identifier:current_account-current_region HelloCdkStack: success: Published unique-identifier:current_account-current_region HelloCdkStack: deploying... [1/1] HelloCdkStack: creating CloudFormation changeset... ✅ HelloCdkStack ✨ Deployment time: 26.96s Outputs: HelloCdkStack.myFunctionUrlOutput = https://unique-identifier.lambda-url.<Region>.on.aws/ Stack ARN: arn:aws:cloudformation:Region:account-id:stack/HelloCdkStack/unique-identifier ✨ Total time: 29.07s

애플리케이션과 상호 작용하려면 반복하세요9단계: 에서 애플리케이션과 상호 작용하십시오. AWS. 다음은 그 예제입니다.

$ curl https://<api-id>.lambda-url.<Region>.on.aws/ "Hello CDK!"%

11단계: 애플리케이션 삭제

이 단계에서는 CDK CLI cdk destroy 명령어를 사용하여 애플리케이션을 삭제합니다. 이 명령어는 생성한 리소스가 포함된 CDK CloudFormation 스택과 연결된 스택을 삭제합니다.

애플리케이션을 삭제하려면 cdk destroy 명령을 실행하고 애플리케이션 삭제 요청을 확인합니다. 다음은 그 예제입니다.

$ cdk destroy Are you sure you want to delete: HelloCdkStack (y/n)? y HelloCdkStack: destroying... [1/1] ✅ HelloCdkStack: destroyed

다음 단계

축하합니다! 이 자습서를 완료했으며 AWS CDK 를 사용하여 에서 리소스를 성공적으로 생성, 수정 및 AWS 클라우드삭제했습니다. 이제 를 사용할 준비가 되었습니다 AWS CDK.

선호하는 프로그래밍 AWS CDK 언어로 를 사용하는 방법에 대한 자세한 내용은 을 참조하십시오지원되는 프로그래밍 언어로 작업하기 AWS CDK.

추가 리소스는 다음을 참조하십시오.

  • CDK 워크숍을 통해 좀 더 복잡한 프로젝트와 관련된 심도 있는 투어를 즐겨보세요.

  • 선호하는 서비스에 사용할 수 있는 CDK 구조를 살펴보려면 API 레퍼런스를 참고하세요. AWS

  • Construct Hub를 방문하여 다른 사람들이 만든 AWS 구문을 찾아보세요.

  • 사용 예를 살펴보세요. AWS CDK

AWS CDK 는 오픈 소스 프로젝트입니다. 기여하려면 기여를 참조하십시오. AWS Cloud Development Kit (AWS CDK)