이 가이드에서는 Cloud Build 및 Terraform을 사용하여 Compute Engine 관리형 인스턴스 그룹(MIG)에서 제로 다운타임 블루/그린 배포를 수행하는 방법을 설명합니다.
Cloud Build를 사용하면 애플리케이션을 빌드하고 Compute Engine, Google Kubernetes Engine, GKE Enterprise, Cloud Run 함수와 같은 다양한 런타임에 배포하는 등 다양한 개발자 프로세스를 자동화할 수 있습니다. Google Cloud
Compute Engine MIG를 사용하면 동일한 여러 가상 머신(VM)에서 애플리케이션을 운영할 수 있습니다. 자동 확장, 자동 복구, 리전(멀티 영역) 배포, 자동 업데이트 등의 자동화된 MIG 서비스를 활용하여 워크로드의 확장성 및 가용성을 높일 수 있습니다. 블루/그린 지속적 배포 모델을 사용하여 프로덕션에서 실행 중인 한 MIG(블루)에서 다른 MIG(그린)로 사용자 트래픽을 점진적으로 전송하는 방법을 알아봅니다.
시작하기 전에
-
Enable the Cloud Build, Cloud Run, Artifact Registry, and Resource Manager APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles.
애플리케이션 소스 코드를 준비합니다. 소스 코드는 GitHub 또는 Bitbucket과 같은 저장소에 저장되어야 합니다.
이 페이지에서
gcloud
명령어를 실행하려면 Google Cloud CLI를 설치합니다.
필요한 Identity and Access Management 권한
-
Google Cloud 콘솔에서 settings Cloud Build 권한 페이지로 이동합니다.
지정된 Cloud Build 서비스 계정 또는 기본 Cloud Build 서비스 계정의 경우 다음 역할의 상태를 사용 설정됨으로 설정합니다.
- Compute 인스턴스 관리자 v1 (
roles/compute.instanceAdmin
) | Cloud Build가 Compute Engine에 새 인스턴스를 배포할 수 있습니다.- '서비스 계정 사용자 역할 할당' 패널에서 가장할 서비스 계정을 선택한 다음 권한 부여를 클릭합니다.
- 스토리지 관리자 (
roles/storage.admin
) | Cloud Storage에서 읽기 및 쓰기를 사용 설정합니다. - Artifact Registry 작성자 (
roles/artifactregistry.writer
) | Artifact Registry에서 이미지를 가져오고 Artifact Registry에 이미지를 쓸 수 있습니다. - 로그 작성자 (
roles/logging.logWriter
) | 로그 항목을 Cloud Logging에 쓸 수 있습니다. - Cloud Build 편집자 (
roles/cloudbuild.builds.editor
) | 서비스 계정이 빌드를 실행할 수 있도록 허용합니다.
- Compute 인스턴스 관리자 v1 (
디자인 개요
다음 다이어그램은 이 문서에 설명된 코드 샘플에서 사용하는 블루-그린 배포 모델을 보여줍니다.
대략적으로 이 모델에는 다음 구성요소가 포함됩니다.
- 블루 및 그린의 Compute Engine VM 풀 두 개
- 3개의 외부 HTTP(S) 부하 분산기:
- 최종 사용자의 트래픽을 VM 인스턴스의 블루 또는 그린 풀로 라우팅하는 블루-그린 부하 분산기입니다.
- QA 엔지니어와 개발자로부터의 트래픽을 블루 VM 인스턴스 풀로 라우팅하는 블루 부하 분산기입니다.
- QA 엔지니어와 개발자로부터의 트래픽을 그린 인스턴스 풀로 라우팅하는 그린 부하 분산기입니다.
- 2개의 사용자 그룹:
- 블루 또는 그린 인스턴스 풀을 가리키는 블루-그린 부하 분산기에 액세스할 수 있는 최종 사용자입니다.
- 개발 및 테스트 목적으로 두 풀 집합에 모두 액세스해야 하는 QA 엔지니어 및 개발자입니다. 여기에 속하는 경우 블루 및 그린 부하 분산기에 모두 액세스할 수 있으며, 이는 사용자를 블루 인스턴스 풀과 그린 인스턴스 풀로 각각 라우팅합니다.
블루 및 그린 VM 풀은 Compute Engine MIG로 구현되며 외부 IP 주소는 외부 HTTP(S) 부하 분산기를 사용하여 MIG의 VM으로 라우팅됩니다. 이 문서에 설명된 코드 샘플은 Terraform을 사용하여 이 인프라를 구성합니다.
다음 다이어그램은 배포에서 발생하는 개발자 작업을 보여줍니다.
이전 다이어그램에서 빨간색 화살표는 배포 인프라를 처음 설정할 때 발생하는 부트스트랩 흐름을 나타내고, 파란색 화살표는 각 배포 중에 발생하는 GitOps 흐름을 나타냅니다.
이 인프라를 설정하려면 부트스트랩 프로세스를 시작하고 GitOps 흐름의 구성요소를 설정하는 설정 스크립트를 실행합니다.
설정 스크립트는 다음 작업을 수행하는 Cloud Build 파이프라인을 실행합니다.
- Cloud Source Repositories에
copy-of-gcp-mig-simple
이라는 저장소를 만들고 소스 코드를 GitHub 샘플 저장소에서 Cloud Source Repositories의 저장소로 복사합니다. apply
및destroy
라는 이름의 Cloud Build 트리거 두 개를 만듭니다.
apply
트리거는 Cloud Source Repositories의 main.tfvars
라는 Terraform 파일에 연결됩니다. 이 파일에는 블루 및 그린 부하 분산기를 나타내는 Terraform 변수가 포함되어 있습니다.
배포를 설정하려면 main.tfvars
파일에서 변수를 업데이트합니다.
apply
트리거는 tf_apply
를 실행하고 다음 작업을 수행하는 Cloud Build 파이프라인을 실행합니다.
- Compute Engine MIG 2개(그린 1개, 블루 1개), Compute Engine VM 인스턴스 4개(그린 MIG 2개, 블루 MIG 2개), 부하 분산기 3개(블루, 그린, 분할기), 공개 IP 주소 3개를 만듭니다.
- 블루 및 그린 인스턴스에서 배포된 애플리케이션을 확인하는 데 사용할 수 있는 IP 주소를 출력합니다.
폐기 트리거는 수동으로 트리거되어 적용 트리거로 생성된 모든 리소스를 삭제합니다.
사용해 보기
Google 코드 샘플 저장소에서 설정 스크립트를 실행합니다
bash <(curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloud-build-samples/main/mig-blue-green/setup.sh)
설정 스크립트에서 사용자 동의를 요청하면 yes를 입력합니다.
이 스크립트는 몇 초 후에 실행됩니다.
Google Cloud 콘솔에서 Cloud Build 빌드 기록 페이지를 엽니다.
최신 빌드를 클릭합니다.
세 가지 빌드 단계가 포함된 Cloud Build 파이프라인을 보여주는 빌드 세부정보 페이지가 표시됩니다. 첫 번째 빌드 단계에서는 Cloud Source Repositories에 저장소를 만들고 두 번째 단계는 GitHub 샘플 저장소의 콘텐츠를 Cloud Source Repositories에 클론하고, 세 번째 단계에서는 두 개의 빌드 트리거를 추가합니다.
Cloud Source Repositories를 엽니다.
저장소 목록에서
copy-of-gcp-mig-simple
을 클릭합니다.페이지 하단의 기록 탭에는
copy-of-gcp-mig-simple
이라는 저장소를 만들기 위해 Cloud Build가 수행한A copy of https://github.com/GoogleCloudPlatform/cloud-build-samples.git
설명의 커밋 한개가 표시됩니다.Cloud Build 트리거 페이지를 엽니다.
배포 프로세스를 시작하려면
infra/main.tfvars
파일을 업데이트합니다.터미널 창에서
deploy-compute-engine
이라는 폴더를 만들고 이동합니다.mkdir ~/deploy-compute-engine cd ~/deploy-compute-engine
copy-of-gcp-mig-simple
저장소를 클론합니다.gcloud source repos clone copy-of-mig-blue-green
클론된 디렉터리로 이동합니다.
cd ./copy-of-mig-blue-green
infra/main.tfvars
를 업데이트하여 블루를 그린으로 바꿉니다.sed -i'' -e 's/blue/green/g' infra/main.tfvars
업데이트된 파일을 추가합니다.
git add .
파일을 커밋합니다.
git commit -m "Promote green"
파일을 푸시합니다.
git push
infra/main.tfvars
를 변경하면apply
트리거 실행이 트리거되고 배포가 시작됩니다.
Cloud Source Repositories를 엽니다.
저장소 목록에서
copy-of-gcp-mig-simple
을 클릭합니다.페이지 하단의 기록 탭에 설명
Promote green
이 포함된 커밋이 표시됩니다.apply
트리거 실행을 보려면 Google Cloud 콘솔에서 빌드 기록 페이지를 엽니다.첫 번째 빌드를 클릭하여 빌드 세부정보 페이지를 엽니다.
두 개의 빌드 단계가 포함된
apply
트리거 파이프라인이 표시됩니다. 첫 번째 빌드 단계에서는 Terraform 적용을 실행하여 배포를 위한 Compute Engine 및 부하 분산 리소스를 만듭니다. 두 번째 빌드 단계는 애플리케이션이 실행되는 것을 볼 수 있는 IP 주소를 출력합니다.브라우저에서 그린 MIG에 해당하는 IP 주소를 엽니다. 배포를 보여주는 다음과 비슷한 스크린샷이 표시됩니다.
Compute Engine 인스턴스 그룹 페이지로 이동하여 블루 및 그린 인스턴스 그룹을 확인합니다.
VM 인스턴스 페이지를 열어 VM 인스턴스 4개를 확인합니다.
외부 IP 주소 페이지를 열어 세 개의 부하 분산기를 확인합니다.
apply
및 destroy
라는 빌드 트리거 두 개가 표시됩니다. apply
트리거는 main
분기의 infra/main.tfvars
파일에 연결됩니다. 이 트리거는 파일이 업데이트될 때마다 실행됩니다. destroy
트리거는 수동 트리거입니다.
코드 이해하기
이 코드 샘플의 소스 코드에는 다음이 포함됩니다.
- 설정 스크립트와 관련된 소스 코드
- Cloud Build 파이프라인과 관련된 소스 코드
- Terraform 템플릿과 관련된 소스 코드
설정 스크립트
setup.sh
는 부트스트랩 프로세스를 실행하고 블루-그린 배포를 위한 구성요소를 만드는 설정 스크립트입니다. 스크립트는 다음 작업을 수행합니다.
- Cloud Build, Resource Manager, Compute Engine, Cloud Source Repositories API를 사용 설정합니다.
- 프로젝트의 Cloud Build 서비스 계정에
roles/editor
IAM 역할을 부여합니다. 이 역할은 Cloud Build에서 배포에 필요한 GitOps 구성요소를 만들고 설정하는 데 필요합니다. - 프로젝트의 Cloud Build 서비스 계정에
roles/source.admin
IAM 역할을 부여합니다. 이 역할은 Cloud Build 서비스 계정에서 프로젝트에 Cloud Source Repositories를 만들고 샘플 GitHub 저장소의 콘텐츠를 Cloud Source Repositories에 클론하는 데 필요합니다. 다음 역할을 하는
bootstrap.cloudbuild.yaml
인라인이라는 Cloud Build 파이프라인을 생성합니다.- Cloud Source Repositories에 새 저장소를 만듭니다.
- 샘플 GitHub 저장소의 소스 코드를 Cloud Source Repositories의 새 저장소로 복사합니다.
- 적용 트리거를 만들고 빌드 트리거를 폐기합니다.
Cloud Build 파이프라인
apply.cloudbuild.yaml
및 destroy.cloudbuild.yaml
은 설정 스크립트가 GitOps 흐름의 리소스를 설정하는 데 사용하는 Cloud Build 구성 파일입니다. apply.cloudbuild.yaml
에는 두 가지 빌드 단계가 포함됩니다.
tf_apply build
: Terraform을 설치하는tf_install_in_cloud_build_step
함수를 호출하는 빌드 단계입니다.tf_apply
는 GitOps 흐름에 사용된 리소스를 만듭니다.tf_install_in_cloud_build_step
및tf_apply
함수는bash_utils.sh
에 정의되어 있으며, 빌드 단계는source
명령어를 사용하여 이를 호출합니다.describe_deployment
: 부하 분산기의 IP 주소를 출력하는describe_deployment
함수를 호출하는 빌드 단계입니다.
destroy.cloudbuild.yaml
은 tf_apply
로 생성된 모든 리소스를 삭제하는 tf_destroy
를 호출합니다.
tf_install_in_cloud_build_step
, tf_apply
, describe_deployment
, tf_destroy
함수는 bash_utils.sh
파일에 정의됩니다.
빌드 구성 파일은 source
명령어를 사용하여 함수를 호출합니다.
다음 코드는 bash_utils.sh
에 정의된 tf_install_in_cloud_build_step
함수를 보여줍니다. 빌드 구성 파일은 이 함수를 호출하여 Terraform을 즉시 설치합니다. Terraform 상태를 기록하는 Cloud Storage 버킷을 만듭니다.
다음 코드 스니펫은 bash_utils.sh
에 정의된 tf_apply
함수를 보여줍니다. 먼저 모든 모듈과 커스텀 라이브러리를 로드하는 terraform init
을 호출한 후 terraform apply
를 실행하여 main.tfvars
파일에서 변수를 로드합니다.
다음 코드 스니펫은 bash_utils.sh
에 정의된 describe_deployment
함수를 보여줍니다. gcloud compute addresses describe
를 사용하여 이름으로 부하 분산기의 IP 주소를 가져와 출력합니다.
다음 코드 스니펫은 bash_utils.sh
에 정의된 tf_destroy
함수를 보여줍니다. 모든 모듈과 커스텀 라이브러리를 로드하는 terraform init
을 호출한 후 Terraform 변수를 언로드하는 terraform destroy
를 실행합니다.
Terraform 템플릿
copy-of-gcp-mig-simple/infra/
폴더에서 모든 Terraform 구성 파일과 변수를 찾을 수 있습니다.
main.tf
: Terraform 구성 파일입니다.main.tfvars
: 이 파일은 Terraform 변수를 정의합니다.mig/
및splitter/
: 이 폴더에는 부하 분산기를 정의하는 모듈이 포함됩니다.mig/
폴더에는 블루 및 그린 부하 분산기의 MIG를 정의하는 Terraform 구성 파일이 포함되어 있습니다. 블루 및 그린 MIG는 동일하므로 한 번만 정의되며 블루 및 그린 객체에서 인스턴스화됩니다. 분할기 부하 분산기의 Terraform 구성 파일은splitter/
폴더에 있습니다.
다음 코드 스니펫은 infra/main.tfvars
의 콘텐츠를 보여줍니다. 여기에는 블루 및 그린 풀에 배포할 애플리케이션 버전을 결정하는 2개의 변수와 활성 색상에 대한 변수(블루 또는 그린)의 세 가지 변수가 포함됩니다. 이 파일을 변경하면 배포가 트리거됩니다.
다음은 infra/main.tf
의 코드 스니펫입니다. 이 스니펫에서는 다음 사항이 적용됩니다.
- Google Cloud 프로젝트에 대한 변수가 정의됩니다.
- Google이 Terraform 제공업체로 설정됩니다.
- 변수는 네임스페이스에 정의됩니다. Terraform에서 생성되는 모든 객체에는 이 변수로 프리픽스가 붙어 애플리케이션의 여러 버전을 동일한 프로젝트에 배포할 수 있고 객체 이름이 서로 충돌하지 않습니다.
- 변수
MIG_VER_BLUE
,MIG_VER_BLUE
,MIG_ACTIVE_COLOR
는infra/main.tfvars
파일의 변수에 대한 바인딩입니다.
infra/main.tf
의 다음 코드 스니펫은 분할기 모듈의 인스턴스화를 보여줍니다. 이 모듈은 분할기 부하 분산기가 애플리케이션을 배포할 MIG를 알 수 있도록 활성 색상을 사용합니다.
infra/main.tf
의 다음 코드 스니펫은 블루 및 그린 MIG에 동일한 두 모듈을 정의합니다. 분할기 모듈에 정의된 색상, 네트워크, 서브네트워크를 사용합니다.
splitter/main.tf
파일은 분할기 MIG에 대해 생성된 객체를 정의합니다. 다음은 그린과 블루 MIG 간에 전환하는 로직이 포함된 splitter/main.tf
의 코드 스니펫입니다. 두 가지 백엔드 리전(var.instance_group_blue
또는 var.instance_group_green
)으로 트래픽을 라우팅할 수 있는 google_compute_region_backend_service
서비스가 지원됩니다.
capacity_scaler
는 라우팅할 트래픽 양을 정의합니다.
다음 코드는 트래픽의 100%를 지정된 색상으로 라우팅하지만 카나리아 배포를 위해 이 코드를 업데이트하여 트래픽을 일부 사용자에게 라우팅할 수 있습니다.
mig/main.tf
파일은 블루 및 그린 MIG와 관련된 객체를 정의합니다. 이 파일의 다음 코드 스니펫은 VM 풀을 만드는 데 사용되는 Compute Engine 인스턴스 템플릿을 정의합니다. 이 인스턴스 템플릿에는 Terraform 수명 주기 속성이 create_before_destroy
로 설정되어 있습니다.
이는 풀 버전을 업데이트할 때 이전 버전의 풀에서 템플릿을 계속 사용 중인 경우 템플릿을 사용하여 새 버전의 풀을 만들 수 없기 때문입니다. 하지만 새 템플릿을 만들기 전에 이전 버전의 풀이 삭제되면 풀이 다운되는 기간이 있습니다. 이 시나리오를 피하기 위해 Terraform 수명 주기를 create_before_destroy
로 설정하여 이전 버전이 폐기되기 전에 최신 버전의 VM 풀이 먼저 생성되도록 합니다.