【Terraform】tfstateファイルの保存先アカウントを分ける
はじめに
Terraformを使ってAWSリソースを構築する際、tfstateファイルの保存先として別のAWSアカウントのS3バケットを使いたいケースがある。
例えば、環境変数で構築先のAWSアカウントを切り替えながら作業する場合でも、tfstateファイルは特定のアカウントのS3バケットで一元管理したいといった具合だ。
なぜprofileを指定するのか
普段の開発では、リポジトリごとに環境変数でAWSアカウントの認証情報を設定しているとする:
# 例:開発環境用の認証情報を環境変数で設定している場合
export AWS_ACCESS_KEY_ID=AKIA0123456789EXAMPLE
export AWS_SECRET_ACCESS_KEY=abcdefghijklmnopqrstuvwxyz0123456789/EXAMPLE
このように環境変数で認証情報を指定していると、tfstateファイルもそのAWSアカウントのS3バケットに保存される。
しかし、tfstateファイルは別アカウントで管理したいケースもある:
- tfstateファイルを管理用アカウントで一元管理したい
- 複数環境のtfstateを1箇所にまとめたい
- 構築用の権限とtfstate管理用の権限を分けたい
これを実現するのが、terraform blockでのprofile指定だ。
具体的な実装方法
backend設定にprofileを指定することで、tfstateの保存先アカウントを指定できる:
terraform {
backend "s3" {
bucket = "terraform-state-bucket"
key = "env/dev/terraform.tfstate"
region = "ap-northeast-1"
profile = "tfstate-account" # tfstate保存用のプロファイル
}
}
terraform blockの詳細な設定方法については、公式ドキュメントを参照してほしい。
この設定で得られる効果
実際にこの設定を使ってみると、以下のような効果が得られる:
- tfstateファイルの一元管理
- 複数環境のtfstateを1つのアカウントで管理できる
- バケットのバックアップやアクセス制御が統一的に行える
- 権限管理の柔軟性
- リソース構築用の権限とtfstate管理用の権限を分離できる
- 必要最小限の権限設定が可能になる
まとめ
この設定により、AWSアカウントの用途に応じた適切な権限管理とtfstateファイルの一元管理が実現できる。
ぜひこちらも読んでもらいたい。