AWS Fargate를 사용하여 이벤트 기반 및 예약된 워크로드를 대규모로 실행 - 권장 가이드

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

AWS Fargate를 사용하여 이벤트 기반 및 예약된 워크로드를 대규모로 실행

작성자: HARI OHM PRASATH RAJAGOPAL(AWS)

환경: PoC 또는 파일럿

기술: 현대화, 서버리스, 운영

워크로드: 오픈 소스

AWS 서비스: 아마존 EC2 컨테이너 레지스트리, 아마존 ECS, AWS, AWS Fargate, CodeCommit AWS Lambda, 아마존 SNS

요약

이 패턴은 AWS Fargate를 사용하여 Amazon Web Services(AWS) 클라우드에서 스케줄링된 워크로드와 이벤트 기반 워크로드를 대규모로 실행하는 방법을 설명합니다.

이 패턴이 설정한 사용 사례에서는 풀 요청이 제출될 때마다 AWS 계정 번호 및 보안 인증과 같은 AWS 민감 정보가 있는지 코드를 스캔합니다. 풀 요청은 Lambda 함수를 시작합니다. Lambda 함수는 코드 스캔을 처리하는 Fargate 작업을 간접 호출합니다. 새 풀 리퀘스트가 발생할 때마다 Lambda가 시작됩니다. 스캔 결과 민감한 정보가 발견되면 Amazon Simple Notification Service (Amazon SNS) 가 스캔 결과를 이메일 메시지로 보냅니다.

이 패턴은 다음과 같은 경우에 유용합니다.

  • 기업에서 런타임(15분 제한) 또는 메모리 제한으로 인해 AWS Lambda에서 실행할 수 없는 많은 예약 및 이벤트 기반 워크로드를 실행해야 하는 경우

  • AWS에서 이러한 워크로드에 프로비저닝된 인스턴스를 관리하도록 하려는 경우

이 패턴을 사용할 때는 Virtual Private Cloud(VPC)를 새로 생성할 수 있습니다.

사전 조건 및 제한 사항

사전 조건 

  • 활성 상태의 AWS 계정

  • 코드 베이스 호스팅 및 풀 리퀘스트 생성을 CodeCommit 위한 AWS

  • AWS Command Line Interface(AWS CLI) 버전 1.7 이상, macOS, Linux 또는 Windows에 설치 및 구성

  • 컨테이너에서 실행되는 워크로드

  • 클래스 경로에 설정된 Apache Maven 실행 파일

아키텍처

컨테이너 내 Fargate 작업과 이메일을 보내는 SNS 주제로 이어지는 풀 리퀘스트 프로세스입니다.

전체 흐름에는 다음 단계가 포함됩니다.

  1. 새 풀 리퀘스트가 제출될 때마다 Lambda 함수가 시작됩니다. CodeCommit Lambda 함수는 Amazon을 통해 이벤트를 수신합니다. CodeCommit Pull Request State Change EventBridge

  2. Lambda 함수는 코드를 체크아웃하고 스캔하기 위한 다음 환경 파라미터와 함께 새로운 Fargate 작업을 제출합니다.

    RUNNER → <<TaskARN>> SNS_TOPIC → <<SNSTopicARN>> SUBNET → <<Subnet in which Fargate task gets launched>>

    스캔 결과 코드에서 민감한 정보가 발견되면 Fargate는 Amazon SNS 주제로 새 메시지를 푸시합니다.

  3. SNS 구독자는 주제의 메시지를 읽고 이메일 메시지를 보냅니다.

기술

  • AWS CodeCommit

  • Amazon Elastic Container Registry(Amazon ECR)

  • Amazon Elastic Container Service(Amazon ECS)

  • 아마존 EventBridge

  • AWS Fargate

  • Lambda

  • Amazon SNS

  • Docker

도구

도구

  • AWS CLI - AWS Command Line Interface(CLI)는 AWS 서비스를 관리하는 통합 도구입니다.

  • AWS CodeCommit — CodeCommit AWS는 안전한 Git 기반 리포지토리를 호스팅하는 완전 관리형 소스 제어 서비스입니다. 를 사용하여 CodeCommit 팀은 안전하고 확장성이 뛰어난 환경에서 코드 작업을 공동으로 수행할 수 있습니다.

  • Amazon ECR - Amazon Elastic Container Registry(Amazon ECR)는 Docker 컨테이너 이미지를 저장, 관리 및 배포하는 데 사용할 수 있는 완전 관리형 레지스트리입니다.

  • Amazon ECS - Amazon Elastic Container Service(Amazon ECS)는 확장성이 뛰어나고 빠른 컨테이너 관리 서비스입니다. Amazon ECS를 사용하여 클러스터에서 컨테이너를 실행, 중지 및 관리할 수 있습니다.

  • AWS Fargate - AWS Fargate는 Amazon EC2 인스턴스의 서버나 클러스터를 관리할 필요 없이 컨테이너를 실행하기 위해 Amazon ECS에 사용할 수 있는 기술입니다.

  • AWS Lambda – AWS Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행하도록 지원하는 컴퓨팅 서비스입니다. Lambda는 필요 시에만 코드를 실행하며, 일일 몇 개의 요청에서 초당 수천 개의 요청까지 자동으로 규모를 조정합니다.

  • Amazon SNS - Amazon Simple Notification Service(SNS)는 게시자에서 구독자(생산자 및 소비자라고도 함)로 메시지를 전송하는 관리형 서비스입니다. 게시자는 논리적 액세스 지점 및 커뮤니케이션 채널인 주제에 메시지를 전송하여 구독자와 비동기식으로 통신합니다. SNS 주제를 구독하는 클라이언트는 Lambda, 이메일, 모바일 푸시 알림 및 모바일 문자 메시지(SMS)와 같이 지원되는 프로토콜을 사용하여 게시된 메시지를 수신합니다.

  • Docker - Docker는 컨테이너라는 패키지로 애플리케이션을 빌드, 테스트 및 제공할 수 있도록 도와줍니다.

  • Git 클라이언트 - 필요한 아티팩트를 체크아웃하기 위한 명령줄 또는 데스크톱 도구

  • Maven - Apache Maven은 프로젝트의 구축, 보고 및 문서를 중앙에서 관리하기 위한 프로젝트 관리 도구입니다.

에픽

작업설명필요한 기술

코드를 다운로드하십시오.

첨부 섹션에서 .zip 파일을 다운로드하고 파일을 추출합니다.

개발자, AWS 시스템 관리자

리포지토리를 설정합니다.

루트 폴더에서 mvn clean install을 실행합니다.

개발자, AWS 시스템 관리자
작업설명필요한 기술

Amazon ECR 리포지토리를 생성하고 로그인합니다.

Amazon ECR 콘솔을 엽니다. 탐색 창에서 리포지토리를 선택하고 리포지토리 생성을 선택합니다. 이 이야기와 다른 이야기에 대한 도움이 필요하면 관련 리소스 섹션을 참조하십시오.

개발자, AWS 시스템 관리자

컨테이너 이미지를 푸시하십시오.

리포지토리를 열고 푸시 명령 보기를 선택한 다음 Docker에 로그인합니다. 로그인한 후 추가 정보 섹션의 컨테이너 이미지 푸시에 있는 명령을 필수 대체 항목과 함께 실행합니다. 그러면 코드 스캔을 수행하는 데 사용되는 Docker 컨테이너 이미지가 업로드됩니다. 업로드가 완료되면 Amazon ECR 리포지토리에 있는 최신 빌드의 URL을 복사합니다.

개발자, AWS 시스템 관리자
작업설명필요한 기술

CodeCommit 리포지토리를 생성합니다.

새 AWS CodeCommit 리포지토리를 생성하려면 추가 정보 섹션의 CodeCommit 리포지토리 생성에서 명령을 실행합니다.

개발자, AWS 시스템 관리자
작업설명필요한 기술

VPC를 생성합니다.

기존 VPC 대신 새 VPC를 사용하려면 추가 정보 섹션의 VPC 생성에 있는 명령을 실행합니다. AWS Cloud Development Kit(AWS CDK) 스크립트는 생성된 VPC와 서브넷의 ID를 출력합니다.

개발자, AWS 시스템 관리자
작업설명필요한 기술

클러스터와 작업을 생성합니다.

Amazon ECS 클러스터와 Fargate 작업 정의를 생성하려면 추가 정보 섹션의 클러스터 및 작업 생성에 있는 명령을 실행합니다. 쉘 스크립트를 실행하는 동안 올바른 VPC ID와 Amazon ECR 리포지토리 URI가 파라미터로 전달되었는지 확인하십시오. 스크립트는 도커 이미지(스캔 담당)를 가리키는 Fargate 작업 정의를 생성합니다. 그러면 스크립트가 작업 및 관련 실행 역할을 생성합니다.

개발자, AWS 시스템 관리자

Amazon ECS 클러스터를 확인합니다.

Amazon ECS 콘솔을 엽니다. 탐색 창에서 클러스터를 선택하고 Fargate-Job-Cluster라는 새로 생성된 Amazon ECS 클러스터를 선택합니다. 그런 다음 탐색 창에서 작업 정의를 선택하고 접두사 awscdkfargateecsTaskDef가 포함된 새 작업 정의가 있는지 확인합니다.

개발자, AWS 시스템 관리자
작업설명필요한 기술

SNS 주제를 생성합니다.

SNS 주제를 만들려면 추가 정보 섹션의 SNS 주제 만들기에 있는 명령을 실행합니다. 생성이 성공하면 다음 단계에서 사용되는 SNS ARN을 기록해 둡니다.

개발자, AWS 시스템 관리자

SNS 구독자를 생성하십시오.

SNS 주제에 대핸 이메일 구독자를 만들려면 추가 정보 섹션의 SNS 구독자 만들기에 있는 명령을 실행합니다. 반드시 CLI 명령에서 TopicARNEmail address를 교체하여 사용하십시오. 이메일 알림을 받으려면 구독자로 사용되는 이메일 주소를 확인해야 합니다.

개발자, AWS 시스템 관리자
작업설명필요한 기술

함수와 트리거를 생성합니다.

트리거가 있는 Lambda 함수를 생성하려면 Lambda 함수에서 명령을 실행하고 추가 정보 섹션에서 트리거하십시오. CodeCommit CodeCommit 명령을 실행하기 전에 파라미터를 해당 값으로 바꿔야 합니다. 스크립트는 Lambda 함수를 생성하고 새 풀 요청이 생성될 때 간접 호출되도록 구성합니다.

개발자, AWS 시스템 관리자
작업설명필요한 기술

애플리케이션을 테스트합니다.

AWS의 민감한 정보를 CodeCommit 리포지토리에 체크인하는 경우 Lambda 함수가 시작되어야 합니다. Lambda 함수는 코드를 스캔하고 스캔 결과를 이메일 알림으로 보내는 Fargate 작업을 시작합니다.

개발자, AWS 시스템 관리자

관련 리소스

추가 정보

컨테이너 이미지 푸시

> cd 1-ecr-image-push > ./run.sh <<ecr-repository>>

리포지토리 생성 CodeCommit

aws codecommit create-repository --repository-name test-repo --repository-description "My Test repository"

VPC 생성

> cd 2-create-vpc > ./run.sh

출력

aws-batch-cdk-vpc-efs-launch-template.privatesubnet = subnet-<<id>> aws-batch-cdk-vpc-efs-launch-template.publicsubnet = subnet-<<id>> aws-batch-cdk-vpc-efs-launch-template.vpcid = vpc-<<id>>

클러스터 및 작업 생성

> export CDK_DEFAULT_ACCOUNT = <<aws_account_id>> > export CDK_DEFAULT_REGION = <<aws_region>> > cd 3-create-ecs-task > ./run.sh <<vpc-id>> <<ecr-repo-uri>>

출력

aws-cdk-fargate-ecs.CLUSTERNAME = Fargate-Job-Cluster aws-cdk-fargate-ecs.ClusterARN = <<cluster_arn>> aws-cdk-fargate-ecs.ContainerARN = Fargate-Container aws-cdk-fargate-ecs.TaskARN = <<task_arn>> aws-cdk-fargate-ecs.TaskExecutionRole = <<execution_role_arn>> aws-cdk-fargate-ecs.TaskRole = <<task_role_arn>>

SNS 주제 생성

aws sns create-topic --name code-commit-topic

SNS 구독자 생성

aws sns subscribe \ --topic-arn <<topic_arn>> \ --protocol email \ --notification-endpoint <<email_address>>

Lambda 함수 및 트리거 CodeCommit

> export CDK_DEFAULT_ACCOUNT = <<aws_account_id>> > export CDK_DEFAULT_REGION = <<aws_region>> > cd 5-Lambda-CodeCommit-Trigger > ./run.sh <<taskarn>> <<snstopicarn>> subnet-<<id>> <<codecommitarn>>

출력

aws-cdk-fargate-lambda-event.Cloudwatchrule = <<cloudwatchrule>> aws-cdk-fargate-lambda-event.CodeCommitLambda = AWS-Code-Scanner-Function aws-cdk-fargate-lambda-event.LambdaRole = <<lambdaiamrole>>

첨부

이 문서와 관련된 추가 콘텐츠에 액세스하려면 attachment.zip 파일의 압축을 풉니다.