BLOG
대부분의 실제 작업 애플리케이션에서 AWS 배치 및 AWS 클라우드 개발 키트(CDK) 가 포함된 사용자 지정 Docker 이미지를 사용하여 복잡한 작업을 효율적으로 실행할 수 있습니다. AWS CDK는 TypeScript, JavaScript, Python, C#, Java 등 익숙한 프로그래밍 언어를 사용하여 클라우드 애플리케이션 리소스를 모델링하고 프로비저닝하는 오픈 소스 소프트웨어 개발 프레임워크입니다.
본 블로그 글에선 CloudFormation 대신 C#를 사용한 Microsoft .NET과 함께 AWS CDK 기능을 최대한으로 활용해 보겠습니다.
개요
오늘은 Docker 이미지와 Amazon S3, AWS Lambda, Amazon DynamoDB 및 AWS Batch를 사용한 파일 프로세싱 도입을 보여드립니다. 본 시나리오에서 사용자는 CSV 파일을 Amazon S3 버킷에 업로드하며, 이 버킷은 AWS Batch에서 작업으로 처리합니다. 해당 작업은 도커 컨테이너로 패키징될 수 있으며 Amazon EC2 및 Amazon ECS를 사용하여 실행됩니다. 이를 위해 다음의 단계들을 밟습니다.
- AWS CDK는 CloudFormation 템플릿을 부팅하고 배포합니다.
- 인프라는 CSV 파일을 저장하는 S3 버킷을 시작합니다. 이 애플리케이션 오케스트레이션에 필요한 다른 AWS 서비스도 스핀업됩니다.
- Amazon S3 파일 이벤트 알림은 AWS 배치 작업을 시작하는 AWS 람다 기능을 실행합니다.
- AWS Batch는 Docker 컨테이너로 작업을 실행합니다.
- Python 기반 프로그램은 S3 버킷의 내용을 읽고 각 행을 구문 분석하며 Amazon DynamoDB 테이블을 업데이트합니다.
- Amazon DynamoDB는 CSV에서 처리된 각 행을 저장합니다.
전제조건
∙ 도커가 컴퓨터에 설치되어 실행 중인지 확인합니다. 자세한 내용은 Docker Desktop and Desktop Enterprise 를 참고하시기 바랍니다.
∙ AWS CLI를 설정하십시오. 자세한 내용은 Getting Started (AWS CLI)을 참고해 주십시오.
솔루션 단계
∙ 코드를 다운로드하고 Microsoft Dotnet 빌드 및 AWS CDK 배포 명령(아래 명령어 참조)을 실행하여 필요한 인프라를 생성합니다.
∙ CSV를 S3 버킷에 놓습니다(Batch Operation에서 구문 분석할 샘플 Sample.csv 제공).
∙ 작업이 실행되고 푸시된 컨테이너 이미지를 기반으로 작업을 수행하는지 확인합니다. 작업은 CSV 파일을 구문 분석하고 각 행을 DynamicoDB에 추가합니다.
코드가 다운로드되면 잠시 시간을 내어 C# 코드를 사용한 CDK로 인프라를 보다 간편하게 구현할 수 있는 방법을 확인해 보시기 바랍니다. Visual Studio Code또는 즐겨찾기 IDE를 사용하여 폴더(aws-netcore-app-using-batch)를 열 수 있습니다. 제공된 소스 코드는 다음과 같은 주요 구성 요소로 구성됩니다. 아래 제공된 구성 요소에 해당되는 다운로드 경로를 기록해 두십시오.
∙ 인프라를 구축하기 위한 Microsoft .NET CDK (aws-netcore-app-using-batch/doe/src/MyApp)
∙ CDK가 빌드할 리소스의 일부인 Python Lambda code (aws-netcore-app-using-batch/code/resources)
∙ AWS Batch가 실행할 Python Batch 프로세서 코드와 Dockerfile (aws-netcore-app-using-batch/code/src/BatchProcessor)
“/aws-netcore-app-using-batch/cdk/src/MyApp/SrcStack.cs” 파일을 엽니다. 아래 코드(github 솔루션에서 코드 조각 제공)는 필요한 CIDR 및 가용성 영역 수에 대해 VPC를 회전시킵니다.
IVpc todoVpc = new Vpc(this, Constants.VPC_NAME, new VpcProps{
Cidr = Constants.CIDR_RANGE,
MaxAzs = 4
});
마찬가지로 개발자는 CDK Constructs를 구현할 수 있는 옵션을 선택할 수 있으며, AWS 서비스를 정의하고 배포할 수 있습니다. 아래의 코드 조각에서 배치 서비스 역할은 구성을 구현하여 생성되고 IAM 역할을 반환합니다. 전체 소스는 /aws-netcore-app-using-batch/cdk/src/MyApp/Modules/BatchServiceRole.cs에서 확인하실 수 있습니다.
public sealed class BatchServiceRole: Construct {
…
…
public BatchServiceRole(Construct scope, string id): base(scope, id){
this.scope = scope;
this.id = id;
this.Role = GetRole(
…
…
);
}
고려 사항
∙ 본 예제에서는 CloudFormation 대신 Microsoft .NET C# AWS CDK를 사용합니다. AWS CDK 설명서에서CDK로 지원되는 다른 프로그래밍 언어와 그 사용법을 확인하실 수 있습니다.
∙ 본 예제에서는 Lambda Function용으로 패키징된 Python 코드를 사용합니다. 이를 다른 프로그래밍 언어로 코딩할 수 있습니다.
∙ AWS Batch Processing의 경우 CDK로 구축되는 ImageAssets를 사용하여 Python 코드 & Docker 파일이 제공됩니다. Container Image는 CDK 명령 실행의 일부로 패키징되어 푸시됩니다. 이 Python 코드는 ECR에서 실행되며 결국 S3 파일을 파싱하여 Dynamo에 푸시합니다. 본 예제에서는Python을 사용해 만들고 있습니다. 이는 컨테이너화될 수 있는 다른 프로그래밍 언어로도 코딩될 수 있습니다.
∙ 본 예제에서는 배치를 위한 Optimal Instances를 사용합니다. a1.medium 인스턴스는 배치 작업에 도입된 저렴한 인스턴스 유형이지만 필요에 따라 모든 AWS 배치 지원 인스턴스 유형을 사용할 수 있습니다.
∙ 더 많은 양의 CSV 파일 내용을 처리하려면 멀티스레드 또는 멀티프로세싱 프로그래밍을 수행하여 AWS Batch 성능 척도를 보완해 주십시오.
∙ .본 예제에서는 NET Core 3.1, AWS CDK version 1.32.2, developer preview for .NET이 사용됩니다(작성 시 사용 가능). 새로운 버전이 출시된다면 신규 버전으로 다른 기능을 사용할 수 있습니다. 단 이 때 이전에 구축된 것이 삭제될 수 있으므로 주의해 주십시오.
배포 시 AWS CDK는 다음과 같은 인프라를 생성합니다.
사용자는 github에서 소스를 다운로드할 수 있습니다. 아래의 단계들은 다운로드한 코드를 사용하는 법을 설명합니다. 여기에는 인프라를 스핀업 하는 AWS CDK의 소스 코드가 포함됩니다. 또한 람다 Python 코드와 배치 Python 애플리케이션(.py 파일)이 제공됩니다. 배치에서 처리할 샘플 CSV 파일이 제공됩니다. 선택적으로 아래 git 명령을 사용하여 아래와 같이 저장소를 복제할 수 있습니다. 이것이 SOUCE_REPOSITION이 됩니다.
$ git clone https://github.com/aws-samples/aws-netcore-app-using-batch
$ cd aws-netcore-app-using-batch
$ dotnet build src
$ cdk bootstrap
$ cdk deploy –require-approval never
참고: 선택적으로, 위의 단계를 처리하는 “cdk” 폴더 내의 코드 베이스의 일부로 제공되는 “run.sh” 스크립트/파일도 사용할 수 있습니다. 이전 CDK Deploy 명령이 성공적으로 완료되면 두 개의 CloudFormation 스택이 생성됩니다. 잠시 시간을 내어 주요 구성 요소를 확인해 주십시오. CloudFormation 스택은 AWS Management Console에서 볼 수 있는 다음 리소스를 회전합니다. 생성되는 샘플 스택 리소스를 찾아 주십시오. 이 값은 “Constants.cs” 파일에 스택_PREFIX 변수가 있는 경우 변경할 수 있습니다.
- CloudFormation
- CDK Toolkit
- Stack – netcore-cdk-batch-app
- EC2 (Compute Infrastructure)
- netcore-batch-compute-environment-asg-<guid>
- S3 Bucket
- netcore-batch-processing-job-<account_number>
- ECR
- netcore-cdk-batch-app-repository
- Dynamo Table
- netcore-cdk-batch-app-table
- AWS Batch Job Queue
- netcore-batch-job-queue Job Definition – netcore-batch-job-definition
- Lambda Function
- netcore-lambda-batch-processing-function
CDK 구조를 사용하여 위의 인프라를 구축하고 솔루션을 공용 로드 밸런서와 통합했습니다. 이 스택의 출력은 상태 점검 및 API 유효성 검사를 위한 API URL을 제공합니다. CDK를 사용하여 솔루션을 정의하면 다음과 같은 이점들을 얻을 수 있습니다.
∙ 객체 지향 기법을 사용한 시스템 모델 작성
∙ 프로젝트를 논리 모듈로 구성
∙ IDE에서 코드 완료로 시간 절약
CDK 접근 방식을 사용하는 다른 주요 이점들은 다음과 같습니다. 개발자나 개발팀이라면 이를 통해 다음과 같은 이점들을 이용할 수 있어야 합니다.
∙ 인프라를 정의할 때 논리(문장, for-oups 등) 사용
∙ 높은 수준의 추상화 정의, 공유 및 팀, 회사 또는 커뮤니티에 게시
∙ 라이브러리로 인프라 공유 및 재사용
∙ 업계 표준 프로토콜을 사용하여 인프라 코드 테스트
∙ 기존 코드 검토 워크플로우 사용
테스트
- AWS 콘솔에서 “CloudFormation”을 선택합니다. 스택의 일부로 생성된 S3 버킷을 선택합니다.
- 이는 netcore-batch-processing-job-[account-number]와 같은 것입니다.
- 코드의 일부로 제공된 샘플 CSV 파일을 삭제합니다.
- 처리된 CSV 파일 행이 출력으로 Dynamo 테이블에 저장됩니다.
코드 삭제
AWS CDK 삭제 명령은 CloudFormation 스택과 스택의 일부로 생성된 모든 AWS 리소스를 삭제합니다. 스택 삭제에 대해 “유지” 정책을 제공하는 AWS 서비스는 수동으로 삭제해야 합니다. 이 작업은 AWS 콘솔에서 수행하거나 아래 AWS CLI(제공된 명령)를 사용하여 수행할 수 있습니다.
AWS 콘솔에서의 코드 삭제
- AWS 콘솔을 열고 “S3″을 선택하여 스택의 일부로 생성된 버킷으로 이동한 후 S3 버킷을 수동으로 삭제합니다.
- 마찬가지로 AWS 콘솔에서 스택의 일부로 생성된 “ECR” 및 “DynamoDB” 테이블을 찾아 이 스택에서 생성된 repository 및 테이블을 삭제합니다.
- AWS 콘솔에서 “CloudFormation”을 찾아 “CDKToolkit” 스택을 선택합니다.
- “리소스” 탭으로 이동하여 스테이징 s3 버킷을 선택합니다.
- 모든 내용을 선택하고 수동으로 내용을 삭제합니다.
AWS CLI를 사용한 코드 삭제
$ cdk destroy
# CLI Commands to delete the S3, Dynamo and ECR repository
$ aws s3 rb s3://netcore-batch-processing-job- –force
$ aws ecr delete-repository –repository-name netcore-cdk-batch-app-repository –force
$ aws dynamodb delete-table –table-name netcore-cdk-batch-app-table
글을 마치며…
이렇게 AWS Batch와 관련된 애플리케이션 프로세스를 실행하여 다양한 AWS 서비스와 통합할 수 있었습니다. 애플리케이션 요구의 확장성에 따라 AWS Batch는 더 빠르고 비용 효율적으로 처리할 수 있습니다. 본 예제에서는 Microsoft .NET AWS CDK를 사용하여 인프라를 코드로 람다 및 배치 처리 코드를 배포하는 과정을 보여드렸습니다.
이를 테스트하여 전체 오케스트레이션이 AWS 배치에서 어떻게 작동하는지 직접 확인해 보시기 바랍니다. 그러면 Python(또는 다른 프로그래밍 언어 프레임워크) 코드를 교체하고, Docker 컨테이너로 포장하여, AWS Batch가 프로세스를 효율적으로 처리하도록 해야 합니다. 한번 시도해 보시고 문의 사항이나 추가 의견이 있으시다면 원문 블로그 글에 댓글을 남겨주시기 바랍니다.
참고 자료
* AWS Cloud Development Kit(CDK)
* AWS CDK .NET API Reference
* Microsoft .Net Core
* Windows on AWS
* Docker Containers
.
** 메가존 클라우드 TechBlog는 AWS BLOG 영문 게재 글 중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역 및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.