Terraform のラッパーツールである Terragrunt と暗号化ツールの sops を組み合わせると、安全に機密情報を管理しつつ、Terragruntのソースコードと共にGitHubでチームメンバーに共有することができるようになります。
今回は sops で作成した暗号化ファイルの内容を AWS Systems Manager のパラメータストアに登録して他のAWSサービスから利用できるようにしてみます。
前提
いくつか事前準備が必要となります。
sopsのインストールとKMSキーの作成
sopsのインストールと暗号化に必要なKMSキーの作成を行ってください。以下の記事を参考にしてみてください。
tfenv, tgenvのインストール
以下の記事を参考にしながら tfenv, tfenv をインストールしてください。Terraform と Terragrunt本体については後ほどインストールします。
機密情報をSSMパラメーターストアへ登録
サンプルコード説明
今回使用するTerragruntのソースコードをこちらのGitHubにコミットしました。
ファイル構成やTerragruntの構文などの基本的な説明については、以下の記事をご参照ください。
terragrunt.hcl
今回は terragrunt.hcl から terraform の ssmモジュールを呼び出すというシンプルな構成になっています。
以下の部分で機密情報ファイルを読み込みんでいます。
secrets = try(yamldecode(sops_decrypt_file("demo_secrets.yml")),{})
sops_decrypt_fileというTerragruntの組み込み関数を使っています。
さらにtry関数で囲っているとdemo_secrets.yml がない場合も空データを渡して実行エラーとなることを回避できます。いずれ機密情報ファイルを作成するけど、それまでTerragruntは普通に実行して他の部分のインフラを構築しておきたいみたいなケースに便利です。
modules/ssm/main.tf
main.tfはdemo_secrets.ymlの内容を一旦、1次元の配列に整形してからそれをループしてSSMパラメータへ登録しています。
modules/ssm/outputs.tf
outputs.tf でキー名や値を出力しておくと、別のモジュールでそれを利用することができるようになります。
Terragrunt実行
サンプルコードのダウンロードとTerraform, Terragruntのインストール
$ git clone git@github.com:zoo200/blog.git
...
$ cd blog/terragrunt-sops-push-secrets-ssm-parameter-store/
$
$ tfenv install
...
$
$ tgenv install
...
$
sopsで暗号化ファイルの作成
$ sops -k arn:aws:kms:ap-northeast-1:123456789012:key/451aaa-bbb-ccc-ddd-eee demo_secrets.yml
## 以下の内容を記述します。
demo-db:
user: demo-user
pass: demo-pass
demo-key:
id: demo-id
secret: demo-secret
$
Terragruntの実行
$ terragrunt apply
...
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
Outputs:
ssm-parameter-name-secrets-demo-db-pass = "/secrets/demo-db/pass"
ssm-parameter-name-secrets-demo-db-user = "/secrets/demo-db/user"
ssm-parameter-value-secrets-demo-db-pass = <sensitive>
ssm-parameter-value-secrets-demo-db-user = <sensitive>
$
SSMパラメータストアの確認
demo_secrets.yml の内容が以下のようにSSMパラメータストアに登録されます。
今回は以上です〜ノシ
参考
アリガト━━━ヾ(´∀`)ノ━━━━♪
Github mozilla/sops
Terragrunt sops_decrypt_file