AWS CDK Toolkit Library 클라우드 어셈블리 소스 관리 - AWS 클라우드 개발 키트(AWS CDK) v2

CDK AWS v2 개발자 안내서입니다. 이전 CDK v1은 2022년 6월 1일에 유지 관리에 들어갔으며 2023년 6월 1일에 지원이 종료되었습니다.

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

AWS CDK Toolkit Library 클라우드 어셈블리 소스 관리

AWS CDK Toolkit Library를 사용하여 클라우드 어셈블리 소스를 구성하고 CDK 애플리케이션을 배포하는 방법을 사용자 지정합니다. 이 가이드에서는 배포 요구 사항 및 워크플로 요구 사항에 맞게 클라우드 어셈블리 소스를 구성하는 방법을 보여줍니다.

CDK Toolkit을 사용하기 전에 클라우드 어셈블리 소스를 지정합니다. 클라우드 어셈블리 소스는 CDK 앱에서 클라우드 어셈블리를 생성하는 지침을 제공합니다. 결과 클라우드 어셈블리에는 CDK Toolkit이 배포하는 합성된 인프라 아티팩트가 포함되어 있습니다 AWS.

CDK Toolkit Library는 클라우드 어셈블리 소스를 구성하는 몇 가지 접근 방식을 제공하며, 각각 다양한 시나리오 및 워크플로에 적합합니다.

클라우드 어셈블리 소스 선택

메서드 에 가장 적합 고려 사항

fromCdkApp

지원되는 모든 언어로 기존 CDK 애플리케이션 작업.

적절한 언어 런타임을 설치해야 합니다.

fromAssemblyBuilder

CDK 생성은 합성 프로세스를 완전히 제어할 수 있도록 인라인으로 구성됩니다.

CDK 기능에 대한 하위 수준의 액세스를 제공하며와 같은 다른 메서드의 사용자 지정 버전을 빌드하는 데 사용할 수 있습니다fromCdkApp.

fromAssemblyDirectory

사전 합성된 클라우드 어셈블리 사용.

합성 단계로 더 빠른 실행은 건너뜁니다.

사용자 지정 소스

완전한 사용자 지정 구현이 필요한 매우 특수한 시나리오.

ICloudAssemblySource 인터페이스를 처음부터 구현해야 하고, 컨텍스트 조회와 같은 내장 기능이 없으며, 대부분의 사용 사례에는 거의 필요하지 않습니다.

클라우드 어셈블리 소스 구성

기존 CDK 앱에서

fromCdkApp 메서드를 사용하여 지원되는 언어로 작성된 CDK 앱을 사용할 수 있습니다. 이 접근 방식은 기존 CDK 애플리케이션이 있고 프로그래밍 방식으로 배포하려는 경우에 적합합니다.

import { App } from 'aws-cdk-lib'; import { Toolkit } from '@aws-cdk/toolkit-lib'; // Create a toolkit instance const toolkit = new Toolkit(); // TypeScript app const cloudAssemblySource = await toolkit.fromCdkApp("ts-node app.ts"); // Deploy a specific stack from the assembly await toolkit.deploy(cloudAssemblySource, { stacks: ['MyStack'] }); // Other language examples: // JavaScript app // const cloudAssemblySource = await toolkit.fromCdkApp("node app.js"); // Python app // const cloudAssemblySource = await toolkit.fromCdkApp("python app.py"); // Java app // const cloudAssemblySource = await toolkit.fromCdkApp("mvn -e -q exec:java -Dexec.mainClass=com.mycompany.app.App");

인라인 어셈블리 빌더에서

어셈블리 빌더 함수를 사용하여 코드에서 직접 CDK 앱을 생성합니다. 이 접근 방식은 인프라를 인라인으로 정의하려는 간단한 배포 또는 테스트 시나리오에 유용합니다.

import { App, Stack, RemovalPolicy, StackProps } from 'aws-cdk-lib'; import { Bucket } from 'aws-cdk-lib/aws-s3'; import { Toolkit } from '@aws-cdk/toolkit-lib'; import { Construct } from 'constructs'; // Create a cloud assembly source from an inline CDK app const cloudAssemblySource = await toolkit.fromAssemblyBuilder(async () => { const app = new App(); // Define a simple stack with an S3 bucket class MyStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); // Create an S3 bucket new Bucket(this, 'MyBucket', { versioned: true, removalPolicy: RemovalPolicy.DESTROY, autoDeleteObjects: true }); } } // Instantiate the stack new MyStack(app, 'MyInlineStack'); return app.synth(); }); // Deploy using the cloud assembly source await toolkit.deploy(cloudAssemblySource, { stacks: ['MyInlineStack'] });

기존 어셈블리 디렉터리에서

이미 합성된 클라우드 어셈블리가 있는 경우 직접 사용할 수 있습니다. 이는 이미를 실행cdk synth했거나 CI/CD 파이프라인에서 생성된 클라우드 어셈블리로 작업할 때 유용합니다.

import { Toolkit } from '@aws-cdk/toolkit-lib'; // Create a toolkit instance const toolkit = new Toolkit(); // Use an existing cloud assembly directory const cloudAssemblySource = await toolkit.fromAssemblyDirectory("cdk.out"); // Deploy using the cloud assembly source await toolkit.deploy(cloudAssemblySource, { stacks: ['MyStack'] });

캐시된 클라우드 어셈블리 작업

클라우드 어셈블리로 작업할 때는 두 가지 옵션이 있습니다.

  1. 클라우드 어셈블리 소스를 직접 사용합니다(단순하지만 느릴 수 있음).

    // Each operation triggers a new synthesis await toolkit.deploy(cloudAssemblySource, { /* options */ }); await toolkit.list(cloudAssemblySource, { /* options */ });
  2. 클라우드 어셈블리를 캐시합니다(여러 작업의 경우 더 빠름).

    // Synthesize once and reuse const cloudAssembly = await toolkit.synth(cloudAssemblySource); try { // Multiple operations use the same assembly await toolkit.deploy(cloudAssembly, { /* options */ }); await toolkit.list(cloudAssembly, { /* options */ }); } finally { // Clean up when done await cloudAssembly.dispose(); }

다음과 같은 경우 캐시된 어셈블리를 사용합니다.

  • 여러 작업(배포, 목록, 차이 등)을 수행하고 있습니다.

  • CDK 앱은 작업 중에 자주 변경되지 않습니다.

  • 더 빠른 성능을 원합니다.

다음과 같은 경우 클라우드 어셈블리 소스를 직접 사용합니다.

  • 단일 작업을 수행하고 있습니다.

  • CDK 앱은 자주 변경됩니다.

  • 더 간단한 코드를 원하며 도구 키트 작업 속도를 우선시할 필요가 없습니다.

중요

대부분의 도구 키트 상호 작용은 성능 향상을 위해 캐시된 어셈블리를 사용해야 합니다. 캐싱을 방지하는 유일한 방법은 소스가 자주 변경되고 변경 사항을 확인하는 데 비용이 많이 드는 경우입니다.

클라우드 어셈블리를 생성, 캐시 및 재사용하는 방법

클라우드 어셈블리 소스를 생성한 후 클라우드 어셈블리를 합성하여 생성할 수 있습니다. 클라우드 어셈블리에는 배포에 필요한 AWS CloudFormation 템플릿과 자산이 포함되어 있습니다.

클라우드 어셈블리를 한 번 생성하고 여러 Toolkit 작업에 재사용하는 것이 좋습니다. 이 캐싱 접근 방식은 각 작업에 대한 어셈블리를 재생성하는 것보다 더 효율적입니다. 소스가 자주 변경되는 경우에만 어셈블리를 다시 생성하는 것이 좋습니다.

캐시된 클라우드 어셈블리를 생성하는 방법은 다음과 같습니다.

// Generate a cloud assembly from your source const cloudAssembly = await toolkit.synth(cloudAssemblySource);

그런 다음 캐시된 클라우드 어셈블리에서 , list() deploy()및와 같은 다양한 도구 키트 작업을 수행할 수 있습니다diff(). 클라우드 어셈블리를 캐싱하면 합성이 한 번만 수행되므로 후속 Toolkit 작업이 더 빠르게 수행됩니다. 자세한 내용은 synth - Generate cloud assembly를 참조하세요.

클라우드 어셈블리 리소스 폐기

클라우드 어셈블리를 사용하여 임시 리소스를 정리한 후에는 항상 클라우드 어셈블리를 폐기하십시오. 특히 여러 작업을 수행할 때 적절한 정리를 보장하려면 try/finally 블록을 사용하는 것이 좋습니다.

// Generate a cloud assembly const cloudAssembly = await toolkit.synth(cloudAssemblySource); try { // Use the cloud assembly for multiple operations await toolkit.list(cloudAssembly); await toolkit.deploy(cloudAssembly); } finally { // Always dispose when done await cloudAssembly.dispose(); }

다음은 캐시된 클라우드 어셈블리를 생성하고 폐기하는 방법을 보여주는 예제입니다.

import { Toolkit } from '@aws-cdk/toolkit-lib'; const toolkit = new Toolkit(); // Create cloud assembly source from a CDK app const cloudAssemblySource = await toolkit.fromCdkApp("ts-node app.ts"); // Create cloud assembly from source const cloudAssembly = await toolkit.synth(cloudAssemblySource); try { // List stacks in the assembly await toolkit.list(cloudAssembly); // Check for changes await toolkit.diff(cloudAssembly); // Deploy if needed await toolkit.deploy(cloudAssembly); } finally { // Always dispose when done await cloudAssembly.dispose(); }

클라우드 어셈블리 수명 이해

를 사용하여 캐시된 클라우드 어셈블리를 생성할 때 읽기 가능한 CloudAssembly와의 역할을 하는 특수 유형을 얻게 synth()됩니다CloudAssemblySource. 이 캐시된 어셈블리(예: 목록 또는 배포 작업)에서 생성된 모든 클라우드 어셈블리는 상위의 수명과 연결됩니다.

  • 상위의 dispose() 호출만 실제로 리소스를 정리합니다.

  • 목록/배포 작업의 클라우드 어셈블리는 상위에서 관리됩니다.

  • 캐시된 클라우드 어셈블리를 폐기하지 못하면 버그로 간주됩니다.

클라우드 어셈블리 소스 모범 사례

클라우드 어셈블리 소스로 작업할 때는 다음 모범 사례를 고려하세요.

  • 올바른 소스 방법 선택: 워크플로 및 요구 사항에 가장 적합한 접근 방식을 선택합니다.

  • 캐시 클라우드 어셈블리:를 사용하여 클라우드 어셈블리를 한 번 생성하고 여러 작업에 synth() 재사용하여 불필요한 합성, 특히 대규모 애플리케이션의 경우 불필요한 합성을 방지합니다.

  • 오류 처리: 기본 오류 처리를 구현하여 오류를 포착하고 사용자에게 표시합니다. 오류를 간단하게 처리하고 명확한 오류 메시지를 제공하는 데 집중하세요.

  • 버전 호환성: CDK Toolkit Library 버전이 작업 중인 클라우드 어셈블리를 지원할 수 있는지 확인합니다. 클라우드 어셈블리를 생성하는 데 사용되는 Construct Library가 Toolkit Library에서 지원하는 것보다 최신인 경우 오류가 발생합니다.

  • 환경 변수: 특정 환경 변수는 클라우드 어셈블리 합성 및 배포에 영향을 미칠 수 있습니다. CDK_DEFAULT_ACCOUNT, CDK_OUTDIR, 및 CDK_DEFAULT_REGION와 같은 변수는 기본 동작을 재정의CDK_CONTEXT_JSON할 수 있습니다. 배포 환경에 맞게 적절하게 설정되어 있는지 확인합니다.

다음 예제에서는 여러 작업에 클라우드 어셈블리를 재사용하면서 오류 처리 및 적절한 정리를 구현하는 방법을 보여줍니다.

import { Toolkit } from '@aws-cdk/toolkit-lib'; // Example with error handling and proper cleanup async function deployInfrastructure(): Promise<void> { let cloudAssembly; try { // Generate a cloud assembly once cloudAssembly = await toolkit.synth(cloudAssemblySource); // Reuse the same cloud assembly for multiple operations await toolkit.list(cloudAssembly); // Uses existing assembly await toolkit.deploy(cloudAssembly); // Uses existing assembly await toolkit.diff(cloudAssembly); // Uses existing assembly } catch (error) { console.error("Failed to deploy:", error); } finally { // Always dispose when done if (cloudAssembly) { await cloudAssembly.dispose(); } } } // Call the async function deployInfrastructure().catch(error => { console.error("Deployment failed:", error); process.exit(1); });

잠재적 문제 해결

다음 단계에 따라 클라우드 어셈블리 소스의 잠재적 문제를 해결합니다.

  • 누락된 종속성 설치:를 실행npm install하여 CDK 앱에 필요한 종속성을 설치합니다.

  • 경로 문제 해결: CDK 앱 및 어셈블리 디렉터리에 대한 경로가 존재하고 액세스할 수 있는지 확인합니다.

  • 버전 불일치 해결: CDK 앱 버전과 일치하도록 CDK Toolkit Library 버전을 업데이트합니다.

  • 합성 오류 수정: CDK 앱 코드에서 구문 오류 또는 잘못된 구성을 검토합니다.

도구 키트 작업 중에 오류가 발생하면 오류 처리를 단순하게 유지하고 사용자에게 명확한 오류 메시지를 제공하는 데 집중하세요. 클라우드 어셈블리를 사용한 후에는 항상 폐기하십시오. 다음은 적절한 정리를 통한 기본 오류 처리를 보여주는 예입니다.

import { Toolkit } from '@aws-cdk/toolkit-lib'; // Example with simple error handling try { // Create the cloud assembly source const cloudAssemblySource = await toolkit.fromCdkApp("ts-node app.ts"); // Synthesize the cloud assembly const cloudAssembly = await toolkit.synth(cloudAssemblySource); // Use the cloud assembly await toolkit.list(cloudAssembly); } catch (error) { // Display the error message console.error("Operation failed:", error.message); } finally { // Clean up resources await cloudAssembly.dispose(); }