IT/Infra&Cloud

[gcp] Infra Manager - gcp resource provisioning using terraform

Hayley Shim 2024. 4. 1. 00:11

안녕하세요. 이번 글에서는 GCP의 Infra Manager 서비스를 통해 테라폼으로 작성된 GCP의 리소스를 쉽게 프로비저닝하는 방법에 대해 설명하겠습니다.

 

Infra Manager는 Google Cloud 인프라 리소스의 배포 및 관리를 자동화해주는 GCP Managed Service입니다.

 

Infra Manager 특징

- 공개 Git 저장소, Cloud Storage 버킷 또는 로컬 머신에 Terraform 코드 또는 구성을 유지할 수 있음

- Infra Manager는 배포 버전을 생성하여 모든 Terraform 배포 버전을 유지함

- 모든 revision에 대해 Infra Manager는 로그, Terraform 소스 코드, 아티팩트 및 상태 파일을 Cloud Storage Bucket에 저장

- gcloud CLI를 사용하여 Infra Manager 배포를 생성하여 Terraform 코드에서 리소스를 배포함

- Infra Manager는 요청을 받아 terraform init | validate | plan | apply 명령을 실행함

 

 

Infra Manager를 사용하면 사용자는 템플릿 생성, 인프라 구성의 버전 지정, 리소스의 일관 배포가 가능하여 인프라의 확장성, 민첩성 및 리소스 최적화를 보다 쉽게 할 수 있습니다. 

 

 

Infra Manager의 동작 과정에 대해 살펴보겠습니다.

 

Infra Manager 워크플로우

Infra Manager Logic

 

Infra Manager의 동작 과정은 위 그림과 같습니다. [참고]

위 그림과 같이 Local에서 Infra Manager CLI(ex. gcloud alpha infra-manager...)로 infra manager api를 통해  Cloud Build가 Cloud Storage, Github에 위치한 소스를 참조하여 테라폼으로 작성된 GCP Resource를 프로비저닝해줍니다.

 

 

인프라 관리자 Terraform 제약 조건

  1. Terraform의 템플릿 작성 또는 생성은 지원되지 않음
  2. 구성은 Terraform 버전 1.2.3을 사용해야함
  3. 백엔드 블록을 정의하면 안됨
  4. 프로비저너는 지원되지 않음

 

전제 조건

- 사전에 GCP Infra Manager를 사용하여 GCP 리소스를 프로비저닝할 수 있는 GCP 프로젝트가 생성되어 있어야 합니다.

- 해당 프로젝트에 GCS 버킷을 생성한 후 프로비저닝할 테라폼 코드를 업로드해줍니다.

 

 

아래 과정은 [docs-Deploy infrastructure using Infrastructure Manager]와 [GCP article-Terraform As A Service: Google Infrastructure Manager] 을 참고하였습니다. 보다 자세한 내용은 위 글을 참고해주세요.

 

 

인프라 관리자 서비스 API 활성화

GCP Infra Manager를 시작하기 전에 GCP 프로젝트에 대한 Infra Manager 서비스 API를 활성화해야 합니다.

gcloud services enable config.googleapis.com

 

Infra Manager API Enable

 

 

Infra Manager deployment에 대한 인증(Authentication)

Infra Manager deployment를 생성하려면 Terraform 코드에 정의된 리소스를 배포하는 데 사용되는 서비스 계정(Service Account)에 구성 에이전트 역할이 있어야 합니다.

 

1. Service Account 생성

gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

 

 

2. Service Account에 roles/config.agent  IAM Role 부여

gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=roles/config.agent

 

 

3.  Terraform 코드에 설명된 리소스를 배포하는데 필요한 추가 권한 부여

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
    --role=storage.Admin // for creating GCS buckets

 

 

Infra Manager Deployment 생성

소스 코드 위치(GCS, Github)를 기반으로 Infra Manager 배포를 생성하기 위한 명령어입니다.

 

1. Cloud Storage 버킷에 저장된 Terraform 구성 배포

gcloud alpha infra-manager deployments apply projects/PROJECT_ID/locations/LOCATION/deployments/DEPLOYMENT_ID \
    --service-account projects/SERVICE_ACCOUNT_PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT \
    --gcs-source gs://BUCKET_NAME/OBJECT_NAME \
    --input-values=INPUT_1_NAME=VALUE,INPUT_2_NAME=VALUE

 

2. 공개 Git 저장소에 저장된 Terraform 구성 배포

gcloud alpha infra-manager deployments apply projects/PROJECT_ID/locations/LOCATION/deployments/DEPLOYMENT_ID \
    --service-account projects/SERVICE_ACCOUNT_PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT \
    --git-source-repo="GIT_REPO" \
    --git-source-directory="DIRECTORY" \
    --git-source-ref="REF" \
    --input-values=INPUT_1_NAME=VALUE,INPUT_2_NAME=VALUE

 

3. 로컬 머신에 저장된 Terraform 구성 배포

gcloud alpha infra-manager deployments apply projects/PROJECT_ID/locations/LOCATION/deployments/DEPLOYMENT_ID \
    --service-account projects/SERVICE_ACCOUNT_PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT \
    --local-source="LOCAL_DIRECTORY" \
    --input-values=INPUT_1_NAME=VALUE,INPUT_2_NAME=VALUE

 

 

Cloud Storage 버킷에 저장된 Terraform 소스로 GCP 리소스를 구성하고 배포하는 경우 아래와 같습니다. 

GCS 버킷에 gcloud 명령어 등으로 소스를 업로드해줍니다.

 

GCS 버킷에 소스 업로드

 

 

Cloud Build에서 Terraform 코드를 배포하기 위해 백엔드에서 Infra Manager가 생성한 Cloud build trigger 확인이 가능합니다.

Infra Manager Cloud Build 트리거 출력

 

 

Infra Manager는 Infra Manager가 실행되는 프로젝트와 위치에 스토리지 버킷을 생성합니다. Infra Manager는 2024년 1분기 기준 아래 4개 Region을 지원합니다. 24년 1분기부터 한국 리전을 지원합니다. 

  • 대만 ( asia-east1)
  • 벨기에 ( europe-west1)
  • 아이오와 ( us-central1)
  • 한국(asia-northeast3)

배포가 생성된 후 인프라 관리자 아티팩트는 이름이 다음 형식의  스토리지 버킷에 있습니다.

gs://PROJECT_ID-LOCATION-blueprint-config.

Infra Manager Blueprint 스토리지 버킷

 

 

Blueprint 스토리지 버킷의 아티팩트는 아래와 같이 구성됩니다.

  • Cloud Build 로그
  • Terraform 로그
  • Terraform configuration 복사본

 

Infra Manager Deployment 개정(Revision)

 

모든 Terraform 실행에 대해 Infra Manager 배포는 버전 관리를 유지하기 위해 revision을 생성합니다.

처음 배포를 생성할 때 이 배포도 revision이며 revision ID( r-0 )가 있습니다.

 

배포(Terraform 코드 수정)를 업데이트 하면 인프라 관리자가 식별자(개정 ID)를 사용하여 새 개정( r-1)을 생성합니다. 새로운 개정이 있을 때마다 식별자가 1씩 증가합니다.

Infra Manager Deployment Revision

 

 

Infra Manager를 사용하여 Terraform State 관리

 

Google Infra Manager는 상태 변경을 수행하거나 Google Infra Manager를 사용하여 해당 리소스를 관리하기 위해 수동으로 생성된 리소스의 상태를 가져올 수 있는 각 배포 및 개정에 대한 Terraform 상태 수정 및 검사를 지원합니다 .

수동으로 생성된 리소스의 Terraform 상태를 Infra Manager 관리 Terraform 상태로 가져오려면 먼저 Infra Manager 배포를 잠그고 상태 파일을 로컬로 다운로드해야 합니다.[참고 : GCP docs - Manage the Terraform state file

 

1. Lock the deployment

- State 파일을 변경하는 동안 배포가 변경되지 않도록 배포를 잠급니다. State 파일 을 다운로드하려면 배포를 Lock 해야합니다.

gcloud alpha infra-manager deployments lock DEPLOYMENT_ID --project PROJECT_ID --location LOCATION

 

2. Download the state file

- State 파일을 다운로드하려면 Blueprint 클라우드 스토리지 버킷 서명 URL이 필요합니다.

- State 파일 이 다운로드되면 이를 로컬 Terraform 코드 작업공간에 배치하고 State 가져오기를 수행할 수 있습니다.

SIGNED_STATE_DOWNLOAD_URL=$(gcloud alpha infra-manager deployments export-statefile DEPLOYMENT_ID --project PROJECT_ID --location LOCATION --format="get(signedUri)")

 

curl -s -X GET --output terraform.tfstate ${SIGNED_STATE_DOWNLOAD_URL}


3. Upload the state file

- State 가져오기에 성공한 후 Terraform 코드 파일을 로컬로 변경한 경우 수정된 Terraform 코드를 스토리지 버킷 또는 구성 배포를 위해 소스로 사용 중인 공용 Git 저장소에 업로드해야 합니다.

 

1. 잠금 해제할 Infra Manager Deployment의 Lock ID 가져오기

LOCK_ID=$(gcloud alpha infra-manager deployments export-lock DEPLOYMENT_ID --project PROJECT_ID --location LOCATION --format="get(lockId)"

 

2. Modified/imported state file 업로드

SIGNED_STATE_UPLOAD_URL=$(gcloud alpha infra-manager deployments import-statefile DEPLOYMENT_ID --project PROJECT_ID --location LOCATION --lock-id ${LOCK_ID} --format="get(signedUri)")

curl -s -X PUT --upload-file terraform.tfstate $SIGNED_STATE_UPLOAD_URL

 

 

3. Infra Manager deployment 잠금 해제(unlock)

LOCK_ID=$(gcloud alpha infra-manager deployments export-lock DEPLOYMENT_ID --project PROJECT_ID --location LOCATION --format="get(lockId)")

gcloud alpha infra-manager deployments unlock DEPLOYMENT_ID --project PROJECT_ID --location LOCATION --lock-id ${LOCK_ID}

 

 

Infra Manager Deployment 삭제

 

1. Deployment와 Provisioned된 리소스 삭제

gcloud alpha infra-manager deployments delete projects/PROJECT_ID/locations/LOCATION/deployments/DEPLOYMENT_ID
 

 

GCP Infra Manager에 대한 보다 자세한 내용은 Docs를 참고해주세요.

 

참고 자료

1. Terraform as a service google infrastructure manager

https://medium.com/google-cloud/terraform-as-a-service-google-infrastructure-manager-409c2c9e71d5

 

Terraform As A Service: Google Infrastructure Manager

What is Google Infrastructure Manager?

medium.com

 

2. Test for Infrastructure Manager

https://medium.com/@pancho_riveros/infrastructure-manager-google-cloud-testing-57019ee5f508

 

Infrastructure Manager — Google Cloud Testing

Infrastructure Manager (Infra Manager) is a managed service from Google Cloud that automates the deployment and management of Google Cloud…

medium.com

 

3. Infra Manager

https://cloud.google.com/infrastructure-manager/docs

 

Infrastructure Manager documentation  |  Google Cloud

Get documentation for Infrastructure Manager

cloud.google.com

 

'IT > Infra&Cloud' 카테고리의 다른 글

[gcp] Cloud Router  (0) 2024.04.20
[aws] Direct Connect  (0) 2024.04.20
[aws] backup using cross account cmk key  (0) 2023.12.03
[aws] Organization policy - backup  (0) 2023.11.25
[aws] Service Catalog - cloudformation  (0) 2023.11.03