Amazon Elastic Container Service로 배포

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

이 단계별 가이드에서는 GitLab.com에 호스팅된 프로젝트를 Amazon Elastic Container Service(ECS)에 배포하는 방법을 안내합니다.

이 가이드에서는 AWS 콘솔을 사용하여 수동으로 ECS 클러스터를 생성하는 것으로 시작합니다. 그런 다음 GitLab 템플릿에서 생성한 간단한 응용 프로그램을 만들고 배포합니다.

이 지침은 SaaS 및 Self-managed GitLab 인스턴스 모두에서 작동합니다. 자체 런너(runners)가 구성되었는지 확인하세요.

전제 조건

  • 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 플랜에서 사용 가능한 기능을 활용할 수 있도록 공개로 설정하세요. Create project를 선택합니다.

이제 데모 프로젝트를 생성했으므로 응용 프로그램을 컨테이너화하고 컨테이너 레지스트리에 푸시해야 합니다.

컨테이너화된 응용 프로그램 이미지를 GitLab 컨테이너 레지스트리에 푸시

ECS는 컨테이너 오케스트레이션 서비스로써, 인프라 구축 중에 컨테이너화된 응용 프로그램 이미지를 제공해야 합니다. 이를 위해 GitLab Auto Build컨테이너 레지스트리를 사용할 수 있습니다.

왼쪽 사이드바에서 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 컨테이너 레지스트리에 푸시합니다.

Create project

Deploy > Container Registry를 방문하여 응용 프로그램 이미지가 올려졌는지 확인합니다.

Create project

이제 AWS에서 가져올 수 있는 컨테이너화된 응용 프로그램 이미지가 준비되었습니다. 다음으로 이 이미지를 AWS에서 사용하는 방법을 정의합니다.

production_ecs 작업이 ECS 클러스터에 연결되지 않아 실패한다는 점에 유의하세요. 나중에 이것을 수정할 것입니다.

ECS 작업 정의 생성

ECS 작업 정의는 어떻게 응용 프로그램 이미지가 ECS 서비스에 의해 시작되는지에 대한 사양입니다.

AWS 콘솔ECS > Task Definitions로 이동합니다. Create new Task Definition을 선택합니다.

Create project

EC2를 런치 유형으로 선택하고 Next Step을 선택합니다. ecs_demoTask Definition Name으로 설정합니다. 512Task Size > Task memoryTask CPU로 설정합니다. Container Definitions > Add container를 선택합니다. 이렇게 하면 컨테이너 등록 폼이 열립니다. webContainer name으로 설정합니다. registry.gitlab.com/<your-namespace>/ecs-demo/master:latestImage로 설정합니다. 또는 GitLab 컨테이너 레지스트리 페이지에서 이미지 경로를 복사하여 붙여넣을 수 있습니다.

Create project

포트 매핑을 추가합니다. 80Host Port로, 5000Container port로 설정합니다.

Create project

Create를 선택합니다.

이제 초기 작업 정의가 완료되었습니다. 다음으로 응용 프로그램 이미지를 실행하는 실제 인프라를 생성합니다.

ECS 클러스터 생성

ECS 클러스터는 가상의 ECS 서비스 그룹입니다. 또한 계산 리소스로는 EC2 또는 Fargate가 연관되어 있습니다.

  1. AWS 콘솔에서 ECS > 클러스터로 이동합니다.
  2. 클러스터 생성을 선택합니다.
  3. 클러스터 템플릿으로 EC2 Linux + 네트워킹을 선택합니다. 다음 단계를 선택합니다.
  4. 클러스터 이름ecs-demo를 설정합니다.
  5. 네트워킹에서 기본 VPC를 선택합니다. 기존 VPC가 없는 경우, 새로 생성하기 위해 그대로 둘 수 있습니다.
  6. VPC의 모든 서브넷을 서브넷으로 설정합니다.
  7. 생성을 선택합니다.
  8. ECS 클러스터가 성공적으로 생성되었는지 확인합니다.

    프로젝트 생성

이제 다음 단계에서 ECS 클러스터에 ECS 서비스를 등록할 수 있습니다.

다음을 참고하세요: - 선택 사항으로 생성 양식에서 SSH 키 쌍을 설정할 수 있습니다. 이를 통해 디버깅을 위해 EC2 인스턴스에 SSH 할 수 있습니다. - 기존 VPC를 선택하지 않으면, 기본적으로 새 VPC가 생성됩니다. 계정의 인터넷 게이트웨이 최대 허용 수에 도달하면 오류가 발생할 수 있습니다. - 클러스터에는 EC2 인스턴스가 필요하며, 이는 인스턴스 유형에 따라 비용이 발생합니다.

ECS 서비스 생성

ECS 서비스ECS 작업 정의를 기반으로 애플리케이션 컨테이너를 생성하는 데몬입니다.

  1. AWS 콘솔에서 ECS > 클러스터 > ecs-demo > 서비스로 이동합니다.
  2. 배포를 선택합니다. 이렇게 하면 서비스 생성 양식을 엽니다.
  3. 배포 유형에서 EC2를 선택합니다.
  4. 작업 정의ecs_demo를 설정합니다. 이는 앞서 생성한 작업 정의에 해당합니다.
  5. 서비스 이름ecs_demo를 설정합니다.
  6. 원하는 작업1을 설정합니다.

    프로젝트 생성

  7. 배포를 선택합니다.
  8. 생성된 서비스가 활성 상태인지 확인합니다.

    프로젝트 생성

AWS 콘솔의 UI는 때때로 변경됩니다. 지침에서 관련 구성 요소를 찾을 수 없는 경우, 가장 유사한 항목을 선택합니다.

데모 애플리케이션 보기

이제 데모 애플리케이션은 인터넷에서 접근할 수 있습니다.

  1. AWS 콘솔에서 EC2 > 인스턴스로 이동합니다.
  2. ECS 인스턴스로 검색하여 ECS 클러스터가 생성한 해당 EC2 인스턴스를 찾습니다.
  3. EC2 인스턴스의 ID를 선택합니다. 이렇게 하면 인스턴스 상세 페이지로 이동합니다.
  4. 퍼블릭 IPv4 주소를 복사하여 브라우저에 붙여넣습니다. 이제 데모 애플리케이션을 실행할 수 있습니다.

    프로젝트 생성

이 안내서에서 HTTPS/SSL은 구성되지 않습니다. 애플리케이션에는 HTTP를 통해서만 액세스할 수 있습니다 (예: http://<ec2-ipv4-address>).

GitLab으로부터 지속적인 배포 설정

이제 ECS에서 실행 중인 애플리케이션이 있으므로 GitLab에서 지속적인 배포를 설정할 수 있습니다.

배포자로서 새 IAM 사용자 생성

GitLab이 위에서 생성한 ECS 클러스터, 서비스 및 작업 정의에 액세스하려면 AWS에 배포자 사용자를 생성해야 합니다:

  1. AWS 콘솔에서 IAM > 사용자로 이동합니다.
  2. 사용자 추가를 선택합니다.
  3. 사용자 이름ecs_demo를 설정합니다.
  4. 프로그래밍 방식 액세스 확인란를 활성화합니다. 다음: 권한 부여를 선택합니다.
  5. 권한 설정에서 기존 정책 직접 연결을 선택합니다.
  6. 정책 목록에서 AmazonECS_FullAccess를 선택합니다. 다음: 태그 추가다음: 검토를 선택합니다.

    프로젝트 생성

  7. 사용자 생성을 선택합니다.
  8. 생성된 사용자의 액세스 키 ID비밀 액세스 키를 메모합니다.

참고: 비밀 액세스 키를 공개 장소에 공유하지 마십시오. 안전한 장소에 저장하여야 합니다.

GitLab에서 자격 증명 설정하여 파이프라인 작업이 ECS에 액세스하도록 함

GitLab CI/CD Variables에 액세스 정보를 등록할 수 있습니다. 이러한 변수는 파이프라인 작업에 주입되어 ECS API에 액세스할 수 있습니다.

  1. 왼쪽 사이드바에서 Search or go to을 선택하고 ecs-demo 프로젝트를 찾습니다.
  2. Settings > CI/CD > Variables로 이동합니다.
  3. Add Variable를 선택하고 다음 키-값 쌍을 설정합니다.

    Key Value Note
    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 클러스터의 ECS 서비스는 production_ecs 작업에서 업데이트됩니다. 해당 변수가 적절한 환경(production, staging, review/*)에 대해 범위가 지정되어 있는지 확인하세요.
    CI_AWS_ECS_TASK_DEFINITION ecs_demo production_ecs 작업에서 업데이트되는 ECS 태스크 정의입니다.

데모 애플리케이션에 변경 사항 적용

프로젝트에서 파일을 변경하고 해당 변경 내용이 ECS의 데모 애플리케이션에 반영되는지 확인하세요:

  1. 왼쪽 사이드바에서 Search or go to을 선택하고 ecs-demo 프로젝트를 찾습니다.
  2. app/views/welcome/index.html.erb 파일을 엽니다.
  3. Edit을 선택합니다.
  4. 텍스트를 You're on ECS!로 변경합니다.
  5. Commit Changes를 선택합니다. 이렇게 하면 새로운 파이프라인이 자동으로 트리거됩니다. 완료될 때까지 기다립니다.
  6. ECS 클러스터에서 실행 중인 애플리케이션에 액세스합니다. 다음을 확인해 보세요:

    프로젝트 생성

축하합니다! ECS로의 지속적인 배포를 성공적으로 설정했습니다.

주의: ECS 배포 작업은 종료 전에 롤아웃이 완료될 때까지 대기합니다. 이 동작을 비활성화하려면 CI_AWS_ECS_WAIT_FOR_ROLLOUT_COMPLETE_DISABLED를 비어 있지 않은 값으로 설정하세요.

리뷰 앱 설정

ECS와 함께 리뷰 앱을 사용하려면:

  1. 새로운 서비스를 설정합니다.
  2. CI_AWS_ECS_SERVICE 변수를 사용하여 이름을 설정합니다.
  3. 환경 범위를 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를 사용하려면:

  1. 새로운 서비스를 설정합니다. 이 서비스는 임시 DAST 환경을 배포하는 데 사용됩니다.
  2. CI_AWS_ECS_SERVICE 변수를 사용하여 이름을 설정합니다.
  3. 스코프를 dast-default 환경으로 설정합니다.
  4. 다음을 .gitlab-ci.yml 파일에 추가하세요:
include:
  - template: Security/DAST.gitlab-ci.yml
  - template: Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml

자세한 내용과 구성 옵션은 DAST 문서를 참조하세요.

추가 정보

  • 클라우드에 대한 지속적인 배포에 대해 더 알고 싶다면 클라우드 배포를 참조하세요.
  • 프로젝트에서 빠르게 DevSecOps를 설정하려면 Auto DevOps를 참조하세요.
  • 프로덕션 수준의 환경을 빠르게 설정하려면 5분간의 프로덕션 앱를 참조하세요.