備忘録。
シェルスクリプトでプロジェクト 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