CDK - Assets

 Asset 은 AWS CDK 앱에 번들로 제공될 수 있는 로컬파일, 디렉토리 또는 Docker 이미지입니다.

예를 들어 AWS Lambda 함수의 핸들러 코드가 포함된 디렉터리입니다.

Assets in Details

AWS CDK는 자산에 대한 소스 해시를 생성하며 생성시 자산의 내용이 변경 되었는지 여부를 확인하는데 사용합니다.

Asset Types

AWS CDK 는 다음 유형의 자산을 지원합니다.

  1. AWS S3 Assets : aws cdk가 S3에 업로드하는 로컬 파일 및 디렉터리
  2. Docker Image : aws cdk가 ECR에 업로드하는 Docker 이미지

Amazon S3 Assets

로컬파일과 디렉터리를 아래와 같이 asset으로 정의할 수 있습니다.

aws cdk는 asset을 amazon s3에 업로드 할 수 있습니다.

import { Asset } from '@aws-cdk/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')
});

Lambda Function Example

람다 함수를 asset으로 사용하는 예는 다음과 같습니다.

아래와 같이 index 파일의 이름이 'lambda_handler'인 람다 함수가 있습니다.

def lambda_handler(event, context):
  message = 'Hello World!'
  return {
    'message': message
  }

Lambda의 Function 메소드는 asset을 사용하여 디렉터리의 컨텐츠를 묶고 함수 코드에 사용합니다.

import * as cdk from '@aws-cdk/core';
import * as lambda from '@aws-cdk/aws-lambda';
import * as path from 'path';
 
export class HelloAssetStack extends cdk.Stack {
  constructor(scope: cdk.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'
    });
  }
}

Deploy-Time Attributes Example

Amazon S3 asset 은 AWS CDK app 이 참조할수 있는 deploy-time attributes 를 제공합니다.

다음 예제는 deploy-time attributes 를 사용하여 lambda 함수에 환경 변수로 전달합니다.

import { Asset } from '@aws-cdk/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_URL': imageAsset.s3Url
  }
});

Permissions

IAM 역할, 사용자 또는 그룹을 통해 Amazon S3 asset을 직접 사용하고 런타임에 asset를 읽어아 하는 경우 asset.grantRead 메서드를 통해 해당 자산 IAM 권한을 부여하십시오. 다음 예제는 IAM 그룹에 파일 asset에 대한 읽기 권한을 부여합니다.

import { Asset } from '@aws-cdk/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 Image Assets

AWS CDK는 로컬 Docker 이미지를 자산으로 지원합니다.

다음 예제는 로컬로 빌드되어 Amazon ECR로 푸시되는 도커 이미지를 정의합니다.

이미지는 로컬 Docker 컨텍스트 디렉토리에서 빌드되고, AWS CDK CLI 또는 앱의 CI / CD 파이프라인을 통해 Amazon ECR에 업로드되며 AWS CDK App 에서 편하게 참조할 수 있습니다.

import { DockerImageAsset } from '@aws-cdk/aws-ecr-assets';
 
const asset = new DockerImageAsset(this'MyBuildImage', {
  directory: path.join(__dirname, 'my-image')
});

my-image 디렉토리에는 Dockerfile 을 포함해야 합니다.

AWS CDK CLI는 my-image 디렉토리에서 Docker 이미지를 빌드하고 이를 Amazon ECR 저장소에 푸시하고 저장소 이름을 AWS CloudFormation 파라미터로 스택에 저장합니다. Docker 이미지 자산 유형은 AWS CDK App에서 참조할 수 있습니다.

Amazon ECS Task Definition Example

Docker 이미지를 사용하기 위해 Amazon ECS TaskDefinition을 생성합니다.

다음예제는 AWS CDK가 로컬로 빌드하고 Amazon ECR로 푸시하는 Docker 이미지 asset의 위치를 지정합니다.

import * as ecs from '@aws-cdk/aws-ecs';
import * as path from 'path';
 
const taskDefinition = new ecs.FargateTaskDefinition(this"TaskDef", {
  memoryLimitMiB: 1024,
  cpu: 512
});
 
taskDefinition.addContainer("my-other-container", {
  image: ecs.ContainerImage.fromAsset(path.join(__dirname, "..""demo-image"))
});

Deploy-Time Attributes Example

다음 예제는 deploy-time attribute인 repository 와 imageUri 를 사용한 예제입니다.


import * as ecs from '@aws-cdk/aws-ecs';
import * as path from 'path';
import { DockerImageAsset } from '@aws-cdk/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)
});

Build Argument Example

buildArgs 프로퍼티를 이용해 사용자 정의된 빌드 argument를 Docker 빌드 시점에 제공해줄 수 있습니다.

const asset = new DockerImageAsset(this'MyBuildImage', {
  directory: path.join(__dirname, 'my-image'),
  buildArgs: {
    HTTP_PROXY: 'http://10.20.30.2:1234'
  }
});


댓글

이 블로그의 인기 게시물

dailyFocus - Frontend

About VPC