AWS CDK를 사용하여 마이크로서비스용 CI/CD 파이프라인 및 Amazon ECS 클러스터 자동으로 구축 - AWS 권장 가이드

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

AWS CDK를 사용하여 마이크로서비스용 CI/CD 파이프라인 및 Amazon ECS 클러스터 자동으로 구축

작성자: Varsha Raju(AWS)

환경: PoC 또는 파일럿

기술: DevOps; 컨테이너 및 마이크로서비스; 현대화; 인프라

AWS 서비스: AWS CodeBuild, AWS CodeCommit, AWS CodePipeline, 아마존 ECS, AWS CDK

요약

이 패턴은 Amazon Elastic Container Service(Amazon ECS)에서 마이크로서비스를 구축하고 배포하기 위한 지속적 통합 및 지속적 전송(CI/CD) 파이프라인과 기본 인프라를 자동으로 생성하는 방법을 설명합니다. proof-of-concept CI/CD 파이프라인을 설정하여 조직에 CI/CD, 마이크로서비스 등의 이점을 보여주려는 경우 이 접근 방식을 사용할 수 있습니다. DevOps 또한 이 접근 방식을 사용하여 초기 CI/CD 파이프라인을 만든 다음 조직의 요구 사항에 따라 사용자 지정하거나 변경할 수 있습니다. 

이 패턴의 접근 방식은 각각 Virtual Private Cloud(VPC)와 두 개의 가용 영역에서 실행되도록 구성된 Amazon ECS 클러스터를 포함하는 프로덕션 환경과 비프로덕션 환경을 생성합니다. 이러한 환경은 모든 마이크로서비스에서 공유되며 그런 다음 각 마이크로서비스에 대한 CI/CD 파이프라인을 생성합니다. 이러한 CI/CD 파이프라인은 CodeCommit AWS의 소스 리포지토리에서 변경 내용을 가져와 변경 사항을 자동으로 구축한 다음 프로덕션 및 비프로덕션 환경에 배포합니다. 파이프라인이 모든 단계를 성공적으로 완료하면 URL을 사용하여 프로덕션 및 비프로덕션 환경에서 마이크로서비스에 액세스할 수 있습니다.

사전 조건 및 제한 사항

사전 조건 

  • 활성 Amazon Web Services(AWS) 계정

  • starter-code.zip 파일을 포함하는 기존 Amazon Simple Storage Service(S3) 버킷(첨부)

  • 계정에 설치 및 구성된 AWS Cloud Development Kit(AWS CDK) 이에 대한 자세한 내용은 AWS CDK 설명서의 AWS CDK 시작 섹션을 참조하십시오.

  • Python 3 및 pip, 설치 및 구성됨. 자세한 내용은 Python 설명서를 참조하십시오.

  • AWS CDK, AWS CodeBuild, CodePipeline AWS, CodeCommit 아마존 엘라스틱 컨테이너 레지스트리 (Amazon ECR), 아마존 ECS 및 AWS Fargate에 익숙해야 합니다.

  • Docker에 대한 숙지.

  • CI/CD에 대한 이해 및 DevOps

제한 사항

  • 일반 AWS 계정 한도가 적용됩니다. 자세한 내용은 AWS General Reference 설명서의 AWS service quotas을 참조하십시오.

제품 버전

  • 이 코드는 Node.js 버전 16.13.0 및 AWS CDK 버전 1.132.0을 사용하여 테스트되었습니다.

아키텍처

AWS 클라우드 architecture diagram showing CI/CD pipeline and deployment to production and non-production VPCs.

이 다이어그램은 다음 워크플로를 보여줍니다.

  1. 애플리케이션 개발자가 리포지토리에 코드를 커밋합니다. CodeCommit

  2. 파이프라인이 시작됩니다.

  3. CodeBuild Docker 이미지를 빌드하여 Amazon ECR 리포지토리로 푸시합니다.

  4. CodePipeline 비프로덕션 Amazon ECS 클러스터의 기존 Fargate 서비스에 새 이미지를 배포합니다.

  5. Amazon ECS는 Amazon ECR 리포지토리의 이미지를 비프로덕션 Fargate 서비스로 가져옵니다.

  6. 테스트는 비프로덕션 URL을 사용하여 수행됩니다.

  7. 릴리스 관리자가 프로덕션 배포를 승인합니다.

  8. CodePipeline 새 이미지를 프로덕션 Amazon ECS 클러스터의 기존 Fargate 서비스에 배포합니다.

  9. Amazon ECS는 Amazon ECR 리포지토리의 이미지를 프로덕션 Fargate 서비스로 가져옵니다.

  10. 프로덕션 사용자는 프로덕션 URL을 사용하여 기능에 액세스합니다.

기술 스택  

  • AWS CDK

  • CodeBuild

  • CodeCommit 

  • CodePipeline

  • Amazon ECR 

  • Amazon ECS 

  • Amazon VPC

자동화 및 규모 조정

이 패턴의 접근 방식을 사용하여 공유 AWS CloudFormation 스택에 배포된 마이크로서비스를 위한 파이프라인을 생성할 수 있습니다. 자동화를 통해 각 VPC에 Amazon ECS 클러스터를 한 개 이상 생성할 수 있으며 공유 Amazon ECS 클러스터에 배포된 마이크로서비스를 위한 파이프라인을 생성할 수도 있습니다. 하지만 이를 위해서는 새 리소스 정보를 파이프라인 스택에 대한 입력으로 제공해야 합니다.

도구

  • AWS CDK — AWS Cloud Development Kit (AWS CDK) 는 코드로 클라우드 인프라를 정의하고 AWS를 통해 프로비저닝하기 위한 소프트웨어 개발 프레임워크입니다. CloudFormation

  • AWS CodeBuild — CodeBuild AWS는 클라우드의 완전 관리형 빌드 서비스입니다. CodeBuild 소스 코드를 컴파일하고, 단위 테스트를 실행하고, 배포할 준비가 된 아티팩트를 생성합니다.

  • AWS CodeCommit — CodeCommit AWS는 AWS 클라우드에서 Git 리포지토리를 비공개로 저장하고 관리할 수 있는 버전 제어 서비스입니다. CodeCommit 자체 소스 제어 시스템을 관리하거나 인프라 확장에 대해 걱정할 필요가 없습니다.

  • AWS CodePipeline — CodePipeline AWS는 소프트웨어 릴리스에 필요한 단계를 모델링, 시각화 및 자동화하는 데 사용할 수 있는 지속적 전송 서비스입니다. 소프트웨어 출시 프로세스의 여러 단계를 신속하게 모델링하고 구성할 수 있습니다. CodePipeline 소프트웨어 변경 사항을 지속적으로 릴리스하는 데 필요한 단계를 자동화합니다.

  • Amazon ECS - Amazon Elastic Container Service(Amazon ECS)는 클러스터에서 컨테이너를 실행, 중지 및 관리하기 위해 사용하는 컨테이너 관리 서비스로서 확장성과 속도가 뛰어납니다. AWS Fargate에서 관리하는 서버리스 인프라에서 작업 및 서비스를 실행할 수 있습니다. 또는 인프라에 대한 더 세부적인 제어를 위해, 관리하는 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스의 클러스터에서 작업과 서비스를 실행할 수 있습니다.

  • Docker - Docker를 사용하면 개발자가 모든 애플리케이션을 가볍고 휴대가 간편하며 자급자족할 수 있는 컨테이너로 포장, 배송 및 실행할 수 있습니다.

코드

이 패턴의 코드는 cicdstarter.zipstarter-code.zip 파일(첨부)에서 확인할 수 있습니다.

에픽

작업설명필요한 기술
AWS CDK의 작업 디렉터리를 설정합니다.
  1. 로컬 머신에서 cicdproject로 이름을 지정한 디렉터리를 생성합니다.

  2. cicdstarter.zip 파일(첨부)을 cicdproject 디렉터리에 다운로드하고 압축을 풉니다. 그러면 cicdstarter라는 이름의 폴더가 만들어집니다.

  3. cd <user-home>/cicdproject/cicdstarter 명령을 실행합니다. 

  4. python3 -m venv .venv 명령을 실행하여 Python 가상 환경을 설정합니다.

  5. source ./.venv/bin/activate 명령을 실행합니다.

  6. aws configure 명령을 실행하거나 다음 환경 변수를 사용하여 AWS 환경을 구성합니다. 

    • AWS_ACCESS_KEY_ID

    • AWS_SECRET_ACCESS_KEY 

    • AWS_DEFAULT_REGION

AWS DevOps, 클라우드 인프라
작업설명필요한 기술
공유 인프라를 만드십시오.
  1. 작업 디렉터리에서 cd cicdvpcecs 명령을 실행합니다. 

  2. pip3 install -r requirements.txt 명령을 실행하여 필요한 모든 Python 종속성을 설치합니다.

  3. cdk bootstrap command를 실행하여 AWS CDK를 위한 AWS 환경을 설정합니다. 

  4. cdk synth --context aws_account=<aws_account_ID> --context aws_region=<aws-region> 명령을 실행합니다. 

  5. cdk deploy --context aws_account=<aws_account_ID> --context aws_region=<aws-region> 명령을 실행합니다.

  6. AWS CloudFormation 스택은 다음과 같은 인프라를 생성합니다.

    • cicd-vpc-ecs/cicd-vpc-nonprod로 이름이 지정된 비프로덕션 VPC

    • cicd-vpc-ecs/cicd-vpc-prod로 이름이 지정된 프로덕션 VPC

    • cicd-ecs-nonprod로 이름이 지정된 비프로덕션 Amazon ECS 클러스터

    • cicd-ecs-prod로 이름이 지정된 프로덕션 Amazon ECS 클러스터

AWS DevOps, 클라우드 인프라
AWS CloudFormation 스택을 모니터링합니다.
  1. AWS 관리 콘솔에 로그인하고 AWS CloudFormation 콘솔을 연 다음 목록에서 cicd-vpc-ecs 스택을 선택합니다. 

  2. 스택 세부 정보 창에서 이벤트 탭을 선택하고 스택 생성 진행 상황을 모니터링합니다.

AWS DevOps, 클라우드 인프라
AWS CloudFormation 스택을 테스트합니다.
  1. cicd-vpc-ecsAWS CloudFormation 스택이 생성된 후 cicd-vpc-ecs/cicd-vpc-nonprodcicd-vpc-ecs/cicd-vpc-prod VPC가 생성되었는지 확인합니다. 

  2. cicd-ecs-nonprodcicd-ecs-prod Amazon ECS 클러스터가 생성되었는지 확인하십시오.

중요: 두 VPC의 ID와 두 VPC 모두의 기본 보안 그룹에 대한 보안 그룹 ID를 모두 기록해야 합니다.

AWS DevOps, 클라우드 인프라
작업설명필요한 기술
마이크로서비스를 위한 인프라를 만드십시오.
  1. 마이크로서비스의 이름을 지정합니다. 예를 들어, 이 패턴은 마이크로서비스 이름으로 myservice1을 사용합니다.

  2. 작업 디렉터리에서 cd <working-directory>/cdkpipeline 명령을 실행합니다.

  3. pip3 install -r requirements.txt 명령을 실행합니다.

  4. 이 패턴의 추가 정보 섹션에서 사용할 수 있는 전체 cdk synth 명령을 실행합니다.

  5. 이 패턴의 추가 정보 섹션에서 사용할 수 있는 전체 cdk deploy 명령을 실행합니다.

참고: 디렉터리의 cdk.json 파일을 사용하여 두 명령 모두에 값을 제공할 수도 있습니다.

AWS DevOps, 클라우드 인프라
AWS CloudFormation 스택을 모니터링합니다.

AWS CloudFormation 콘솔을 열고 myservice1-cicd-stack 스택의 진행 상황을 모니터링합니다. 결국 상태가 CREATE_COMPLETE로 변경됩니다.

AWS DevOps, 클라우드 인프라
AWS CloudFormation 스택을 테스트합니다.
  1. AWS CodeCommit 콘솔에서 이름이 지정된 리포지토리가 myservice1 존재하고 시작 코드를 포함하고 있는지 확인합니다.

  2. AWS CodeBuild 콘솔에서 이름이 지정된 빌드 프로젝트가 myservice1 존재하는지 확인합니다.

  3. Amazon ECR 콘솔에서, myservice1로 이름이 지정된 Amazon ECR 리포지토리가 존재하는지 확인합니다.

  4. Amazon ECS 콘솔에서, myservice1로 이름이 지정된 Fargate 서비스가 비프로덕션 및 프로덕션 Amazon ECS 클러스터 모두에 존재하는지 확인합니다.

  5. Amazon Elastic Compute Cloud(Amazon EC2) 콘솔에서 비프로덕션 및 프로덕션 Application Load Balancer가 생성되었는지 확인합니다. ALB의 DNS 이름을 기록하십시오.

  6. AWS CodePipeline 콘솔에서 이름이 지정된 파이프라인이 myservice1 존재하는지 확인합니다. Source, Build, Deploy-NonProdDeploy-Prod 스테이지가 있어야 합니다. 파이프라인에도 in progress 상태가 있어야 합니다.

  7. 모든 단계가 완료될 때까지 파이프라인을 모니터링하십시오. 

  8. 프로덕션을 위해 수동으로 승인하십시오.

  9. 브라우저 창에 ALB의 DNS 이름을 입력합니다.

  10. 애플리케이션은 비프로덕션 및 프로덕션 URL에 Hello World를 표시해야 합니다.

파이프라인을 사용합니다.
  1. 이전에 만든 CodeCommit 리포지토리를 열고 index.js 파일을 엽니다. 

  2. Hello WorldHello CI/CD로 바꿉니다.

  3. 변경 내용을 저장한 후 기본 브랜치에 커밋합니다.

  4. 파이프라인이 시작되고,Build, Deploy-NonProdDeploy-Prod  스테이지를 거쳐 변경이 진행되는지 확인하십시오. 

  5. 수동으로 프로덕션을 승인하십시오.

  6. 이제 프로덕션 URL과 비프로덕션 URL이 모두 Hello CICD를 표시해야 합니다.

AWS DevOps, 클라우드 인프라
각 마이크로서비스에 대해 이 에픽을 반복하십시오.

이 에픽의 작업을 반복하여 각 마이크로서비스에 대한 CI/CD 파이프라인을 생성하십시오.

AWS DevOps, 클라우드 인프라

관련 리소스

추가 정보

cdk synth 명령

cdk synth --context aws_account=<aws_account_number> --context aws_region=<aws_region> --context vpc_nonprod_id=<id_of_non_production VPC> --context vpc_prod_id=<id_of_production_VPC> --context ecssg_nonprod_id=< default_security_group_id_of_non-production_VPC> --context ecssg_prod_id=<default_security_group_id_of_production_VPC> --context code_commit_s3_bucket_for_code=<S3 bucket name> --context code_commit_s3_object_key_for_code=<Object_key_of_starter_code> --context microservice_name=<name_of_microservice>

cdk deploy 명령

cdk deploy --context aws_account=<aws_account_number> --context aws_region=<aws_region> --context vpc_nonprod_id=<id_of_non_production_VPC> --context vpc_prod_id=<id_of_production_VPC> --context ecssg_nonprod_id=< default_security_group_id_of_non-production_VPC> --context ecssg_prod_id=<default_security_group_id_of_production_VPC> --context code_commit_s3_bucket_for_code=<S3 bucket name> --context code_commit_s3_object_key_for_code=<Object_key_of_starter_code> --context microservice_name=<name_of_microservice>

첨부

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