Amazon Elastic Container Service에 배포
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
이 단계별 가이드는 GitLab.com에서 호스팅된 프로젝트를 Amazon Elastic Container Service (ECS)에 배포하는 방법을 안내합니다. 이 가이드에서는 AWS 콘솔을 사용하여 ECS 클러스터를 수동으로 생성하는 것으로 시작합니다.
이 단계별 가이드는 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 프로젝트 템플릿을 사용하여 시작합니다. 이름에서 알 수 있듯이, 이 프로젝트는 잘 알려진 프레임워크를 기반으로 구축된 기본적인 애플리케이션을 제공합니다.
- 오른쪽 상단 모서리에서 새로 만들기(+)를 선택한 다음 새 프로젝트/리포지터리를 선택합니다.
- 템플릿에서 생성을 선택하면 Ruby on Rails, Spring, 또는 NodeJS Express 프로젝트 중에서 선택할 수 있습니다. 이 가이드에서는 Ruby on Rails 템플릿을 사용합니다.
- 프로젝트 이름을 지정합니다. 이 예시에서는
ecs-demo라고 합니다. GitLab Ultimate 플랜에서 사용 가능한 기능을 활용할 수 있도록 공개로 설정합니다. - 프로젝트 생성을 선택합니다.
데모 프로젝트를 생성했으면, 이제 애플리케이션을 컨테이너화하여 컨테이너 레지스트리에 push해야 합니다.
GitLab 컨테이너 레지스트리에 컨테이너화된 애플리케이션 이미지 push#
ECS는 컨테이너 오케스트레이션 서비스이므로, 인프라 빌드 중에 컨테이너화된 애플리케이션 이미지를 제공해야 합니다. 이를 위해 GitLab Auto Build와 Container Registry를 사용할 수 있습니다.
-
상단 표시줄에서 검색 또는 이동을 선택하고
ecs-demo프로젝트를 찾습니다. -
CI/CD 설정을 선택합니다.
.gitlab-ci.yml생성 양식으로 이동합니다. -
다음 콘텐츠를 빈
.gitlab-ci.yml에 복사하여 붙여넣습니다. 이는 ECS에 대한 지속적 배포 파이프라인을 정의합니다.include: - template: AWS/Deploy-ECS.gitlab-ci.yml -
변경 사항 커밋을 선택합니다. 그러면 자동으로 새 파이프라인이 트리거됩니다. 이 파이프라인에서
build작업이 애플리케이션을 컨테이너화하고 이미지를 GitLab 컨테이너 레지스트리에 push합니다. -
배포 > 컨테이너 레지스트리를 방문합니다. 애플리케이션 이미지가 push되었는지 확인합니다.

이제 AWS에서 pull할 수 있는 컨테이너화된 애플리케이션 이미지가 있습니다. 다음으로 AWS에서 이 애플리케이션 이미지가 사용되는 방식의 사양을 정의합니다.
ECS 클러스터가 아직 연결되지 않아 production_ecs 작업이 실패합니다. 나중에 이를 수정할 수 있습니다.
ECS 태스크 정의 생성#
ECS 태스크 정의는 ECS 서비스에서 애플리케이션 이미지를 시작하는 방법에 대한 사양입니다.
-
AWS 콘솔에서 ECS > 태스크 정의로 이동합니다.
-
새 태스크 정의 생성을 선택합니다.

-
시작 유형으로 EC2를 선택합니다. 다음 단계를 선택합니다.
-
태스크 정의 이름에
ecs_demo를 설정합니다. -
태스크 크기 > 태스크 메모리 및 태스크 CPU에
512를 설정합니다. -
컨테이너 정의 > 컨테이너 추가를 선택합니다. 컨테이너 등록 양식이 열립니다.
-
컨테이너 이름에
web을 설정합니다. -
이미지에
registry.gitlab.com/<your-namespace>/ecs-demo/master:latest를 설정합니다. 또는 GitLab 컨테이너 레지스트리 페이지에서 이미지 경로를 복사하여 붙여넣을 수 있습니다.
-
포트 매핑을 추가합니다. 호스트 포트에
80을, 컨테이너 포트에5000을 설정합니다.
-
생성을 선택합니다.
이제 초기 태스크 정의가 있습니다. 다음으로 애플리케이션 이미지를 실행하기 위한 실제 인프라를 생성합니다.
ECS 클러스터 생성#
ECS 클러스터는 ECS 서비스의 가상 그룹입니다. 또한 계산 리소스로서 EC2 또는 Fargate와 연결됩니다.
-
AWS 콘솔에서 ECS > 클러스터로 이동합니다.
-
클러스터 생성을 선택합니다.
-
클러스터 템플릿으로 EC2 Linux + Networking을 선택합니다. 다음 단계를 선택합니다.
-
클러스터 이름에
ecs-demo를 설정합니다. -
네트워킹에서 기본 VPC를 선택합니다. 기존 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를 선택합니다. 인스턴스 상세 페이지로 이동합니다.
-
Public IPv4 address를 복사하여 브라우저에 붙여넣습니다. 이제 데모 애플리케이션이 실행 중인 것을 볼 수 있습니다.

이 가이드에서는 HTTPS/SSL이 구성되어 있지 않습니다. HTTP로만 애플리케이션에 접근할 수 있습니다(예: http://<ec2-ipv4-address>).
GitLab에서 지속적 배포 설정#
ECS에서 애플리케이션이 실행되면, GitLab에서 지속적 배포를 설정할 수 있습니다.
배포자로서 새 IAM 사용자 생성#
GitLab이 이전에 생성한 ECS 클러스터, 서비스, 태스크 정의에 접근하려면 AWS에서 배포자 사용자를 생성해야 합니다:
-
AWS 콘솔에서 IAM > 사용자로 이동합니다.
-
사용자 추가를 선택합니다.
-
사용자 이름에
ecs_demo를 설정합니다. -
프로그래밍 방식 액세스 체크박스를 활성화합니다. 다음: 권한을 선택합니다.
-
권한 설정에서
기존 정책 직접 연결을 선택합니다. -
정책 목록에서
AmazonECS_FullAccess를 선택합니다. 다음: 태그 및 다음: 검토를 선택합니다.
-
사용자 생성을 선택합니다.
-
생성된 사용자의 액세스 키 ID 및 비밀 액세스 키를 기록해 둡니다.
비밀 액세스 키를 공개적인 장소에 공유하지 마세요. 안전한 곳에 저장해야 합니다.
파이프라인 작업이 ECS에 접근할 수 있도록 GitLab에 자격 증명 설정#
GitLab CI/CD 변수에 접근 정보를 등록할 수 있습니다. 이 변수들은 파이프라인 작업에 주입되어 ECS API에 접근할 수 있습니다.
-
상단 표시줄에서 검색 또는 이동을 선택하고
ecs-demo프로젝트를 찾습니다. -
설정 > CI/CD > 변수로 이동합니다.
-
변수 추가를 선택하고 다음 키-값 쌍을 설정합니다.
키 값 참고 AWS_ACCESS_KEY_ID<배포자의 액세스 키 ID>awsCLI 인증용.AWS_SECRET_ACCESS_KEY<배포자의 비밀 액세스 키>awsCLI 인증용.AWS_DEFAULT_REGIONus-east-2awsCLI 인증용.CI_AWS_ECS_CLUSTERecs-demoproduction_ecs작업이 ECS 클러스터에 접근합니다.CI_AWS_ECS_SERVICEecs_demoproduction_ecs작업이 클러스터의 ECS 서비스를 업데이트합니다. 이 변수의 범위를 적절한 환경(production,staging,review/*)으로 지정해야 합니다.CI_AWS_ECS_TASK_DEFINITIONecs_demoproduction_ecs작업이 ECS 태스크 정의를 업데이트합니다.
데모 애플리케이션 변경#
프로젝트의 파일을 변경하고 ECS의 데모 애플리케이션에 반영되는지 확인합니다:
-
상단 표시줄에서 검색 또는 이동을 선택하고
ecs-demo프로젝트를 찾습니다. -
app/views/welcome/index.html.erb파일을 엽니다. -
편집을 선택합니다.
-
텍스트를
You're on ECS!로 변경합니다. -
변경 사항 커밋을 선택합니다. 자동으로 새 파이프라인이 트리거됩니다. 완료될 때까지 기다립니다.
-
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분 프로덕션 앱을 참조하세요.
