gcloud CLI 명령어 스크립팅

Google Cloud CLI 명령어는 명령줄에서는 물론 스크립트 또는 다른 자동화에서도 실행할 수 있습니다. Jenkins를 사용하여 Google Cloud 태스크를 자동화하는 경우가 그 예시입니다.

gcloud CLI는 필터링, 형식 지정, --quiet 플래그 같은 다양한 도구와 함께 제공되므로 효과적으로 출력을 처리하고 작업을 자동화할 수 있습니다.

gcloud CLI를 사용한 스크립팅 기본 사항

gcloud CLI로 기본 스크립트를 빌드하는 단계별 안내는 gcloud로 스크립팅: Google Cloud 태스크 자동화를 위한 초보자 가이드 블로그 게시물을 참조하세요.

승인

gcloud CLI를 사용해 스크립팅할 때는 승인 방법을 고려해야 합니다. gcloud CLI는 다음 두 가지 옵션을 제공합니다.

  • 사용자 계정 승인
  • 서비스 계정 승인

단일 시스템에서 스크립트 또는 기타 자동화를 실행하는 경우 사용자 계정 인증을 사용하는 것이 좋습니다.

액세스를 승인하고 다른 일반적인 gcloud CLI 설정 단계를 수행하려면 다음 안내를 따르세요.

gcloud init

프로덕션 환경의 시스템에서 스크립트 또는 기타 자동화를 배포하는 경우에는 서비스 계정 승인을 사용하는 것이 좋습니다. 모든 사용자가 root에 액세스할 수 있는 Compute Engine 가상 머신 인스턴스에서 gcloud CLI 명령어를 실행하는 경우에도 이 승인 방법을 사용하는 것이 좋습니다.

서비스 계정 승인을 사용하려면 기존 서비스 계정을 사용하거나 서비스 계정 페이지에서 새 서비스 계정을 만듭니다.

서비스 계정 페이지로 이동

연결된 비공개 키를 JSON 형식의 키 파일로 만들고 다운로드하려면 서비스 계정의 작업 메뉴에서 키 관리를 선택합니다.

승인을 실행하려면 gcloud auth activate-service-account를 실행합니다.

gcloud auth activate-service-account --key-file [KEY_FILE]

인증을 처리하는 gcloud compute ssh를 사용하여 VM 인스턴스에 SSH를 통해 연결할 수 있습니다. gcloud compute config-ssh를 사용하여 SSH 구성 파일을 구성할 수 있습니다.

gcloud CLI 도구 승인에 대한 자세한 안내는 gcloud CLI 승인을 참조하세요.

프롬프트 중지

일부 gcloud CLI 명령어는 사용자에게 작업 확인을 요청하거나 입력된 명령어에 대한 추가 입력을 요청하는 대화식 명령어입니다.

대부분의 경우, 스크립트나 다른 자동화에서 명령어를 실행하는 경우에는 이 명령어가 바람직하지 않습니다. 구성에서 disable_prompts 속성을 True로 설정하거나 전역 --quiet 또는 -q 플래그를 사용하여 gcloud CLI 명령어에서 프롬프트를 중지할 수 있습니다. 추가 확인 또는 입력이 필요한 경우 대부분의 대화식 명령어에는 기본값이 있습니다. 프롬프트가 중지되면 이 기본값이 사용됩니다.

예를 들면 다음과 같습니다.

gcloud debug targets list --quiet

출력 필터링 및 형식 지정

gcloud CLI를 사용하여 스크립팅하려면 출력을 예측할 수 있어야 합니다. 이 경우 --filter--format 플래그가 도움이 됩니다. 이 플래그 덕에 gcloud CLI를 사용하여 명령어를 실행하면 형식(예: json, yaml, csv, text)과 필터(프리픽스가 'test'인 VM 이름, 2015년 이후 생성 연도 등) 사양을 준수하는 출력을 생성할 수 있습니다.

필터 및 형식 플래그 사용에 대한 대화형 튜토리얼을 진행하려면 다음 버튼을 사용하여 튜토리얼을 시작하세요.

Cloud Shell에서 열기

다음 예시는 gcloud CLI 명령어를 사용한 일반적인 형식 지정 및 필터링을 보여줍니다.

us-central1-a 영역에서 만들어진 인스턴스 나열:

gcloud compute instances list --filter="zone:us-central1-a"

라벨이 특정 값과 일치하는 프로젝트를 JSON 형식으로 나열(예: label.env는 'test'이고 label.version은 alpha임):

gcloud projects list --format="json" \
  --filter="labels.env=test AND labels.version=alpha"

생성 날짜와 시간이 현지 시간대로 지정된 프로젝트 나열:

gcloud projects list \
  --format="table(name, project_id, createTime.date(tz=LOCAL))"

특정 날짜 이후에 만들어진 프로젝트를 표 형식으로 나열:

gcloud projects list \
  --format="table(projectNumber,projectId,createTime)" \
  --filter="createTime.date('%Y-%m-%d', Z)='2016-05-11'"

마지막 예에서는 키에 대한 투영이 사용되었습니다. 날짜 형식이 설정되면 필터가 createTime 키에 적용됩니다.

중첩된 지역 할당량 표 나열:

gcloud compute regions describe us-central1 \
  --format="table(quotas:format='table(metric,limit,usage)')"

CSV 형식으로 전역 할당량 일반 목록 인쇄:

gcloud compute project-info describe --flatten='quotas[]' \
  --format='csv(quotas.metric,quotas.limit,quotas.usage)'

상자 데코와 제목을 포함하며 이름을 기준으로 정렬된 계산 인스턴스 리소스를 표 형식으로 나열:

gcloud compute instances list \
  --format='table[box,title=Instances](name:sort=1,zone:label=zone,status)'

프로젝트 인증된 사용자 이메일 주소 나열:

gcloud info --format='value(config.account)'

gcloud CLI의 filters, formats, projections 플래그에 내장된 출력 구성 기능에 대한 추가적인 예시는 필터링 및 형식 지정에 대한 블로그 게시물을 참조하세요.

권장사항

스크립트나 다른 자동화에서 gcloud CLI 명령어의 출력을 따라 조건부로 작업을 이행하도록 하려면 다음 사항에 주의하세요.

  • 명령어 종료 상태를 사용하세요.

    종료 상태가 0이 아니면 오류가 발생하고 명령어 문서에서 다르게 언급되지 않은 한 출력이 불완전할 수 있습니다. 예를 들어, 여러 리소스를 만드는 명령어가 리소스 몇 개만 만들고 이를 표준 출력에 나열한 후 0이 아닌 상태로 종료될 수 있습니다. 또는 show_structured_logs 속성을 사용하여 오류 로그를 파싱할 수 있습니다. 자세한 내용을 보려면 gcloud config를 실행하세요.

  • 표준 오류로 표시된 메시지에 의존하지 마세요.

    이러한 메시지의 문구는 gcloud CLI 차후 버전에서 변경될 수 있어 자동화가 작동하지 않을 수 있습니다.

  • 표준 출력으로 표시된 메시지의 원시 출력에 의존하지 마세요.

    모든 명령어의 기본 출력은 차후 출시에서 변경될 수 있습니다. --format 플래그를 사용하여 다음 중 하나로 출력 형식을 지정하면 이러한 변경의 영향을 최소화할 수 있습니다. --format=json|yaml|csv|text|list를 사용하여 반환될 값을 지정합니다. 더 많은 옵션을 보려면 gcloud topic formats를 실행하세요.

    projections를 사용하면 기본 출력을 --format에서 수정할 수 있습니다. 보다 세부적으로 지정하려면 --filter 플래그를 사용하여 표현식에 따라 하위 집합 값을 반환합니다. 그러면 해당 반환된 값에 맞게 스크립팅할 수 있습니다.

    출력 형식을 지정하고 출력을 필터링하는 예를 아래 섹션에서 확인할 수 있습니다.

예시 스크립트

형식 및 필터 기능으로 gcloud CLI 명령어를 스크립트에 결합하여 포함된 정보를 간편하게 추출할 수 있습니다.

모든 프로젝트의 서비스 계정 키 나열

이 샘플 스크립트는 다음을 통해 모든 프로젝트의 서비스 계정과 연결된 키를 나열합니다.

  • 프로젝트 반복
  • 각 프로젝트에서 연결된 서비스 계정 가져오기
  • 각 서비스 계정에서 연결된 키 가져오기

Bash

#!/bin/bash
for project in  $(gcloud projects list --format="value(projectId)")
do
  echo "ProjectId:  $project"
  for robot in $(gcloud iam service-accounts list --project $project --format="value(email)")
   do
     echo "    -> Robot $robot"
     for key in $(gcloud iam service-accounts keys list --iam-account $robot --project $project --format="value(name.basename())")
        do
          echo "        $key"
     done
   done
done

Windows PowerShell

또는 Windows PowerShell의 경우:

foreach ($project in gcloud projects list --format="value(projectId)")
{
  Write-Host "ProjectId: $project"
  foreach ($robot in  gcloud iam service-accounts list --project $project --format="value(email)")
  {
      Write-Host "    -> Robot $robot"
      foreach ($key in gcloud iam service-accounts keys list --iam-account $robot --project $project --format="value(name.basename())")
      {
        Write-Host "        $key"
      }
  }
}

처리를 위한 출력 파싱

다음 샘플은 처리를 위한 출력 파싱을 보여줍니다. 특히 이 샘플 스크립트에서는 서비스 계정 정보를 배열에 쓰고 값이 여러 개인 CSV 형식의 serviceAccounts.scope() 필드에서 값을 분리합니다.

#!/bin/bash
for scopesInfo in $(
    gcloud compute instances list --filter=name:instance-1 \
        --format="csv[no-heading](name,id,serviceAccounts[].email.list(),
                      serviceAccounts[].scopes[].map().list(separator=;))")
do
      IFS=',' read -r -a scopesInfoArray<<< "$scopesInfo"
      NAME="${scopesInfoArray[0]}"
      ID="${scopesInfoArray[1]}"
      EMAIL="${scopesInfoArray[2]}"
      SCOPES_LIST="${scopesInfoArray[3]}"

      echo "NAME: $NAME, ID: $ID, EMAIL: $EMAIL"
      echo ""
      IFS=';' read -r -a scopeListArray<<< "$SCOPES_LIST"
      for SCOPE in  "${scopeListArray[@]}"
      do
        echo "  SCOPE: $SCOPE"
      done
done