gcloud CLI 명령어 스크립팅

명령줄에서 gcloud CLI 명령어를 실행하는 것 외에도 Jenkins를 사용하여 Google Cloud 태스크를 자동화하는 경우와 같이 스크립트 또는 다른 자동화를 이용해서 실행할 수 있습니다.

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

Cloud SDK를 사용한 스크립팅 기본 사항

gcloud 명령줄 도구로 기본 스크립트를 작성하는 방법에 대한 단계별 안내는 Google Cloud 작업 자동화를 위한 초보자 가이드를 참조하세요.

승인

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

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

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

액세스를 인증하고 다른 일반적인 Cloud SDK 설정 단계를 이행하려면 다음을 수행합니다.

    gcloud init

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

서비스 계정 승인을 사용하려면 기존 서비스 계정을 사용하거나 Google Cloud Console을 통해 새 계정을 만듭니다. 서비스 계정 표의 옵션 열에서 연관된 비공개 키를 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 구성 파일을 구성할 수 있습니다.

Cloud SDK 도구 인증에 대한 자세한 안내는 이 종합 가이드를 참조하세요.

프롬프트 중지

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

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

예:

    gcloud debug targets list --quiet

출력 필터링 및 형식 지정

gcloud 명령줄 도구를 사용하여 스크립팅하려면 출력을 예측할 수 있어야 합니다. 이 경우 --filter--format 플래그가 도움이 됩니다. 이 플래그 덕에 gcloud 명령줄 도구를 사용하여 명령어를 실행하면 형식(예: 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:title=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의 경우:

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