Open5
SOPS + AWS KMSでterraform.tfvarsファイルを暗号化してGit管理
課題
- Terraformでtfvarsに機密情報を書いていると、tfvars自体の管理が面倒くさい
- 複数人のプロジェクトで誰かがtfvarsを更新すると、都度共有する必要がある
対策
- SOPSでtfvarsファイルを暗号化し、GitHub上で管理できるようにする
SOPSとは
- SOPSはAWS KMSなどのサービス(GCPやAzureにも似たサービスがある)を使ってファイルの暗号化を行うツール
- Secrets OPerationSの略
SOPSインストール
Macの環境では、Homebrewを使ってSOPSをインストールします。
% brew install sops
% sops -v
sops 3.7.3 (latest)
KMSキーの作成と設定
こちらの記事を参考にKMSを使用して暗号化に使用するキーを作成します。
次にターミナル上で作成したKMSのエイリアスを利用して、KeyIdを取得します。
取得したKeyIdを利用してKMSのARNを設定します。
(あくまでエイリアス→KeyId取得→ARNを設定する方法なので、一発でARN指定しても大丈夫です。)
% aws kms list-aliases \
--query 'Aliases[?AliasName==`alias/key`].TargetKeyId'
% export SOPS_KMS_ARN='arn:aws:kms:ap-northeast-1:111111111111:key/上記で出力されたkeyId'
参考
Terraform設定
Terraformでsopsを使えるようにproviderにsopsを追加します。
provider.tf
terraform {
sops = {
source = "carlpett/sops"
version = "~> 0.7"
}
}
暗号化ファイルの作成
sopsコマンドにファイル名を引数として指定して実行します。
% sops secrets.enc.tfvars.json
ファイルの中身をこのように編集し、保存すると暗号化されています。
secrets.enc.tfvars.json(編集時)
{
"access_key": "xxxxxxxxxxxxxxxx"
"secret_key": "xxxxxxxxxxxxxxxxx",
"password": "password"
}
secrets.enc.tfvars.json(保存後)
{
"access_key": "ENC[AES256_GCM,data:xxxxxxxxxxxxxxxx]"
"secret_key": "ENC[AES256_GCM,data:xxxxxxxxxxxxxxxx]",
"password": "ENC[AES256_GCM,data:xxxxxxxxxxxxxxxx]"
}