AWS 및 CodePipeline AWS CDK를 사용하여 CI/CD 파이프라인을 설정합니다. - AWS 권장 가이드

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

AWS 및 CodePipeline AWS CDK를 사용하여 CI/CD 파이프라인을 설정합니다.

작성자: Konstantin Zarudaev (AWS), Cizer Pereira (AWS), Lars Kinder (AWS), Yasha Dabas (AWS)

코드 리포지토리: CodePipeline CI/CD가 포함된 AWS

환경: PoC 또는 파일럿

기술: DevOps

워크로드: 오픈 소스

AWS 서비스: AWS CodePipeline

지속적 통합 및 지속적 전달(CI/CD)을 통해 소프트웨어 구축 및 릴리스 프로세스를 자동화하면 반복 가능한 구축을 지원하고 사용자에게 새로운 기능을 신속하게 제공할 수 있습니다. 각 코드 변경을 쉽고 빠르게 테스트할 수 있으며 소프트웨어를 릴리스하기 전에 버그를 발견하고 수정할 수 있습니다. 스테이징 및 릴리스 프로세스를 통해 각 변경 사항을 실행하여 애플리케이션 또는 인프라 코드의 품질을 확인할 수 있습니다. CI/CD는 애플리케이션 개발 팀이 코드 변경을 더 자주, 안정적으로 제공할 수 있도록 지원하는 문화, 운영 원칙, 관행을 구현합니다. 이 구현을 CI/CD 파이프라인이라고도 합니다.

이 패턴은 Amazon Web Service(AWS)에서 재사용 가능한 지속적 통합 및 지속적 전달(CI/CD) 파이프라인을 정의합니다. AWS CodePipeline 파이프라인은 AWS 클라우드 개발 키트 (AWS CDK) v2를 사용하여 작성되었습니다.

를 사용하면 AWS 관리 콘솔 인터페이스 CodePipeline, AWS 명령줄 인터페이스 (AWS CLI), AWS 또는 AWS SDK를 통해 소프트웨어 출시 프로세스의 여러 단계를 모델링할 수 있습니다. CloudFormation 이 패턴은 AWS CDK를 사용한 구현 CodePipeline 및 구성 요소를 보여줍니다. 라이브러리 구성 외에도 AWS CDK에는 AWS CDK 앱과 상호 작용하는 기본 도구인 툴킷(CLI 명령 cdk)이 포함되어 있습니다. 다른 기능 중에서도 툴킷은 하나 이상의 스택을 CloudFormation 템플릿으로 변환하여 AWS 계정에 배포하는 기능을 제공합니다.

파이프라인에는 타사 라이브러리의 보안을 검증하기 위한 테스트가 포함되어 있으며, 지정된 환경에서 신속하고 자동화된 릴리스를 보장하는 데 도움이 됩니다. 검증 프로세스를 통해 애플리케이션의 전반적인 보안을 강화할 수 있습니다.

이 패턴의 목적은 배포하는 리소스가 모범 사례를 준수하도록 보장하는 동시에 CI/CD 파이프라인 사용을 가속화하여 코드를 배포하는 것입니다. DevOps 예제 코드를 구현하면 린팅, 테스트, 보안 검사, 배포 및 배포 후 프로세스를 CodePipeline 갖춘 AWS를 갖게 됩니다. 이 패턴에는 Makefile 단계도 포함됩니다. 개발자는 Makefile을 사용하여 CI/CD 단계를 로컬에서 재현하고 개발 프로세스의 속도를 높일 수 있습니다.

사전 조건 및 제한 사항

사전 조건 

  • 활성 상태의 AWS 계정

  • 기본적인 이해는 다음과 같습니다.

    • AWS CDK

    • AWS CloudFormation

    • AWS CodePipeline

    • TypeScript

제한 사항

이 패턴은 AWS CDK를 TypeScript 용도로만 사용합니다. AWS CDK에서 지원하는 다른 언어는 다루지 않습니다.

제품 버전

다음 도구의 최신 버전을 사용하십시오.

  • AWS Command Line Interface(AWS CLI)

  • cfn_nag

  • git-remote-codecommit

  • Node.js

아키텍처

대상 기술 스택

  • AWS CDK

  • AWS CloudFormation

  • AWS CodeCommit

  • AWS CodePipeline

대상 아키텍처 

파이프라인은 AWS CodeCommit 리포지토리 (SampleRepository) 의 변경에 의해 트리거됩니다. 처음에는 아티팩트를 CodePipeline 빌드하고 자체 업데이트한 다음 배포 프로세스를 시작합니다. 그 결과로 생성되는 파이프라인은 솔루션을 세 개의 독립적인 환경에 배포합니다.

  • 개발 — 활성 개발 환경에서의 3단계 코드 검사

  • 테스트 — 통합 및 회귀 테스트 환경

  • Prod – 프로덕션 환경

개발 단계에 포함되는 세 단계는 린팅, 보안 및 유닛 테스트입니다. 이러한 단계는 병렬로 실행되어 프로세스 속도를 높입니다. 파이프라인이 작동하는 아티팩트만 제공하도록 하기 위해 프로세스의 한 단계가 실패할 때마다 파이프라인 실행이 중지됩니다. 개발 단계 배포 후 파이프라인은 검증 테스트를 실행하여 결과를 확인합니다. 성공하면 파이프라인은 배포 후 검증이 포함된 테스트 환경에 아티팩트를 배포합니다. 마지막 단계는 아티팩트를 프로덕션 환경에 배포하는 것입니다.

다음 다이어그램은 CodeCommit 리포지토리에서 수행된 빌드 및 업데이트 프로세스까지의 워크플로 CodePipeline, 세 가지 개발 환경 단계, 세 환경 각각에서의 후속 배포 및 검증을 보여줍니다.

개발 환경에는 린팅, 보안 및 단위 테스트가 포함되며, 모두 배포 및 검증을 포함합니다.

도구

서비스

  • AWS Cloud Development Kit(AWS CDK)는 AWS 클라우드 인프라를 코드로 정의하고 프로비저닝하는 데 도움이 되는 소프트웨어 개발 프레임워크입니다.

  • AWS는 AWS CloudFormation 리소스를 설정하고, 빠르고 일관되게 프로비저닝하고, 전체 AWS 계정 및 지역의 수명 주기 전반에 걸쳐 리소스를 관리할 수 있도록 지원합니다. 이 패턴에서는 CloudFormation 템플릿을 사용하여 CodeCommit 리포지토리와 CodePipeline CI/CD 파이프라인을 생성할 수 있습니다.

  • CodeCommitAWS는 자체 소스 제어 시스템을 관리할 필요 없이 Git 리포지토리를 비공개로 저장하고 관리할 수 있는 버전 제어 서비스입니다.

  • CodePipelineAWS는 소프트웨어 릴리스의 여러 단계를 신속하게 모델링 및 구성하고 소프트웨어 변경 사항을 지속적으로 릴리스하는 데 필요한 단계를 자동화하는 데 도움이 되는 CI/CD 서비스입니다.

  • AWS Command Line Interface(AWS CLI)는 명령줄 쉘에서 명령을 사용하여 AWS 서비스와 상호 작용할 수 있는 오픈 소스 도구입니다.

기타 도구

  • cfn_nag는 템플릿의 패턴을 찾아 잠재적 보안 문제를 식별하는 오픈 소스 도구입니다. CloudFormation

  • git-remote-codecommit CodeCommit Git을 확장하여 리포지토리에서 코드를 푸시하고 가져오는 유틸리티입니다.

  • Node.js 는 확장 가능한 네트워크 애플리케이션을 구축하기 위해 설계된 이벤트 기반 JavaScript 런타임 환경입니다.

코드

이 패턴의 코드는 GitHub AWS CodePipeline with CI/CD 프랙티스 리포지토리에서 제공됩니다.

모범 사례

AWS Identity 및 Access Management(IAM) 정책과 같은 리소스를 검토하여 해당 정책이 조직의 모범 사례에 부합하는지 확인합니다.

에픽

작업설명필요한 기술

macOS 또는 Linux에 도구를 설치합니다.

MacOS 또는 Linux를 사용하는 경우, 선호하는 터미널에서 다음 명령을 실행하거나 Linux용 Homebrew를 사용하여 도구를 설치할 수 있습니다.

brew install brew install git-remote-codecommit brew install ruby brew-gem brew-gem install cfn-nag
DevOps 엔지니어

AWS Cloud9를 사용하여 도구를 설치합니다.

AWS Cloud9를 사용하는 경우 다음 명령을 실행하여 도구를 설치합니다.

gem install cfn-nag

참고: AWS Cloud9에는 Node.js 및 npm이 설치되어 있어야 합니다. 설치 또는 버전을 확인하려면 다음 명령을 실행합니다.

node -v npm -v
DevOps 엔지니어

AWS CLI를 설정합니다.

AWS CLI를 설정하려면, 운영 체제에 대한 지침을 사용합니다.

DevOps 엔지니어
작업설명필요한 기술

코드를 다운로드하거나 복제합니다.

이 패턴에서 사용되는 코드를 가져오려면 다음 중 하나를 수행합니다.

  • GitHub 리포지토리의 릴리스에서 최신 소스 코드를 다운로드하고 다운로드한 파일을 폴더에 압축 해제합니다.

  • 다음 명령을 실행하여 프로젝트를 복제합니다.

git clone --depth 1 https://github.com/aws-samples/aws-codepipeline-cicd.git

복제된 리포지토리에서 .git 디렉터리를 제거합니다.

cd ./aws-codepipeline-cicd rm -rf ./.git

나중에 새로 만든 AWS CodeCommit 리포지토리를 원격 오리진으로 사용하게 됩니다.

DevOps 엔지니어

AWS 계정에 연결합니다.

임시 보안 토큰 또는 랜딩 존 인증을 사용하여 연결할 수 있습니다. 올바른 계정과 AWS 리전을 사용하고 있는지 확인하려면 다음 명령을 실행하십시오.

AWS_REGION="eu-west-1" ACCOUNT_NUMBER=$(aws sts get-caller-identity --query Account --output text) echo "${ACCOUNT_NUMBER}"
DevOps 엔지니어

환경을 부트스트랩합니다.

AWS CDK 환경을 부트스트랩하려면 다음 명령을 실행합니다.

npm install npm run cdk bootstrap "aws://${ACCOUNT_NUMBER}/${AWS_REGION}"

환경을 성공적으로 부트스트랩한 후에는 다음 출력이 표시되어야 합니다.

⏳ Bootstrapping environment aws://{account}/{region}... ✅ Environment aws://{account}/{region} bootstrapped

AWS CDK 부트스트래핑에 대한 자세한 내용은 AWS CDK 설명서를 참조하세요.

DevOps 엔지니어

템플릿을 합성합니다.

AWS CDK 앱을 합성하려면 cdk synth 명령을 사용합니다.

npm run cdk synth

다음과 같이 출력되어야 합니다.

Successfully synthesized to <path-to-directory>/aws-codepipeline-cicd/cdk.out Supply a stack id (CodePipeline, Dev-MainStack) to display its template.
DevOps 엔지니어

CodePipeline 스택 배포.

이제 CloudFormation 템플릿을 부트스트랩하고 합성했으니 배포할 수 있습니다. 배포를 통해 CodePipeline 파이프라인과 리포지토리가 생성되며, 이 CodeCommit 리포지토리가 파이프라인의 소스이자 트리거가 됩니다.

npm run cdk -- deploy CodePipeline --require-approval never

명령을 실행하면 CodePipeline 스택과 출력 정보가 성공적으로 배포된 것을 확인할 수 있습니다. 는 AWS 계정의 CodeCommit 리포지토리 이름을 CodePipeline.RepositoryName 제공합니다.

CodePipeline: deploying... CodePipeline: creating CloudFormation changeset... ✅ CodePipeline Outputs: CodePipeline.RepositoryName = SampleRepository Stack ARN: arn:aws:cloudformation:REGION:ACCOUNT-ID:stack/CodePipeline/STACK-ID
DevOps 엔지니어

원격 CodeCommit 리포지토리 및 브랜치를 설정합니다.

배포에 CodePipeline 성공하면 AWS CodePipeline 콘솔에서 찾을 수 있는 파이프라인의 첫 번째 실행이 시작됩니다. AWS CDK는 기본 브랜치를 시작하지 CodeCommit 않기 때문에 이 초기 파이프라인 실행은 실패하고 다음 오류 메시지를 반환합니다.

The action failed because no branch named main was found in the selected AWS CodeCommit repository SampleRepository. Make sure you are using the correct branch name, and then try again. Error: null

이 오류를 수정하려면 원격 오리진을 SampleRepository로 설정하고 필요한 main 브랜치를 생성하십시오.

RepoName=$(aws cloudformation describe-stacks --stack-name CodePipeline --query "Stacks[0].Outputs[?OutputKey=='RepositoryName'].OutputValue" --output text) echo "${RepoName}" # git init git branch -m master main git remote add origin codecommit://${RepoName} git add . git commit -m "Initial commit" git push -u origin main
DevOps 엔지니어
작업설명필요한 기술

파이프라인을 활성화하려면 변경 사항을 커밋하십시오.

초기 배포에 성공하면 SampleRepositorymain 브랜치를 소스 브랜치로 사용하는 완전한 CI/CD 파이프라인을 갖추어야 합니다. main 브랜치에 변경 사항을 커밋하는 즉시 파이프라인은 다음과 같은 일련의 작업을 시작하고 실행합니다.

  1. CodeCommit 리포지토리에서 코드를 가져오세요.

  2. 코드를 구축합니다.

  3. 파이프라인 자체를 업데이트합니다(UpdatePipeline).

  4. 린팅, 보안 및 유닛 테스트 검사를 위해 세 개의 병렬 작업을 실행합니다.

  5. 성공하면 파이프라인은 Main 스택을 ./lib/main-stack.ts에서 개발 환경으로 배포합니다.

  6. 배포된 리소스에 대해 배포 후 검사를 실행합니다. CodePipeline 콘솔에서 모든 CodePipeline 단계와 결과를 따를 수 있습니다.

  7. 성공하면 파이프라인은 테스트 및 프로덕션 환경에 대한 배포와 검증을 반복합니다.

DevOps 엔지니어
작업설명필요한 기술

Makefile을 사용하여 개발 프로세스를 실행합니다.

make 명령을 사용하여 전체 파이프라인을 로컬에서 실행하거나 개별 단계를 실행할 수 있습니다(예: make linting).

make를 사용하여 테스트하려면 다음 작업을 수행합니다.

  • 로컬 파이프라인 구현: make

  • 유닛 테스트만 실행: make unittest

  • 현재 계정에 배포: make deploy

  • 환경 정리: make clean

앱 개발자, DevOps 엔지니어
작업설명필요한 기술

AWS CDK 앱 리소스를 삭제합니다.

AWS CDK 앱을 정리하려면 다음 명령을 실행합니다.

cdk destroy --all

부트스트래핑 중에 생성된 Amazon Simple Storage Service(Amazon S3) 버킷은 자동으로 삭제되지 않는다는 점을 유의해 주십시오. 삭제를 허용하는 보존 정책이 필요하거나 AWS 계정에서 수동으로 삭제해야 합니다.

DevOps 엔지니어

문제 해결

문제Solution

템플릿이 예상대로 작동하지 않습니다.

문제가 발생하여 템플릿이 작동하지 않으면 다음 사항을 확인해야 합니다.

  • 적절한 버전의 도구

  • 대상 AWS 계정에 대한 액세스(네트워크 연결)

  • 대상 AWS 계정에 대한 충분한 권한

관련 리소스