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)키 이름으로 알파벳 순 정렬(diff 를 안정적으로 만들기 위해)
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