0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

jsonnetを使ったCloudFormationのパラメータ管理

0
Last updated at Posted at 2020-03-08

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
params/pipeline.jsonnet
local github_token = std.extVar('GITHUB_TOKEN');
{
  GitHubOwner: 'imishinist',
  GitHubRepo: 'hogehoge',
  GitHubToken: github_token,
  VPCStackName: '%s-vpc' % [self.Stage],
}
params/production/pipeline.jsonnet
{
  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/deploy.sh
#!/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"
  }
]
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?