logo hsb.horse
← Zur Snippets-Übersicht

Snippets

parameter.json aus einem CloudFormation-Template generieren

Ein Snippet zur automatischen Generierung einer parameters.json durch die Kombination von aws cloudformation validate-template und jq unter Berücksichtigung von Umgebungsvariablen.

Veröffentlicht: Aktualisiert:

Mit aws cloudformation validate-template wird die Parameterliste des Templates abgerufen, und mit jq werden die Standardwerte durch Umgebungsvariablen überschrieben und in parameters.json geschrieben.

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"

Die einzelnen jq-Schritte

SchrittVerarbeitung
sort_by(.ParameterKey)Alphabetisch nach Schlüsselname sortieren (für stabile Diffs)
env[.ParameterKey]Umgebungsvariable mit gleichem Namen abrufen. Wenn nicht definiert, dann null
// .ParameterValueFallback auf Standardwert, wenn null

Muster: Vorhandene Werte aus einem bereits deploytes Stack abrufen

Wenn die Generierung nicht auf den Standardwerten des Templates, sondern auf den aktuell im Stack gesetzten Werten basieren soll, verwendet man 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"

Parameter ohne DefaultValue ausschließen

Wenn Parameter ohne Standardwert im Template ausgeschlossen werden sollen.

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"

Als Shell-Skript

#!/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
# Ausführungsbeispiel
Env1=value1 Env2=value2 ./generate-params.sh path/to/template.yaml

Praxishinweis

Dieses Snippet passt gut, wenn dieselbe Operation oder Prüfung im Umfeld von aws, cloudformation, cli, shell, jq nicht immer wieder neu geschrieben werden soll. Als kleine Hilfsfunktion bleibt aufrufender Code leichter lesbar.

Wenn jedoch Verzweigungen und Voraussetzungen zunehmen, sollte nicht alles in ein einziges Snippet gepackt werden. Getrennte Schritte und klar abgegrenzte Helfer bleiben auf Dauer wartbarer.