はじめに
この章では AWS での Terraform 利用のための環境設定方法として、私が aws-vault と Docker Compose を組み合わせた方法を推奨する理由を説明します。
環境設定方法だけを知りたい方は読み飛ばしてもらっても構いません。
AWS リソースを Terraform で管理する際の課題
AWS リソースを Terraform で管理する際の課題として以下の2つがありました。
課題 1:AWS の Credential 管理
Terraform で AWS リソースを作成する場合における AWS の Credential 使用方法について、以下の2つがよく知られています。
- tfvars を使用する方法
- 環境変数を使用する方法
しかし、上記の方法にはそれぞれ以下の課題があります。
tfvars を使用する方法における課題
terraform.tfvars というファイルに Credential を設定しておいて使用する方法です。
Git で管理する場合は.gitignore にこのファイルを追加することで Git の管理対象外とします。
この方法であれば AWS マルチアカウントの環境でも環境ごとに別々の tfvars ファイルを作成することで Credential も使い分けることができます。
しかし、この方法には以下の課題があります。
- .gitignore 頼り
tfvars ファイルに AWS で最もセンシティブな情報である Credential の情報を記載するのはとても心臓に悪いです。
特に Terraform で使用する権限は最も強い AdministratorAccess を使用するケースが多いため、万が一流出すると大変なことになります。
.gitignore を誤って消してしまったり、内容を編集した際に tfvars の記載を消してしまう等のリスクを考慮するとかなり不安な運用になります。 - tfvars ファイルを Git 管理したい場合にできない
tfvars ファイルは環境依存の Terraform 変数の値を環境ごとに指定する目的で使用するファイルのため、Credential を記載する目的以外でも使用することが多くあります。
その際に Credential を記載しているという理由で Git にあげられないのはとても不便です。 - Credential を平文で保管しておくリスクがある
tfvars ファイル自体を暗号化したりしない限りは、Credential をそのまま平文でローカル PC に保存することになります。
PC が盗難にあった場合やウイルスに感染した場合に Credential が流出するリスクがあります。
環境変数を使用する方法における課題
ローカル PC 上の環境変数に Credential を指定して、Terraform 実行時に環境変数の値を読み込ませて使用する方法です。
Terraform の公式のチュートリアルでもこの方法を使用しています。
しかし、この方法にも以下の課題があります。
- 環境ごとに都度環境変数の変更が必要
AWS マルチアカウントの環境の場合、環境ごとに使用する Credential を変える必要があります。環境を切り替えるたびに環境変数を設定し直すのはとても面倒ですし、
Credential を参照するするためにどこか安全な場所で別途保管しておく必要があります。 - Credential を平文で保管しておくリスクがある
tfvars を使用する場合と同様に Credential が流出するリスクがあります。
課題 2:Terraform バージョン管理
Terraform をチーム開発で使用する場合は、メンバーごとに使用する Terraform のバージョンの違いによって環境やコードに差分が出ないようにするため、使用する Terraform のバージョンをメンバー間で統一する必要があります。
また、Terraform を使用する複数のプロジェクトを 1 人で掛け持ちする場合には、プロジェクトごとに使用する Terraform のバージョンが異なるため、プロジェクトごとに使用する Terraform のバージョンを適宜切り替える必要があります。
上記の理由から使用する Terraform のバージョンを手軽に切り替えたり、複数人で簡単に統一できることが望ましいです。
aws-vault + Docker Compose
これらの課題を解決するのが今回紹介する aws-vault + Docker Compose を使用する方法です。
それぞれが上記の課題の解決策となっています。
- AWS の Credential 管理の課題に対する解決策:aws-vault
- Terraform のバージョン管理の課題に対する解決策:Docker Compose