Amazon Elastic Container Service에 배포하기
이 단계별 가이드는 GitLab.com에 호스팅된 프로젝트를 Amazon Elastic Container Service (ECS)에 배포하는 데 도움을 줍니다.
이 가이드에서는 AWS 콘솔을 사용하여 수동으로 ECS 클러스터를 생성하는 것부터 시작합니다. GitLab 템플릿에서 생성한 간단한 애플리케이션을 생성하고 배포합니다.
이 지침은 SaaS 및 자가 관리형 GitLab 인스턴스 모두에서 작동합니다. 귀하의 러너가 구성되어 있는지 확인하세요.
전제 조건
-
AWS 계정이 필요합니다.
기존 AWS 계정으로 로그인하거나 새로 생성하세요. - 이 가이드에서는
us-east-2
지역에서 인프라를 생성합니다.
어떤 지역을 사용해도 되지만 시작한 후에는 변경하지 마세요.
AWS에 인프라 및 초기 배포 생성
GitLab에서 애플리케이션을 배포하려면 먼저 AWS에 인프라와 초기 배포를 생성해야 합니다.
여기에는 ECS 클러스터와 관련 구성 요소,
예를 들어 ECS 작업 정의,
ECS 서비스,
그리고 컨테이너화된 애플리케이션 이미지가 포함됩니다.
여기 첫 번째 단계로, 프로젝트 템플릿에서 데모 애플리케이션을 생성합니다.
템플릿에서 새 프로젝트 만들기
GitLab 프로젝트 템플릿을 사용하여 시작합니다. 이름에서 알 수 있듯이, 이러한 프로젝트는
잘 알려진 프레임워크를 기반으로 한 기본 애플리케이션을 제공합니다.
- GitLab의 왼쪽 사이드바에서 맨 위에 있는 Create new () 및
New project/repository를 선택합니다. -
Create from template를 선택하면 Ruby on Rails, Spring 또는
NodeJS Express 프로젝트 중에서 선택할 수 있습니다. 이 가이드에서는 Ruby on Rails 템플릿을 사용합니다. - 프로젝트에 이름을 지정합니다. 이 예에서는
ecs-demo
라고 명명합니다.
GitLab Ultimate 계획에서 제공하는 기능을 활용할 수 있도록 공개로 설정하세요. - Create project를 선택합니다.
이제 데모 프로젝트를 생성했으므로, 애플리케이션을 컨테이너화하고
컨테이너 레지스트리에 푸시해야 합니다.
GitLab 컨테이너 레지스트리에 컨테이너화된 애플리케이션 이미지 푸시
ECS는 컨테이너 오케스트레이션 서비스로,
인프라 구축 시 컨테이너화된 애플리케이션 이미지를 제공해야 합니다.
이를 위해 GitLab Auto Build와
Container Registry를 사용할 수 있습니다.
- 왼쪽 사이드바에서 Search or go to를 선택하고
ecs-demo
프로젝트를 찾습니다. -
Set up CI/CD를 선택합니다. 그러면
.gitlab-ci.yml
생성 양식으로 이동합니다. -
빈
.gitlab-ci.yml
에 다음 내용을 복사하여 붙여넣습니다.
이는 ECS에 대한 지속적 배포 파이프라인을 정의합니다.include: - template: AWS/Deploy-ECS.gitlab-ci.yml
-
Commit Changes를 선택합니다. 그러면 자동으로 새 파이프라인이 트리거됩니다.
이 파이프라인에서build
작업은 애플리케이션을 컨테이너화하고
이미지를 GitLab 컨테이너 레지스트리에 푸시합니다. -
Deploy > Container Registry를 방문합니다. 애플리케이션 이미지가 푸시되었는지 확인하세요.
이제 AWS에서 가져올 수 있는 컨테이너화된 애플리케이션 이미지가 있습니다.
다음으로, 이 애플리케이션 이미지가 AWS에서 어떻게 사용될지 정의합니다.
production_ecs
작업은 ECS 클러스터에 연결되지 않아서 실패합니다. 이 문제는 나중에 해결할 수 있습니다.
ECS 작업 정의 생성
ECS 작업 정의는 애플리케이션 이미지가 ECS 서비스에 의해 시작되는 방법에 대한 명세입니다.
-
AWS console에서 ECS > 작업 정의로 이동합니다.
-
새 작업 정의 생성을 선택합니다.
-
시작 유형으로 EC2를 선택합니다. 다음 단계를 선택합니다.
-
작업 정의 이름에
ecs_demo
를 설정합니다. -
작업 크기 > 작업 메모리 및 작업 CPU에
512
를 설정합니다. -
컨테이너 정의 > 컨테이너 추가를 선택합니다. 이렇게 하면 컨테이너 등록 양식이 열립니다.
-
컨테이너 이름에
web
을 설정합니다. -
이미지에
registry.gitlab.com/<your-namespace>/ecs-demo/master:latest
를 설정합니다.그 외에도 GitLab 컨테이너 레지스트리 페이지에서 이미지 경로를 복사하여 붙여넣을 수 있습니다.
-
포트 매핑을 추가합니다. 호스트 포트에
80
를 설정하고 컨테이너 포트에5000
을 설정합니다. -
생성을 선택합니다.
이제 초기 작업 정의가 생성되었습니다. 다음 단계에서는 애플리케이션 이미지를 실행할 실제 인프라를 생성합니다.
ECS 클러스터 생성
또한 EC2 또는 Fargate와 계산 리소스로 연결되어 있습니다.
-
AWS console에서 ECS > 클러스터로 이동합니다.
-
클러스터 생성을 선택합니다.
-
클러스터 템플릿으로 EC2 Linux + Networking을 선택합니다. 다음 단계를 선택합니다.
-
클러스터 이름에
ecs-demo
를 설정합니다. -
네트워킹에서 기본 VPC를 선택합니다. 기존 VPC가 없는 경우, 새로 생성되도록 그대로 두십시오.
-
VPC의 모든 사용 가능한 서브넷을 서브넷에 설정합니다.
-
생성을 선택합니다.
-
ECS 클러스터가 성공적으로 생성되었는지 확인합니다.
이제 다음 단계에서 ECS 클러스터에 ECS 서비스를 등록할 수 있습니다.
다음 사항에 유의하십시오:
-
선택적으로, 생성 양식에 SSH 키 쌍을 설정할 수 있습니다. 이를 통해 EC2 인스턴스에 SSH로 연결하여 디버깅할 수 있습니다.
-
기존 VPC를 선택하지 않으면 기본적으로 새 VPC가 생성됩니다. 이는 계정의 최대 인터넷 게이트웨이 수에 도달하면 오류를 일으킬 수 있습니다.
-
클러스터는 EC2 인스턴스가 필요하며, 이는 인스턴스 유형에 따라 비용이 발생합니다.
ECS 서비스 생성
ECS 서비스는 ECS 작업 정의를 기반으로 애플리케이션 컨테이너를 생성하는 데몬입니다.
-
AWS 콘솔에서 ECS > 클러스터 > ecs-demo > 서비스로 이동하세요.
-
배포를 선택하세요. 그러면 서비스 생성 양식이 열립니다.
-
시작 유형에서
EC2
를 선택하세요. -
작업 정의에
ecs_demo
를 설정하세요. 이는 위에서 생성한 작업 정의에 해당합니다. -
서비스 이름에
ecs_demo
를 설정하세요. -
원하는 작업에
1
을 설정하세요. -
배포를 선택하세요.
-
생성된 서비스가 활성 상태인지 확인하세요.
AWS의 콘솔 UI는 시간이 지남에 따라 변경됩니다. 지침에서 관련 구성 요소를 찾을 수 없는 경우 가장 가까운 것을 선택하세요.
데모 애플리케이션 보기
이제 데모 애플리케이션에 인터넷에서 접근할 수 있습니다.
-
AWS 콘솔에서 EC2 > 인스턴스로 이동하세요.
-
ECS Instance
로 검색하여 ECS 클러스터가 생성한 해당 EC2 인스턴스를 찾으세요. -
EC2 인스턴스의 ID를 선택하세요. 그러면 인스턴스 세부 정보 페이지로 이동합니다.
-
공용 IPv4 주소를 복사하고 브라우저에 붙여넣으세요. 이제 데모 애플리케이션이 실행 중인 것을 볼 수 있습니다.
이 가이드에서는 HTTPS/SSL이 구성되지 않았습니다. 애플리케이션에 HTTP를 통해서만 접근할 수 있습니다(예: http://<ec2-ipv4-address>
).
GitLab에서 지속적인 배포 설정
ECS에서 애플리케이션이 실행되고 있으므로, GitLab에서 지속적인 배포를 설정할 수 있습니다.
배포자를 위한 새로운 IAM 사용자 생성
GitLab이 위에서 생성한 ECS 클러스터, 서비스 및 작업 정의에 접근하기 위해서는 AWS에서 배포자 사용자를 생성해야 합니다:
-
AWS 콘솔에서 IAM > 사용자로 이동하세요.
-
사용자 추가를 선택하세요.
-
사용자 이름에
ecs_demo
를 설정하세요. -
프로그래밍 방식으로 액세스 체크박스를 활성화하세요. 다음: 권한을 선택하세요.
-
권한 설정에서
기존 정책 직접 연결
을 선택하세요. -
정책 목록에서
AmazonECS_FullAccess
를 선택하세요. 다음: 태그 및 다음: 검토를 선택하세요. -
사용자 생성을 선택하세요.
-
생성된 사용자에 대한 액세스 키 ID와 비밀 액세스 키를 기록해 두세요.
참고:
비밀 액세스 키를 공개 장소에 공유하지 마세요. 안전한 장소에 저장해야 합니다.
GitLab에서 ECS에 접근할 수 있도록 자격 증명 설정
GitLab CI/CD 변수에 액세스 정보를 등록할 수 있습니다. 이러한 변수는 파이프라인 작업에 주입되어 ECS API에 접근할 수 있습니다.
-
왼쪽 사이드 바에서 검색 또는 이동을 선택하고
ecs-demo
프로젝트를 찾으세요. -
설정 > CI/CD > 변수로 이동하세요.
-
변수 추가를 선택하고 다음 키-값 쌍을 설정하세요.
키 값 비고 AWS_ACCESS_KEY_ID
<배포자의 액세스 키 ID>
aws
CLI 인증을 위한 것입니다.AWS_SECRET_ACCESS_KEY
<배포자의 비밀 액세스 키>
aws
CLI 인증을 위한 것입니다.AWS_DEFAULT_REGION
us-east-2
aws
CLI 인증을 위한 것입니다.CI_AWS_ECS_CLUSTER
ecs-demo
production_ecs
작업에서 접근하는 ECS 클러스터입니다.CI_AWS_ECS_SERVICE
ecs_demo
production_ecs
작업에서 업데이트되는 클러스터의 ECS 서비스입니다. 이 변수가 적절한 환경(production
,staging
,review/*
)에 범위가 지정되었는지 확인하세요.CI_AWS_ECS_TASK_DEFINITION
ecs_demo
production_ecs
작업에서 업데이트되는 ECS 작업 정의입니다.
데모 애플리케이션 변경하기
프로젝트의 파일을 변경하고 ECS에서 데모 애플리케이션에 반영되었는지 확인합니다:
- 왼쪽 사이드바에서 Search or go to를 선택하고
ecs-demo
프로젝트를 찾습니다. -
app/views/welcome/index.html.erb
파일을 엽니다. - Edit를 선택합니다.
- 텍스트를
You're on ECS!
로 변경합니다. - Commit Changes를 선택합니다. 이로 인해 자동으로 새로운 파이프라인이 트리거됩니다. 완료될 때까지 기다립니다.
-
ECS 클러스터에서 실행 중인 애플리케이션에 접근하기. 다음과 같은 것을 볼 수 있어야 합니다:
축하합니다! ECS에 대한 지속적인 배포를 성공적으로 설정했습니다.
참고:
ECS 배포 작업은 종료되기 전에 롤아웃이 완료될 때까지 기다립니다. 이 동작을 비활성화하려면, CI_AWS_ECS_WAIT_FOR_ROLLOUT_COMPLETE_DISABLED
를 비어 있지 않은 값으로 설정하십시오.
리뷰 앱 설정하기
ECS와 함께 리뷰 앱을 사용하려면:
- 새로운 서비스를 설정합니다.
-
CI_AWS_ECS_SERVICE
변수를 사용하여 이름을 설정합니다. - 환경 스코프를
review/*
로 설정합니다.
이 서비스는 모든 리뷰 앱에 의해 공유되기 때문에 동시에 하나의 Review App만 배포할 수 있습니다.
보안 테스트 설정하기
SAST 구성하기
ECS와 함께 SAST를 사용하려면, .gitlab-ci.yml
파일에 다음을 추가하십시오:
include:
- template: Jobs/SAST.gitlab-ci.yml
자세한 내용 및 구성 옵션은 SAST 문서를 참조하십시오.
DAST 구성하기
비기본 브랜치에서 DAST를 사용하려면, 리뷰 앱을 설정하고 .gitlab-ci.yml
파일에 다음을 추가하십시오:
include:
- template: Security/DAST.gitlab-ci.yml
기본 브랜치에서 DAST를 사용하려면:
- 새로운 서비스를 설정합니다. 이 서비스는 임시 DAST 환경을 배포하는 데 사용됩니다.
-
CI_AWS_ECS_SERVICE
변수를 사용하여 이름을 설정합니다. - 스코프를
dast-default
환경으로 설정합니다. -
.gitlab-ci.yml
파일에 다음을 추가하십시오:
include:
- template: Security/DAST.gitlab-ci.yml
- template: Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml
자세한 내용 및 구성 옵션은 DAST 문서를 참조하십시오.
추가 읽기
- 클라우드에 대한 지속적인 배포에 관심이 있다면 클라우드 배포를 참조하십시오.
- 프로젝트에서 DevSecOps를 빠르게 설정하고 싶다면 Auto DevOps를 참조하십시오.
- 프로덕션 등급 환경을 빠르게 설정하고 싶다면 5분 프로덕션 앱을 참조하십시오.