v AWS CDK 2 개발자 안내서입니다. 이전 CDK v1은 2022년 6월 1일에 유지 관리에 들어갔으며 2023년 6월 1일에 지원이 종료되었습니다.
기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
자산은 AWS CDK 라이브러리 및 앱에 번들로 제공할 수 있는 로컬 파일, 디렉터리 또는 도커 이미지입니다. 예를 들어 자산은 AWS Lambda 함수의 핸들러 코드가 포함된 디렉터리일 수 있습니다. 자산은 앱이 작동하는 데 필요한 모든 아티팩트를 나타낼 수 있습니다.
다음 자습서 동영상에서는 CDK 자산에 대한 포괄적인 개요를 제공하고 코드형 인프라(IaC)에서 CDK 자산을 사용하는 방법을 설명합니다.
특정 AWS 구문에 의해 노출되는 APIs를 통해 자산을 추가합니다. 예를 들어, lambda.Function 구문을 정의할 때 code 속성을 사용하면 asset(디렉터리)을 전달할 수 있습니다. Function
은 자산을 사용하여 디렉터리의 내용을 묶고 함수의 코드에 사용합니다. 마찬가지로 ecs.ContainerImage.fromAsset은 Amazon ECS 태스크 정의 시 로컬 디렉터리에서 빌드된 Docker 이미지를 사용합니다.
자산 세부 정보
앱에서 자산을 참조할 때 애플리케이션에서 합성된 클라우드 어셈블리에는 AWS CDK CLI에 대한 지침과 함께 메타데이터 정보가 포함됩니다. 지침에는 로컬 디스크에서 자산을 찾을 수 있는 위치와 압축할 디렉터리(zip) 또는 빌드할 Docker 이미지와 같이 자산 유형에 따라 수행할 번들링 유형이 포함됩니다.
는 자산에 대한 소스 해시를 AWS CDK 생성합니다. 이는 구성 시 자산의 내용이 변경되었는지 여부를 확인하는 데 사용할 수 있습니다.
기본적으로는 클라우드 어셈블리 디렉터리에 자산의 사본을 AWS CDK 생성합니다.이 디렉터리는 소스 해시 cdk.out
아래에 기본적으로 로 설정됩니다. 이렇게 하면 클라우드 어셈블리가 자체 포함되므로 배포를 위해 다른 호스트로 옮겨져도 계속 배포할 수 있습니다. 세부 정보는 클라우드 어셈블리 섹션을 참조하세요.
가 자산을 참조하는 앱을 AWS CDK 배포하면(앱 코드를 통해 직접 또는 라이브러리를 통해) AWS CDK CLI는 먼저 자산을 준비하고 Amazon S3 버킷 또는 Amazon ECR 리포지토리에 게시합니다. 게시합니다(S3 버킷 또는 리포지토리는 부트스트래핑 중 생성됨). 그런 다음에야 스택에 정의된 리소스가 배포됩니다.
이 섹션에서는 프레임워크에서 사용할 수 있는 하위 수준 API를 설명합니다.
자산 유형
는 다음과 같은 유형의 자산을 AWS CDK 지원합니다.
- Amazon S3 자산
-
이는가 Amazon S3에 AWS CDK 업로드하는 로컬 파일 및 디렉터리입니다.
- Docker 이미지
-
이는가 Amazon ECR에 AWS CDK 업로드하는 Docker 이미지입니다.
다음 섹션에서는 이러한 자산 유형을 설명합니다.
Amazon S3 자산
로컬 파일과 디렉터리를 자산으로 정의할 수 있으며, aws-s3-assets 모듈을 통해 이를 AWS CDK 패키징하고 Amazon S3에 업로드합니다. Amazon S3 https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3_assets-readme.html
다음 예에서는 로컬 디렉터리 자산과 파일 자산을 정의합니다.
import { Asset } from 'aws-cdk-lib/aws-s3-assets';
// Archived and uploaded to Amazon S3 as a .zip file
const directoryAsset = new Asset(this, "SampleZippedDirAsset", {
path: path.join(__dirname, "sample-asset-directory")
});
// Uploaded to Amazon S3 as-is
const fileAsset = new Asset(this, 'SampleSingleFileAsset', {
path: path.join(__dirname, 'file-asset.txt')
});
대부분의 경우 aws-s3-assets
모듈의 API를 직접 사용할 필요가 없습니다. aws-lambda
와 같이 자산을 지원하는 모듈에는 자산을 사용할 수 있도록 편의 메서드가 있습니다. Lambda 함수의 경우 fromAsset() 정적 메서드를 사용하면 로컬 파일 시스템의 디렉터리나 .zip 파일을 지정할 수 있습니다.
Lambda 함수 예
일반적인 사용 사례는 핸들러 코드를 Amazon S3 자산으로 사용하여 Lambda 함수를 생성하는 것입니다.
다음 예에서는 Amazon S3 자산을 사용하여 로컬 디렉터리 handler
에서 Python 핸들러를 정의합니다. 또한 로컬 디렉터리 자산을 code
속성으로 사용하여 Lambda 함수를 생성합니다. 다음은 핸들러의 Python 코드입니다.
def lambda_handler(event, context):
message = 'Hello World!'
return {
'message': message
}
기본 AWS CDK 앱의 코드는 다음과 같아야 합니다.
import * as cdk from 'aws-cdk-lib';
import { Constructs } from 'constructs';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as path from 'path';
export class HelloAssetStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
new lambda.Function(this, 'myLambdaFunction', {
code: lambda.Code.fromAsset(path.join(__dirname, 'handler')),
runtime: lambda.Runtime.PYTHON_3_6,
handler: 'index.lambda_handler'
});
}
}
Function
메서드는 자산을 사용하여 디렉터리의 내용을 번들링하고 함수의 코드에 사용합니다.
작은 정보
Java .jar
파일은 확장자가 다른 ZIP 파일입니다. 이러한 파일은 Amazon S3에 있는 그대로 업로드되지만 Lambda 함수로 배포되면 포함된 파일이 의도치 않게 추출됩니다. 이를 방지하려면 디렉터리에 .jar
파일을 배치하고 디렉터리를 자산으로 지정합니다.
Deploy-time 속성 예
Amazon S3 자산 유형은 AWS CDK 라이브러리 및 앱에서 참조할 수 있는 배포 시간 속성도 노출합니다. AWS CDK CLI 명령은 자산 속성을 AWS CloudFormation 파라미터로 cdk synth 표시합니다.
다음 예에서는 deploy-time 속성을 사용하여 이미지 자산의 위치를 Lambda 함수에 환경 변수로 전달합니다. (파일 종류는 중요하지 않습니다. 여기에 사용된 PNG 이미지는 예시일 뿐입니다.)
import { Asset } from 'aws-cdk-lib/aws-s3-assets';
import * as path from 'path';
const imageAsset = new Asset(this, "SampleAsset", {
path: path.join(__dirname, "images/my-image.png")
});
new lambda.Function(this, "myLambdaFunction", {
code: lambda.Code.asset(path.join(__dirname, "handler")),
runtime: lambda.Runtime.PYTHON_3_6,
handler: "index.lambda_handler",
environment: {
'S3_BUCKET_NAME': imageAsset.s3BucketName,
'S3_OBJECT_KEY': imageAsset.s3ObjectKey,
'S3_OBJECT_URL': imageAsset.s3ObjectUrl
}
});
권한
aws-s3-assets 모듈, IAM 역할, 사용자 또는 그룹을 통해 Amazon S3 자산을 직접 사용하고 런타임에 자산을 읽어야 하는 경우 asset.grantRead 메서드를 통해 해당 자산에 IAM 권한을 부여합니다.
다음 예에서는 IAM 그룹에 파일 자산에 대한 읽기 권한을 부여합니다.
import { Asset } from 'aws-cdk-lib/aws-s3-assets';
import * as path from 'path';
const asset = new Asset(this, 'MyFile', {
path: path.join(__dirname, 'my-image.png')
});
const group = new iam.Group(this, 'MyUserGroup');
asset.grantRead(group);
Docker 이미지 자산
는 aws-ecr-assets 모듈을 통해 로컬 Docker 이미지를 자산으로 번들링하는 것을 AWS CDK 지원합니다.
다음 예에서는 로컬에서 빌드되어 Amazon ECR로 푸시되는 Docker 이미지를 정의합니다. 이미지는 로컬 Docker 컨텍스트 디렉터리(Dockerfile 사용)에서 빌드되며 AWS CDK CLI 또는 앱의 CI/CD 파이프라인을 통해 Amazon ECR에 업로드됩니다. 이미지는 AWS CDK 앱에서 자연스럽게 참조할 수 있습니다.
import { DockerImageAsset } from 'aws-cdk-lib/aws-ecr-assets';
const asset = new DockerImageAsset(this, 'MyBuildImage', {
directory: path.join(__dirname, 'my-image')
});
my-image
디렉터리에 Dockerfile이 있어야 합니다. AWS CDK CLI는에서 Docker 이미지를 빌드하고 Amazon ECR 리포지토리로 my-image
푸시한 다음 리포지토리의 이름을 스택의 파라미터로 AWS CloudFormation 지정합니다. 도커 이미지 자산 유형은 AWS CDK 라이브러리 및 앱에서 참조할 수 있는 배포 시간 속성을 노출합니다. AWS CDK CLI 명령은 자산 속성을 AWS CloudFormation 파라미터로 cdk synth 표시합니다.
Amazon ECS 태스크 정의 예
일반적인 사용 사례는 Amazon ECS TaskDefinition을 생성하여 Docker 컨테이너를 실행하는 것입니다. 다음 예제에서는가 로컬로 AWS CDK 빌드하고 Amazon ECR로 푸시하는 Docker 이미지 자산의 위치를 지정합니다.
import * as ecs from 'aws-cdk-lib/aws-ecs';
import * as ecr_assets from 'aws-cdk-lib/aws-ecr-assets';
import * as path from 'path';
const taskDefinition = new ecs.FargateTaskDefinition(this, "TaskDef", {
memoryLimitMiB: 1024,
cpu: 512
});
const asset = new ecr_assets.DockerImageAsset(this, 'MyBuildImage', {
directory: path.join(__dirname, 'my-image')
});
taskDefinition.addContainer("my-other-container", {
image: ecs.ContainerImage.fromDockerImageAsset(asset)
});
Deploy-time 속성 예
다음 예제에서는 배포 시간 속성을 사용하고 AWS Fargate 시작 유형으로 Amazon ECS 작업 정의를 repository
imageUri
생성하는 방법을 보여줍니다. Amazon ECR 리포지토리 조회에는 이미지의 URI가 아닌 태그가 필요하므로 자산 URI의 끝부분에서 태그를 잘라냅니다.
import * as ecs from 'aws-cdk-lib/aws-ecs';
import * as path from 'path';
import { DockerImageAsset } from 'aws-cdk-lib/aws-ecr-assets';
const asset = new DockerImageAsset(this, 'my-image', {
directory: path.join(__dirname, "..", "demo-image")
});
const taskDefinition = new ecs.FargateTaskDefinition(this, "TaskDef", {
memoryLimitMiB: 1024,
cpu: 512
});
taskDefinition.addContainer("my-other-container", {
image: ecs.ContainerImage.fromEcrRepository(asset.repository, asset.imageUri.split(":").pop())
});
빌드 인수 예
AWS CDK CLI가 배포 중에 이미지를 빌드할 때 buildArgs
(Python: build_args
) 속성 옵션을 통해 Docker 빌드 단계에 대한 사용자 지정 빌드 인수를 제공할 수 있습니다.
const asset = new DockerImageAsset(this, 'MyBuildImage', {
directory: path.join(__dirname, 'my-image'),
buildArgs: {
HTTP_PROXY: 'http://10.20.30.2:1234'
}
});
권한
aws-ecs와 같이 Docker 이미지 자산을 지원하는 모듈을 사용하는 경우 자산을 직접 사용하거나 ContainerImage.fromEcrRepository(Python: from_ecr_repository
)를 통해 자산을 사용할 때가 권한을 AWS CDK 관리합니다. Docker 이미지 자산을 직접 사용하는 경우 소비 위탁자에게 이미지를 가져올 수 있는 권한이 있는지 확인하세요.
대부분의 경우 asset.repository.grantPull 메서드(Python: grant_pull
. 이렇게 하면 보안 주체의 IAM 정책이 수정되어이 리포지토리에서 이미지를 가져올 수 있습니다. 이미지를 가져오는 보안 주체가 동일한 계정에 있지 않거나 계정에서 역할을 수임하지 않는 AWS 서비스(예: AWS CodeBuild)인 경우 보안 주체의 정책이 아닌 리소스 정책에 대한 풀 권한을 부여해야 합니다. asset.repository.addToResourcePolicy 메서드(Python: add_to_resource_policy
)를 사용하여 적절한 보안 주체 권한을 부여합니다.
AWS CloudFormation 리소스 메타데이터
참고
이 섹션은 구문 작성자에만 해당됩니다. 특정 상황에서는 도구가 특정 CFN 리소스가 로컬 자산을 사용하고 있는지 알아야 합니다. 예를 들어 디버깅을 위해 AWS SAM CLI를 사용하여 로컬에서 Lambda 함수를 호출할 수 있습니다. 세부 정보는 AWS SAM 통합 섹션을 참조하세요.
이러한 사용 사례를 활성화하기 위해 외부 도구는 AWS CloudFormation 리소스에 대한 메타데이터 항목 세트를 참조합니다.
-
aws:asset:path
– 자산의 로컬 경로를 가리킵니다. -
aws:asset:property
- 자산이 사용되는 리소스 속성의 이름입니다.
도구는 이 두 메타데이터 항목을 사용하여 특정 리소스에서 자산이 사용되고 있음을 식별하고 고급 로컬 환경을 활성화할 수 있습니다.
리소스에 이러한 메타데이터 항목을 추가하려면 asset.addResourceMetadata
(Python: add_resource_metadata
) 메서드를 사용합니다.