logo hsb.horse
← スニペット一覧に戻る

Snippets

CloudFormation テンプレートから parameter.json を生成する

aws cloudformation validate-template と jq を組み合わせて、環境変数を反映した parameters.json を自動生成するスニペット。

公開日: 更新日:

aws cloudformation validate-template でテンプレートのパラメータ一覧を取得し、 jq でデフォルト値を環境変数で上書きしながら parameters.json に書き出す。

Terminal window
aws cloudformation validate-template \
--template-body "file://path/to/template" \
--query "Parameters[].{ParameterKey:ParameterKey,ParameterValue:DefaultValue}" \
| jq 'sort_by(.ParameterKey)' \
| jq 'map(
.ParameterValue = (env[.ParameterKey] // .ParameterValue)
)' > "parameters.json"

jq の各ステップ

ステップ処理
sort_by(.ParameterKey)キー名でアルファベット順にソート(差分を安定させる)
env[.ParameterKey]同名の環境変数を取得。未定義なら null
// .ParameterValuenull のときはデフォルト値にフォールバック

デプロイ済みスタックから既存値を取得するパターン

テンプレートのデフォルト値ではなく、現在スタックに設定されている値をベースに生成したい場合は describe-stacks を使う。

Terminal window
aws cloudformation describe-stacks \
--stack-name "your-stack-name" \
--query "Stacks[0].Parameters[].{ParameterKey:ParameterKey,ParameterValue:ParameterValue}" \
| jq 'sort_by(.ParameterKey)' \
| jq 'map(
.ParameterValue = (env[.ParameterKey] // .ParameterValue)
)' > "parameters.json"

DefaultValue が null のパラメータを除外する

テンプレートにデフォルト値が設定されていないパラメータを除外したい場合。

Terminal window
aws cloudformation validate-template \
--template-body "file://path/to/template" \
--query "Parameters[].{ParameterKey:ParameterKey,ParameterValue:DefaultValue}" \
| jq '[.[] | select(.ParameterValue != null)]' \
| jq 'sort_by(.ParameterKey)' \
| jq 'map(
.ParameterValue = (env[.ParameterKey] // .ParameterValue)
)' > "parameters.json"

シェルスクリプト化

#!/usr/bin/env bash
set -euo pipefail
TEMPLATE="${1:?Usage: $0 <template-path> [output-path]}"
OUTPUT="${2:-parameters.json}"
aws cloudformation validate-template \
--template-body "file://${TEMPLATE}" \
--query "Parameters[].{ParameterKey:ParameterKey,ParameterValue:DefaultValue}" \
| jq 'sort_by(.ParameterKey)' \
| jq 'map(
.ParameterValue = (env[.ParameterKey] // .ParameterValue)
)' > "${OUTPUT}"
echo "Generated: ${OUTPUT}"
Terminal window
# 実行例
Env1=value1 Env2=value2 ./generate-params.sh path/to/template.yaml