Amazon Elastic Container Service로 배포하기
이 단계별 가이드는 GitLab.com에 호스팅된 프로젝트를 Amazon Elastic Container Service (ECS)로 배포하는 방법을 안내합니다.
이 가이드에서는 AWS 콘솔을 사용하여 매뉴얼으로 ECS 클러스터를 생성하는 것으로 시작합니다. 그런 다음 GitLab 템플릿에서 만든 간단한 애플리케이션을 생성하고 배포합니다.
이 지침은 SaaS 및 Self-managed GitLab 인스턴스 모두에 적용됩니다. 개인 러너(runner)가 구성되어 있는지 확인하세요.
사전 준비 사항
- 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 plan의 사용 가능한 기능을 활용할 수 있도록 공개로 설정하세요. - Create project를 선택하세요.
이제 데모 프로젝트를 만들었으므로, 해당 애플리케이션을 컨테이너화하고 컨테이너 레지스트리에 푸시해야 합니다.
컨테이너화된 애플리케이션 이미지를 GitLab 컨테이너 레지스트리에 푸시
ECS는 컨테이너 오케스트레이션 서비스이므로, 인프라 빌드 중에 컨테이너화된 애플리케이션 이미지를 제공해야 합니다. 이를 위해 GitLab 자동 빌드와 컨테이너 레지스트리를 사용할 수 있습니다.
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고
ecs-demo
프로젝트를 찾습니다. -
CI/CD 설정을 선택합니다. 이것은
.gitlab-ci.yml
생성 양식으로 이동합니다. -
빈
.gitlab-ci.yml
에 다음 내용을 복사하여 붙여넣습니다. 이렇게 하면 ECS로 지속적인 배포를 위한 파이프라인이 정의됩니다.include: - template: AWS/Deploy-ECS.gitlab-ci.yml
-
변경 사항 커밋을 선택합니다. 이렇게 하면 새 파이프라인이 자동으로 트리거됩니다. 이 파이프라인에서
build
작업은 응용 프로그램을 컨테이너화하고 이미지를 GitLab 컨테이너 레지스트리에 푸시합니다. -
배포 > 컨테이너 레지스트리를 방문하세요. 응용 프로그램 이미지가 푸시되었는지 확인하세요.
이제 AWS에서 애플리케이션 이미지를 풀할 수 있는 컨테이너화된 애플리케이션 이미지를 가지고 있습니다. 다음으로 이 애플리케이션 이미지가 AWS에서 사용되는 방식을 정의합니다.
production_ecs
작업이 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의 모든 서브넷을 서브넷에 설정합니다.
- 생성을 선택합니다.
-
ECS 클러스터가 성공적으로 생성되었는지 확인하세요.
이제 다음 단계에서 ECS 클러스터에 ECS 서비스를 등록할 수 있습니다.
다음 사항을 유의하세요:
- 옵션으로 생성 양식에 SSH 키 페어를 설정할 수 있습니다. 이를 통해 디버깅을 위해 EC2 인스턴스에 SSH할 수 있습니다.
- 기존 VPC를 선택하지 않는 경우, 기본적으로 새 VPC를 생성합니다. 계정의 최대 허용 인터넷 게이트웨이 수에 도달하면 오류가 발생할 수 있습니다.
- 클러스터에는 EC2 인스턴스가 필요하므로 인스턴스 유형에 따라 비용이 발생합니다.
ECS 서비스 생성
ECS 서비스 는 ECS 작업 정의를 기반으로 응용 프로그램 컨테이너를 만드는 데몬입니다.
- AWS 콘솔의 ECS > 클러스터 > ecs-demo > 서비스로 이동합니다.
- 배포(Deploy)를 선택합니다. 이렇게 하면 서비스 생성 양식이 열립니다.
-
실행 유형(화성)에서
EC2
를 선택합니다. -
작업 정의(Task definition)에
ecs_demo
를 설정합니다. 이는 위에서 만든 작업 정의에 해당합니다. -
서비스 이름(Service name)에
ecs_demo
를 설정합니다. -
희망하는 작업 수(Desired tasks)에
1
을 설정합니다. - 배포(Deploy)를 선택합니다.
-
생성된 서비스가 활성 상태인지 확인합니다.
AWS의 콘솔 UI가 시간이 지남에 따라 변경될 수 있습니다. 지침에서 관련 컴포넌트를 찾을 수 없는 경우 가장 가까운 컴포넌트를 선택합니다.
데모 응용 프로그램 보기
이제 데모 응용 프로그램에 인터넷에서 액세스할 수 있습니다.
- AWS 콘솔의 EC2 > 인스턴스로 이동합니다.
-
ECS 인스턴스
로 검색하여 ECS 클러스터가 만든 해당 EC2 인스턴스를 찾습니다. - EC2 인스턴스의 ID를 선택합니다. 이렇게 하면 인스턴스 상세 페이지로 이동합니다.
-
퍼블릭 IPv4 주소(Public IPv4 address)를 복사하여 브라우저에 붙여넣습니다. 이제 데모 응용 프로그램이 실행되는 것을 볼 수 있습니다.
이 안내서에서는 HTTPS/SSL이 구성되지 않았습니다. 응용 프로그램에는 HTTP로만 액세스할 수 있습니다(예: http://<ec2-ipv4-address>
).
GitLab으로부터 지속적인 배포 설정
이제 ECS에서 실행 중인 응용 프로그램이 있으므로 GitLab으로부터 지속적인 배포를 설정할 수 있습니다.
배포자로서 새 IAM 사용자 생성
위에서 만든 ECS 클러스터, 서비스 및 작업 정의에 GitLab이 액세스하려면 AWS에 배포자 사용자를 만들어야 합니다.
- AWS 콘솔의 IAM > 사용자로 이동합니다.
- 사용자 추가(Add user)를 선택합니다.
-
사용자 이름(User name)에
ecs_demo
를 설정합니다. - 프로그래밍 방식 액세스(Programmatic access) 확인란을 활성화합니다. 다음: 권한 부여(Next: Permissions)를 선택합니다.
- 권한 부여(Set permissions)에서 기존 정책 직접 연결(Attach existing policies directly)를 선택합니다.
-
정책 디렉터리에서
AmazonECS_FullAccess
를 선택합니다. 다음: 태그(Next: Tags) 및 다음: 검토(Next: Review)를 선택합니다. - 사용자 만들기(Create user)를 선택합니다.
- 생성된 사용자의 액세스 키 ID(Access key ID) 및 비밀 액세스 키(Secret access key)를 메모해 둡니다.
GitLab에서 자격 증명 설정하여 파이프라인 작업이 ECS에 액세스할 수 있도록 함
GitLab CI/CD 변수에 액세스 정보를 등록할 수 있습니다. 이러한 변수는 파이프라인 작업에 주입되어 ECS API에 액세스할 수 있습니다.
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고
ecs-demo
프로젝트를 찾습니다. - 설정(Settings) > CI/CD > 변수(Variables)로 이동합니다.
-
변수 추가(Add Variable)를 선택하고 다음 키-값 쌍을 설정합니다.
키 값 비고 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
ECS 클러스터는 production_ecs
작업에 의해 액세스됩니다.CI_AWS_ECS_SERVICE
ecs_demo
클러스터의 ECS 서비스는 production_ecs
작업에 의해 업데이트됩니다. 이 변수가 적절한 환경(production
,staging
,review/*
)에 대해 범위가 지정되었는지 확인하세요.CI_AWS_ECS_TASK_DEFINITION
ecs_demo
ECS 작업 정의는 production_ecs
작업에 의해 업데이트됩니다.
데모 응용 프로그램 변경
프로젝트의 파일을 변경하고 해당 변경 사항이 ECS의 데모 응용 프로그램에 반영되는지 확인합니다.
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고
ecs-demo
프로젝트를 찾습니다. -
app/views/welcome/index.html.erb
파일을 엽니다. - 편집(Edit)을 선택합니다.
- 텍스트를
You're on ECS!
로 변경합니다. - 변경 사항 커밋(Commit Changes)을 선택합니다. 이렇게 하면 자동으로 새 파이프라인이 트리거됩니다. 완료될 때까지 기다립니다.
-
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 구성
비기본 브랜치에서 리뷰 앱 설정을 하고, 다음을 .gitlab-ci.yml
파일에 추가하여 DAST를 사용하세요.
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분 프로덕션 앱를 참조하세요.