CloudFormationは、awscliでのデプロイ時にパラメータを指定することができます。
以下のような感じです。
aws cloudformation deploy \
--template-file template.yaml \
--stack-name hoge \
--parameter-overrides \
Param1=hoge \
Param2=fuga
普段は、環境変数で上書きできるようにした上で stagingやproductionとうの環境によってパラメータを設定していたのですが、パラメータが増えてきて、deployようのシェルが肥大化してきて管理が辛くなってきました。
そこで、パラメータをjsonで管理するようにしてみました。
ただ、単純なjsonとすると、環境によって似たような値だったり、共通するものが散らばってしまうので、これを機に jsonnetで管理するようにしてみました。
ディレクトリ構成
<root>
├── bin
│ └── deploy.sh
├── template
│ └── pipeline.yaml
└── params
├── pipeline.jsonnet
├── production
│ └── pipeline.jsonnet
└── staging
└── pipeline.jsonnet
local github_token = std.extVar('GITHUB_TOKEN');
{
GitHubOwner: 'imishinist',
GitHubRepo: 'hogehoge',
GitHubToken: github_token,
VPCStackName: '%s-vpc' % [self.Stage],
}
{
Stage: 'production',
GitHubBranch: 'develop',
} + import '../resource.jsonnet'
このようにパラメータ用のjsonnetファイルを用意しておけば、以下のコマンドでjsonを出力することができます
$ jsonnet -V GITHUB_TOKEN=hogehoge params/production/pipeline.jsonnet
{
"GitHubBranch": "develop",
"GitHubOwner": "imishinist",
"GitHubRepo": "hogehoge",
"GitHubToken": "hogehoge",
"Stage": "production",
"VPCStackName": "production-vpc"
}
デプロイ
あとは、jqを使って適当に加工します
#!/bin/bash
export GITHUB_TOKEN
params=$(jsonnet -V GITHUB_TOKEN=$GITHUB_TOKEN params/production/pipeline.jsonnet \
| jq -r 'to_entries | map(.key + "=" + (.value | tostring) | @sh) | join(" ")')
aws cloudformation deploy \
--template-file template.yaml \
--stack-name hoge \
--parameter-overrides "$params"
パラメータの中に改行が含まれるときのために、 @sh を使って、escapeしています。
小話
調べてなかったので知りませんでしたが、 cloudformationでは、deployじゃなく、create-change-setを使えば、--parametersオプションでjsonを直接渡せるようです。
そのフォーマットが以下のような形のようです。
以下の形に合わせてパラメータファイルを管理するか、上記の形で管理した上で、jqで加工して使うと良さそうです。
[
{ "ParameterKey" : "GitHubToken", "ParameterValue" : "hogehoge" }
]
$ jsonnet -V GITHUB_TOKEN=hogehoge params/production/pipeline.jsonnet | jq -r 'to_entries | map({ ParameterKey: .key, ParameterValue: .value })'
[
{
"ParameterKey": "GitHubBranch",
"ParameterValue": "develop"
},
{
"ParameterKey": "GitHubOwner",
"ParameterValue": "imishinist"
},
{
"ParameterKey": "GitHubRepo",
"ParameterValue": "hogehoge"
},
{
"ParameterKey": "GitHubToken",
"ParameterValue": "hogehoge"
},
{
"ParameterKey": "Stage",
"ParameterValue": "production"
},
{
"ParameterKey": "VPCStackName",
"ParameterValue": "production-vpc"
}
]