【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の詳細な設定方法については、公式ドキュメントを参照してほしい。

この設定で得られる効果

実際にこの設定を使ってみると、以下のような効果が得られる:

  1. tfstateファイルの一元管理
    • 複数環境のtfstateを1つのアカウントで管理できる
    • バケットのバックアップやアクセス制御が統一的に行える
  2. 権限管理の柔軟性
    • リソース構築用の権限とtfstate管理用の権限を分離できる
    • 必要最小限の権限設定が可能になる

まとめ

この設定により、AWSアカウントの用途に応じた適切な権限管理とtfstateファイルの一元管理が実現できる。

ぜひこちらも読んでもらいたい。

CloudFormationからTerraformへの変換が超簡単!cf2tfを使ってみた

こんにちは! 今回は「CloudFormationのコードをTerraformに変換したいなぁ」と思って見つけた便利ツールの紹介です。 目次1 見つけたのはこれ2 インストールと使い方3 実…