🍱

Terraformでmoduleを使わずに複数環境を構築する

に公開
3
スマートラウンド テックブログ

Discussion

Masatoshi MizumotoMasatoshi Mizumoto

本記事、参考にさせていただいております。
Terraform 1.5.7,MacbookPro(M1)環境においてラッパースクリプトを利用したところ、
引数が3未満(2つまで)にした際に

TF_ARGS[@]: unbound variable

の結果にて動作しなかったため、以下の変更を施したところ、正常動作を確認しました。

❯ diff ./terraform.sh ./terraform_mod.sh
30c30
< TF_ARGS=("${@:3}")
---
> TF_ARGS="${@:3}"
40c40
<       "${TF_ARGS[@]}" # When ./terraform.sh <env> init [args] is executed, [args] are interpreted as being specified for init, and expanded here
---
>       ${TF_ARGS[@]} # When ./terraform.sh <env> init [args] is executed, [args] are interpreted as being specified for init, and expanded here
52c52
<     terraform "${TF_COMMAND}" -var-file="${TF_ENV}.tfvars" "${TF_ARGS[@]}";;
---
>     terraform "${TF_COMMAND}" -var-file="${TF_ENV}.tfvars" ${TF_ARGS[@]};;
54c54
<     terraform "${TF_COMMAND}" "${TF_ARGS[@]}";;
---
>     terraform "${TF_COMMAND}" ${TF_ARGS[@]};;
Takashi YamaharaTakashi Yamahara

ご指摘ありがとうございます🙇
記事公開にあたり、スクリプトを普段運用しているものから一部変更したことでデグレが生じてしまったようです。

ご提示いただいた修正内容で正常動作することを確認しました。

なお、記事中のスクリプトに関しては私が普段運用しているものと同内容に戻しました。

  # 略

  TF_ENV=$1
  TF_COMMAND=$2
- TF_ARGS=("${@:3}")
+ TF_ARGS=${@:3}
  
  # set -uしているので、${TF_SKIP_INIT-false}とすることで、${TF_SKIP_INIT}が未定義の場合でもエラーとならずfalseとして扱われるようにしている
  if [ "${TF_SKIP_INIT-false}" = true ] ; then
    echo "[INFO] Skip init..."
  else
    if [ "${TF_COMMAND}" = 'init' ] ; then
+     # shellcheck disable=SC2086
      terraform init \
        -backend-config="${TF_ENV}.tfbackend" \
        -reconfigure \
-       "${TF_ARGS[@]}" # ./terraform.sh <env> init [args] が実行された時の [args] は、init用向けに指定されたものと解釈し、ここで展開する
+       ${TF_ARGS} # ./terraform.sh <env> init [args] が実行された時の [args] は、init用向けに指定されたものと解釈し、ここで展開する
      exit 0 # ./terraform.sh <env> init が実行された時はここで終了させる
    else
      terraform init \
        -backend-config="${TF_ENV}.tfbackend" \
        -reconfigure # Do you want to copy existing state to the new backend? を非表示にするため
    fi
  fi
  
  # -var-fileオプションの無いコマンドに-var-fileを指定するとエラーになる場合があるので処理を分岐させる
  case $TF_COMMAND in
    apply | console | destroy | import | plan | refresh)
+     # shellcheck disable=SC2086
+     # "${TF_ARGS}"が推奨だが複数引数を指定した時にエラーになるのでダブルクォートは外す
-     terraform "${TF_COMMAND}" -var-file="${TF_ENV}.tfvars" "${TF_ARGS}";;
+     terraform "${TF_COMMAND}" -var-file="${TF_ENV}.tfvars" ${TF_ARGS};;

    *)
+     # shellcheck disable=SC2086
-     terraform "${TF_COMMAND}" "${TF_ARGS}";;
+     terraform "${TF_COMMAND}" ${TF_ARGS};;
  esac
Masatoshi MizumotoMasatoshi Mizumoto

返信ありがとうございます。
差替いただいたスクリプトでも動作確認できました。