0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

gcloud でプロジェクト ID とリージョン、ゾーンを指定するための備忘録

Posted at

備忘録。

シェルスクリプトでプロジェクト ID とリージョン、ゾーンを選択する

任意のディレクトリに gcp-select-prj.sh として保存する。

#!/usr/bin/env bash
# gcp-select-prj.sh
set -euo pipefail

need() { command -v "$1" >/dev/null 2>&1 || { echo "ERROR: '$1' not found."; exit 1; }; }
need gcloud

choose_from_list () {
  local prompt="$1"; shift
  local -a items=("$@")
  if ((${#items[@]}==0)); then
    echo "ERROR: 候補が見つかりませんでした。" >&2
    exit 1
  fi
  echo "$prompt"
  local i
  for i in "${!items[@]}"; do
    printf "%2d) %s\n" "$((i+1))" "${items[$i]}"
  done
  local choice
  while :; do
    read -r -p "番号を入力してください: " choice
    if [[ "$choice" =~ ^[0-9]+$ ]] && (( choice>=1 && choice<=${#items[@]} )); then
      echo "${items[$((choice-1))]}"
      return 0
    fi
    echo "無効な入力です。1〜${#items[@]} の番号で選択してください。"
  done
}

# --- 1. プロジェクト選択 ---
echo "== プロジェクト一覧を取得しています…"
mapfile -t PROJECT_ROWS < <(gcloud projects list --format="table[no-heading](projectId,name)" | sort)
SEL_ROW="$(choose_from_list "プロジェクトを選択してください(ID  名称):" "${PROJECT_ROWS[@]}")"
PROJECT_ID="$(awk '{print $1}' <<<"$SEL_ROW")"
echo "選択されたプロジェクト ID: ${PROJECT_ID}"
echo

# --- 2. リージョン選択 ---
echo "== リージョン一覧を取得しています…"
mapfile -t REGIONS < <(gcloud compute regions list --format="value(name)" --filter="status=UP" | sort)
REGION="$(choose_from_list "リージョンを選択してください:" "${REGIONS[@]}")"
echo "選択されたリージョン: ${REGION}"
echo

# --- 3. ゾーン選択 ---
echo "== ゾーン一覧を取得しています…"
mapfile -t ZONES < <(gcloud compute zones list \
  --format="value(name)" \
  --filter="region: $(gcloud compute regions describe "$REGION" --format='value(selfLink)') AND status=UP" \
  | sort)
ZONE="$(choose_from_list "ゾーンを選択してください:" "${ZONES[@]}")"
echo "選択されたゾーン: ${ZONE}"
echo

# --- 4. 選択結果を export ---
export CLOUDSDK_CORE_PROJECT="$PROJECT_ID"
export CLOUDSDK_COMPUTE_REGION="$REGION"
export CLOUDSDK_COMPUTE_ZONE="$ZONE"

echo "== export 済み(このシェル内で利用可能) =="
echo "  CLOUDSDK_CORE_PROJECT=$CLOUDSDK_CORE_PROJECT"
echo "  CLOUDSDK_COMPUTE_REGION=$CLOUDSDK_COMPUTE_REGION"
echo "  CLOUDSDK_COMPUTE_ZONE=$CLOUDSDK_COMPUTE_ZONE"
echo

# --- 5. 永続化するか確認 ---
echo "== 現在の gcloud config (永続設定) =="
gcloud config list --format="text(core.project,compute.region,compute.zone)"
echo
read -r -p "この設定を gcloud config に永続化しますか? [y/N]: " ans
if [[ "$ans" =~ ^[Yy]$ ]]; then
  gcloud config set project "$PROJECT_ID" >/dev/null
  gcloud config set compute/region "$REGION" >/dev/null
  gcloud config set compute/zone "$ZONE" >/dev/null
  echo "永続化しました。現在の設定:"
  gcloud config list --format="text(core.project,compute.region,compute.zone)"
else
  echo "永続化は行いませんでした。export 済みの変数はこのシェルで有効です。"
fi

保存後に、実行権限を付与して、実際に実行してみる。

$ chmod +x gcp-select-prj.sh
$ ./gcp-select.sh

出力例

$ ./gcp-select-prj.sh
== プロジェクト一覧を取得しています…
プロジェクトを選択してください(ID  名称):
 1) dev-sandbox-12345    開発用サンドボックス
 2) staging-67890        ステージング環境
 3) prod-main-99999      本番環境
番号を入力してください: 3
選択されたプロジェクト ID: prod-main-99999

== リージョン一覧を取得しています…
リージョンを選択してください:
 1) asia-east1
 2) asia-northeast1
 3) asia-northeast2
 4) us-central1
番号を入力してください: 2
選択されたリージョン: asia-northeast1

== ゾーン一覧を取得しています…
ゾーンを選択してください:
 1) asia-northeast1-a
 2) asia-northeast1-b
 3) asia-northeast1-c
番号を入力してください: 1
選択されたゾーン: asia-northeast1-a

== export 済み(このシェル内で利用可能) ==
  CLOUDSDK_CORE_PROJECT=prod-main-99999
  CLOUDSDK_COMPUTE_REGION=asia-northeast1
  CLOUDSDK_COMPUTE_ZONE=asia-northeast1-a

== 現在の gcloud config (永続設定) ==
core:
  project: old-project-11111
compute:
  region: us-central1
  zone: us-central1-a

この設定を gcloud config に永続化しますか? [y/N]: y
永続化しました。現在の設定:
core:
  project: prod-main-99999
compute:
  region: asia-northeast1
  zone: asia-northeast1-a
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?