BLOG
AWS Marketplace는 고객이 AWS에서 실행되는 소프트웨어를 찾고, 구독하고, 배포하는 방법을 단순화합니다. Re:invent 2018에서 고객이 AWS Marketplace에서 컨테이너 제품을 검색하고 구매할 수 있도록 AWS Marketplace for Containers가 출시되었습니다. 제품 선택은 고성능 컴퓨팅, 보안 및 개발자 도구와 같은 범주에 걸쳐 있습니다. 2020년 12월 AWS Marketplace는 ISV(독립 소프트웨어 공급업체)가 컨테이너 제품에 대한 버전과 새 정보를 추가할 수 있는 보다 쉬운 셀프 서비스 환경을 발표했습니다. 이번 릴리스를 통해 ISV는 컨테이너 제품에 대한 전용 Amazon Elastic Container Registry (Amazon ECR) 리포지토리를 호스팅하여 새로운 컨테이너 이미지와 Helm 차트를 쉽게 게시할 수 있습니다.
솔루션 개요
오늘 포스팅에서는 AWS CodeCommit 에서 코드 변경이 발생할 때마다 Amazon ECR 리포지토리에 컨테이너 이미지를 자동으로 빌드하는 방법을 알아보겠습니다. 배포 프로세스를 조율하고 자동으로 필요한 서비스를 런치하기 위해 지속적인 통합과 지속적인 배포 (CI/CD) 파이프 라인을 구축을 위한 AWS CloudFormation의 템플릿을 사용할 수 있습니다. CI/CD 파이프라인을 생성하면 파이프라인을 자동으로 트리거하여 최신 버전의 소스 코드를 릴리스하여 컨테이너 이미지를 빌드하고 Amazon ECR의 리포지토리에 푸시합니다. 그때부터 소스 코드를 변경할 때마다 파이프라인이 트리거됩니다. 다음 다이어그램은 솔루션의 아키텍처 개요를 보여줍니다.
- 엔지니어가 코드를 개발하고 AWS CodeCommit 리포지토리에 푸시합니다.
- 이 작업은 최신 버전의 코드를 AWS CodeBuild에 릴리스합니다.
- AWS CodeBuild는 컨테이너 이미지 빌드 프로세스를 시작합니다.
- 컨테이너 이미지가 성공적으로 빌드되면 이미지가 자동으로 AWS Marketplace ECR 리포지토리로 푸시됩니다.
전제 조건
- 컨테이너 제품은 AWS Marketplace에서 제한된 상태 로 이미 출시되었습니다. 제한된 상태의 제품은 판매자 AWS 계정과 지정한 테스트 계정에서만 볼 수 있습니다. 모든 신제품은 AWS Marketplace에서 공개적으로 제공되기 전에 테스트를 위해 먼저 제한된 상태로 게시됩니다. 제품 제출에 대한 자세한 내용은 컨테이너 제품 시작하기 를 참조하십시오.
- AWS Cloud9 environment. AWS Cloud9 은 AWS 명령줄 인터페이스 (AWS CLI)로 사전 패키징 및 구성되어 손쉽게 배포를 시작할 수 있습니다.
솔루션 연습
이 솔루션 연습에는 다음과 같은 단계가 있습니다.
- AWS CodeCommit 리포지토리를 생성합니다.
- 샘플 애플리케이션을 AWS CodeCommit 리포지토리로 푸시합니다.
- Amazon ECR 리포지토리를 생성합니다.
- AWS CodePipeline을 배포합니다.
1단계: AWS CodeCommit 리포지토리 생성
AWS 콘솔을 통해 AWS Cloud9 통합 개발 환경(IDE)을 엽니다. AWS Cloud9 IDE 콘솔에서 다음 명령을 실행하여 AWS CodeCommit 리포지토리를 생성합니다. repository-name을 3단계에서 선택하고 저장할 리포지토리 네임으로 대체합니다.
Bash
aws codecommit create-repository –repository-name example-repo –repository-description “Example Demo”
다음과 유사한 아웃풋을 받아야 합니다.
JSON
{
“repositoryMetadata”: {
“repositoryName”: “example-repo”,
“cloneUrlSsh”: “ssh://git-codecommit.us-east-1.amazonaws.com/v1/repos/example-repo”,
“lastModifiedDate”: 1625695942.77,
“repositoryDescription”: “Example Repository”,
“cloneUrlHttp”: “https://git-codecommit.us-east-1.amazonaws.com/v1/repos/example-repo”,
“creationDate”: 1625695942.77,
“repositoryId”: “c8867d6b-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,
“Arn”: “arn:aws:codecommit:us-east-1:xxxxxxxxxxxx:awsmp-demo-repo”,
“accountId”: “xxxxxxxxxxxx”
}
}
2단계: 샘플 애플리케이션을 AWS CodeCommit 리포지토리로 푸시
Hello World 샘플 애플리케이션 및 Dockerfile을 생성하려면 AWS Cloud9 IDE에서 다음 명령을 실행하십시오. 그러면 1단계에서 생성한 AWS CodeCommit 리포지토리에 푸시할 컨테이너 이미지가 빌드됩니다.
1. 저장소 복제
AWS Cloud9 IDE 콘솔에서 다음 명령을 실행합니다.
Bash
git clone < cloneUrlHttp-in-step-1>
cd awsmp-demo-repo
2. 샘플 index.html 파일 만들기
AWS Cloud9 IDE 콘솔에서 다음 명령을 실행합니다.
Bash
cat << EOF > index.html
<head>
<title>Hello World</title>
</head>
<div class=”info”>
<h>Hello World!</h>
</div>
EOF
3. 샘플 hello.conf 파일 만들기
AWS Cloud9 IDE 콘솔에서 다음 명령을 실행합니다.
Bash
cat << EOF > hello.conf
server {
listen 80;
root /usr/share/nginx/html;
try_files /index.html =404;
expires -1;
}
EOF
4. 도커파일 생성
AWS Cloud9 IDE 콘솔에서 다음 명령을 실행합니다.
Bash
cat << EOF > Dockerfile
FROM public.ecr.aws/nginx/nginx
RUN rm /etc/nginx/conf.d/*
ADD hello.conf /etc/nginx/conf.d/
ADD index.html /usr/share/nginx/html/
EOF
5. 모든 파일을 AWS CodeCommit 리포지토리로 푸시
AWS Cloud9 IDE 콘솔에서 다음 명령을 실행합니다.
Bash
git add –all
git commit -a -m “first commit”
git push
3단계: Amazon ECR 리포지토리 생성
컨테이너 이미지를 저장할 Amazon ECR 리포지토리를 생성합니다. AWS Marketplace에서 이미 제한된 상태로 게시된 컨테이너 제품의 경우 컨테이너 이미지는 AWS Marketplace에서 관리하는 Amazon ECR 리포지토리에서 호스팅되어야 합니다. 리포지토리를 만들기 위해 AWS 마켓 플레이스 카탈로그 API (CAPI)를 사용하세요. AWS CLI를 사용하여 CAPI를 호출하려면 다음 명령을 실행하여 Identifier 값을 1단계에서 생성한 제품 ID 및 RepositoryName으로 바꿉니다.
Bash
aws marketplace-catalog start-change-set \
–catalog “AWSMarketplace” \
–change-set ‘[
{
“ChangeType”: “AddRepositories”,
“Entity”: {
“Identifier”: “Product-ID”,
“Type”: “ContainerProduct@1.0”
},
“Details”: “{\”Repositories\”:[{\”RepositoryName\”:\”example-repo\”,\”RepositoryType\”:\”ECR\”}]}”
}
]’
AWS Marketplace 관리 포털(AMMP) 요청 페이지 를 통해 진행 상황을 모니터링합니다. 다음 스크린샷은 상태가 Succeeded인 두 개의 요청이 있는 요청 기록 페이지를 보여줍니다.
요청 세부 정보를 보고 4단계에서 사용할 Amazon ECR 리포지토리 이름을 가져오려면 요청 기록 페이지 요청 이름 열에서 요청을 선택하여 요청 세부 정보 페이지를 봅니다. 요청 세부 정보 페이지의 Repository 1 아래에서 저장소 이름을 찾을 수 있습니다. 리포지토리 이름은 709825985650.dkr.ecr.us-east-1.amazon.com 이후의 값입니다. Amazon ECR 리포지토리 이름은 <seller display name>/<repository name> 형식이어야 합니다.
4단계: AWS CodePipeline 배포
1.파이프라인을 배포하여 컨테이너 이미지를 빌드하고 Amazon ECR 리포지토리에 푸시하려면 다음 Launch Stack 버튼을 선택합니다.
2.AWS CloudFormation 스택 콘솔을 만들고 1 단계에서 만든 저장소 이름과 3 단계에서 만든 AmazonECR의 저장소 이름을 입력합니다.
3.“I acknowledge that AWS CloudFormation might create IAM resources”를 선택할 수 있을 때까지 NEXT를 클릭하고, 그 후 Create Stack을 선택합니다. AWS CloudFormation 스택 생성이 완료되면 파이프라인이 컨테이너 이미지를 빌드합니다.
4.AWS CodePipeline 콘솔로 이동하고 생성된 파이프라인을 선택하여 빌드 진행 상황을 모니터링합니다.
5.빌드가 성공적으로 완료되면 구축된 파이프라인을 확인하고 컨테이너 이미지를 Amazon ECR 리포지토리로 푸시하려면 AWS Cloud9 IDE를 사용하여 다음 명령을 실행합니다. repository-name 값을 1단계에서 생성한 저장소 이름으로 바꿉니다.
Bash
aws ecr list-images –registry-id 709825985650 –repository-name amazon-web-services/repository-name –region us-east-1
결과는 다음과 유사해야 합니다.
JSON
{
“imageIds”: [
{
“imageTag”: “35dac292”,
“imageDigest”: “sha256:51344a34145bc52af…………”
}
]
}
이제 컨테이너 이미지가 올바른 위치에 성공적으로 푸시되었으며, AWS Marketplace에 게시할 준비가 되었습니다. 컨테이너 제품 시작하기의 설명에 따라 컨테이너 제품을 테스트하고 게시할 수 있습니다.
정리하기
배포를 정리하려면 AWS CodeCommit 리포지토리 를 삭제하고 AWS Cloud9 환경을 삭제한 뒤 오늘 예제의 일부로 배포된 AWS Cloudformation 스택을 삭제합니다 .
결론
이번 포스팅에서는 AWS Marketplace for Containers를 사용하여 Amazon ECR 리포지토리를 생성하고 AWS CodePipeline을 구축하여 컨테이너 이미지를 해당 리포지토리에 자동으로 푸시하는 방법을 보여드렸습니다. AWS Marketplace Catalog API 및 새 컨테이너 이미지가 Amazon ECR에 푸시된 후 프로그래밍 방식으로 제품의 새 버전을 게시하는 방법에 대해 자세히 알아보려면 카탈로그 API 를 사용하여 AWS Marketplace의 컨테이너 목록 업데이트 자동화 문서를 참조하십시오. 컨테이너 나열에 대해 자세히 알아보려면 AWS Marketplace 컨테이너 기반 제품을 방문하십시오.
메가존 클라우드 TechBlog는 AWS BLOG 영문 게재 글이나 관련 기사 중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아 정기적으로 게재하고 있습니다. 추가로 번역 및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.