Open5

SOPS + AWS KMSでterraform.tfvarsファイルを暗号化してGit管理

がくがく

課題

  • Terraformでtfvarsに機密情報を書いていると、tfvars自体の管理が面倒くさい
    • 複数人のプロジェクトで誰かがtfvarsを更新すると、都度共有する必要がある

対策

  • SOPSでtfvarsファイルを暗号化し、GitHub上で管理できるようにする

SOPSとは

  • SOPSはAWS KMSなどのサービス(GCPやAzureにも似たサービスがある)を使ってファイルの暗号化を行うツール
  • Secrets OPerationSの略

https://github.com/mozilla/sops

がくがく

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'

参考

https://zenn.dev/himekoh/articles/202209041050#kms-キー作成・設定

がくがく

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]"
}