Amazon Elastic Container Service에 배포하기
Amazon Elastic Container Service에 배포하기
이 단계별 가이드는 GitLab.com에 호스팅된 프로젝트를 Amazon Elastic Container Service(ECS)에 배포하는 전체 과정을 보여줘요. AWS 콘솔에서 ECS 클러스터를 수동으로 프로비저닝하는 것으로 시작해서, GitLab 템플릿으로 빌드한 애플리케이션을 배포하는 흐름입니다.
출처: 문서
본문
이 단계별 가이드는 GitLab.com에 호스팅된 프로젝트를 Amazon Elastic Container Service(ECS)에 배포하도록 도와줍니다.
AWS 콘솔에서 ECS 클러스터를 수동으로 프로비저닝하는 것으로 시작합니다. 그런 다음 GitLab 템플릿으로 빌드된 애플리케이션을 배포해요.
이 안내는 GitLab.com과 GitLab Self-Managed 인스턴스 모두에서 동작합니다. 자신의 러너가 구성되어 있는지 확인하세요.
전제 조건
- AWS 계정. 기존 AWS 계정으로 로그인하거나 새 계정을 만듭니다.
- 이 가이드에서는
us-east-2리전에 인프라를 만듭니다. 어떤 리전이든 사용할 수 있지만, 시작한 후에는 바꾸지 마세요.
AWS에 인프라와 초기 배포 만들기
GitLab에서 애플리케이션을 배포하려면 먼저 AWS에 인프라와 초기 배포를 만들어야 합니다. 여기에는 ECS 클러스터와 ECS 태스크 정의, ECS 서비스, 컨테이너화된 애플리케이션 이미지 같은 관련 구성 요소가 포함됩니다.
첫 단계로 프로젝트 템플릿에서 데모 애플리케이션을 만듭니다.
템플릿에서 새 프로젝트 만들기
GitLab 프로젝트 템플릿으로 시작하세요. 이름이 말해주듯 이 프로젝트들은 잘 알려진 프레임워크 위에 만들어진 뼈대만 있는 애플리케이션을 제공합니다.
- 오른쪽 상단 모서리에서 Create new(플러스)와 New project/repository를 선택하세요.
- Create from template을 선택합니다. Ruby on Rails, Spring, NodeJS Express 프로젝트 중에서 고를 수 있어요. 이 가이드에서는 Ruby on Rails 템플릿을 사용합니다.
- 프로젝트에 이름을 정합니다. 이 예시에서는
ecs-demo라고 합니다. GitLab Ultimate 플랜의 기능을 활용할 수 있도록 공개(public)로 만들어 두세요. - 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 콘솔에서 ECS > Task Definitions로 이동합니다.
- Create new Task Definition을 선택합니다.

- 실행 유형으로 EC2를 선택하고 Next Step을 선택합니다.
- Task Definition Name에
ecs_demo를 설정합니다. - Task Size > Task memory와 Task CPU에
512를 설정합니다. - Container Definitions > Add container를 선택합니다. 컨테이너 등록 폼이 열려요.
- Container name에
web을 설정합니다. - Image에
registry.gitlab.com/<your-namespace>/ecs-demo/master:latest를 설정합니다. 대신 GitLab 컨테이너 레지스트리 페이지에서 이미지 경로를 복사해 붙여 넣을 수도 있어요.
- 포트 매핑을 추가합니다. Host Port에
80, Container port에5000을 설정합니다.
- Create를 선택합니다.
이제 초기 태스크 정의가 준비됐어요. 다음으로 애플리케이션 이미지를 실행할 실제 인프라를 만듭니다.
ECS 클러스터 만들기
ECS 클러스터는 ECS 서비스의 가상 그룹입니다. 컴퓨팅 리소스로 EC2 또는 Fargate와 연결됩니다.
- AWS 콘솔에서 ECS > Clusters로 이동합니다.
- Create Cluster를 선택합니다.
- 클러스터 템플릿으로 EC2 Linux + Networking을 선택하고 Next Step을 선택합니다.
- Cluster Name에
ecs-demo를 설정합니다. - Networking에서 기본 VPC를 선택합니다. 기존 VPC가 없다면 그대로 두어 새 VPC를 만들 수 있어요.
- Subnets에 VPC의 사용 가능한 서브넷을 모두 설정합니다.
- Create를 선택합니다.
- ECS 클러스터가 성공적으로 만들어졌는지 확인합니다.

이제 다음 단계에서 ECS 클러스터에 ECS 서비스를 등록할 수 있어요.
다음을 유의하세요.
- 선택 사항으로 생성 폼에서 SSH 키 페어를 설정할 수 있습니다. 그러면 디버깅을 위해 EC2 인스턴스에 SSH로 접속할 수 있어요.
- 기존 VPC를 선택하지 않으면 기본적으로 새 VPC가 생성됩니다. 계정에 허용된 최대 인터넷 게이트웨이 수에 도달하면 오류가 발생할 수 있어요.
- 클러스터는 EC2 인스턴스를 필요로 하므로 인스턴스 타입에 따라 비용이 발생합니다.
ECS 서비스 만들기
ECS 서비스는 ECS 태스크 정의를 기반으로 애플리케이션 컨테이너를 만드는 데몬입니다.
- AWS 콘솔에서 ECS > Clusters > ecs-demo > Services로 이동합니다.
- Deploy를 선택합니다. 서비스 생성 폼이 열려요.
- Launch Type에서
EC2를 선택합니다. - Task definition에
ecs_demo를 설정합니다. 이는 앞서 만든 태스크 정의에 해당합니다. - Service name에
ecs_demo를 설정합니다. - Desired tasks에
1을 설정합니다.
- Deploy를 선택합니다.
- 생성된 서비스가 활성 상태인지 확인합니다.

AWS 콘솔 UI는 때때로 바뀝니다. 안내에서 관련 구성 요소를 찾을 수 없으면 가장 가까운 것을 선택하세요.
데모 애플리케이션 보기
이제 데모 애플리케이션을 인터넷에서 접근할 수 있습니다.
- AWS 콘솔에서 EC2 > Instances로 이동합니다.
ECS Instance로 검색해 ECS 클러스터가 만든 EC2 인스턴스를 찾습니다.- EC2 인스턴스의 ID를 선택합니다. 인스턴스 세부 정보 페이지로 이동해요.
- Public IPv4 address를 복사해 브라우저에 붙여 넣습니다. 이제 실행 중인 데모 애플리케이션을 볼 수 있습니다.

이 가이드에서는 HTTPS/SSL이 구성되지 않았어요. HTTP로만 애플리케이션에 접근할 수 있습니다(예: http://<ec2-ipv4-address>).
GitLab에서 지속적 배포 설정하기
이제 ECS에서 애플리케이션이 실행되고 있으니, GitLab에서 지속적 배포를 설정할 수 있습니다.
배포용 새 IAM 사용자 만들기
GitLab이 앞서 만든 ECS 클러스터, 서비스, 태스크 정의에 접근하려면 AWS에 배포 사용자를 만들어야 합니다.
- AWS 콘솔에서 IAM > Users로 이동합니다.
- Add user를 선택합니다.
- User name에
ecs_demo를 설정합니다. - Programmatic access 체크박스를 활성화합니다. Next: Permissions를 선택하세요.
- Set permissions에서
Attach existing policies directly를 선택합니다. - 정책 목록에서
AmazonECS_FullAccess를 선택합니다. Next: Tags와 Next: Review를 선택하세요.
- Create user를 선택합니다.
- 생성된 사용자의 Access key ID와 Secret access key를 적어 둡니다.
시크릿 접근 키를 공개된 곳에 공유하지 마세요. 반드시 안전한 곳에 저장해야 합니다.
파이프라인 잡이 ECS에 접근하도록 GitLab에 자격 증명 설정하기
GitLab CI/CD Variables에 접근 정보를 등록할 수 있습니다. 이 변수들은 파이프라인 잡에 주입되며 ECS API에 접근할 수 있어요.
- 상단 바에서 Search or go to를 선택하고
ecs-demo프로젝트를 찾습니다. - Settings > CI/CD > Variables로 이동합니다.
- Add Variable을 선택하고 다음 키-값 쌍을 설정합니다.
| 키 | 값 | 설명 |
|---|---|---|
AWS_ACCESS_KEY_ID |
<Access key ID of the deployer> |
aws CLI 인증용. |
AWS_SECRET_ACCESS_KEY |
<Secret access key of the deployer> |
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/*로 설정합니다.
이 서비스는 모든 리뷰 앱이 공유하므로 한 번에 하나의 리뷰 앱만 배포할 수 있어요.
보안 테스트 설정하기
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 Minute Production App을 참고하세요.
더 알아보기
이 가이드의 흐름은 인프라(클러스터·서비스·태스크 정의)를 먼저 준비한 뒤, GitLab에 자격 증명과 템플릿을 연결하고, 마지막으로 코드 변경이 ECS에 자동 배포되는지 확인하는 순서예요. 한번 연결해 두면 이후에는 브랜치 푸시만으로 배포가 이뤄집니다. 다음 단계로는 SAST/DAST 같은 보안 테스트를 파이프라인에 더하거나, 리뷰 앱을 같은 ECS 서비스로 운용하는 방법을 살펴보면 좋아요.