Terraformで複数のAWSアカウントに同時にデプロイしてドライアップできるようにするTerraformの方法を探していました。 AWSにはスタックでこれを行うという概念がありますが、TFでこれを行う方法があるかどうかはわかりませんか?もしそうなら、いくつかの解決策は何でしょうか?
AWSソリューションの詳細については、こちらをご覧ください https://aws.Amazon.com/blogs/mt/supercharge-multi-account-management-with-aws-cloudformation/
複数のAWSアカウントで同じTerraform構成を使用するには、克服しなければならない2つの問題があります。 1つ目は、アカウントごとに異なる状態ファイルを使用する必要があることです。 2つ目は、AWSプロバイダーが目的のアカウントの正しいプロファイル/認証情報を使用するようにすることです。
アカウントごとに異なる状態ファイルを使用する
高レベルでは、指定されたterraform構成ファイル(* .tf)から依存関係リソースグラフを作成するだけで、terraformは機能します。そしてそれらを状態ファイルと比較します。状態ファイルは、ローカル(terraform.tfstate
)またはリモート バックエンド のいずれかにすることができます。一般的なAWSリモートバックエンドは s3 です。
変数を介して別のアカウントを使用するようにAWSプロバイダーを指定した場合でも(これについては以下で詳しく説明します)、両方のアカウントが同じバックエンドを使用すると、Terraformが継続的にクラッシュします。これは、あるアカウントから別のアカウントに切り替わると、リソースのAWS IDが一致せず、リソースが状態ファイルに記述され、Teraformが現在見ているアカウントに存在しないために発生します。
これを回避する簡単な方法は、 workspaces を使用することです。ワークスペースを使用すると、さまざまなバックエンドキーを指定せずにさまざまな状態ファイルを使用できます。ワークスペースの使用は非常に簡単です。次のような単純なterraformブロックがある場合:
terraform {
backend "s3" {
bucket = "aws_bucket"
key = "terraform.tfstate"
region = "us-east-1"
}
}
terraform workspace new <workspace-name>
を使用して新しいワークスペースを作成できます。したがって、次のようなシーケンスを使用して、両方のアカウントのワークスペースを作成できます。
terraform workspace new account-1
terraform workspace new account-2
terraform workspace select
を使用して、現在のワークスペースを切り替えることができます。
terraform workspace select account-1
ワークスペースを認識するようにAWSプロバイダーを構成する
個別の状態ファイルを使用することに加えて。また、必要なアカウントごとに異なるAWS認証情報(つまり、アクセスキー)を指定する必要があります。 AWS認証情報は、 プロバイダーを使用して記述されています。 この場合、明らかに AWSプロバイダーを使用しています。 基本的に、AWSプロバイダーのリソースブロック内で interpolation を使用する必要があるため、ワークスペースを切り替えると、terraformは正しい認証情報を使用します。アカウントごとに個別のプロファイルを使用してaws資格情報ファイルをセットアップしていると仮定します。
[account-1]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
[account-2]
aws_access_key_id=AKIAI44QH8DHBEXAMPLE
aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
次に、awsプロバイダーブロックを次のように記述します。
provider "aws" {
region = "us-east-1"
profile = "${terraform.workspace}"
}
ワークスペースにawsプロファイル名を付けている限り、ワークスペースを切り替えると、Teraformは状態を更新して依存関係グラフを作成するときに別のaws資格情報プロファイルを使用します。
別の方法
これは、これを達成する唯一の方法ではありません。 modules ;を構築できます。そして、異なるAWSプロバイダーと指定された状態ファイルでモジュールを呼び出す異なるディレクトリがあります。それぞれの方法には長所と短所があります。
ワークスペースメソッドは、単一のディレクトリでそれを行う方法であり、記述されたものとまったく同じterraform構成ファイルを使用します。
モジュールには、少なくともモジュールを呼び出し、プロバイダーとバックエンドを指定する個別の構成ファイルが必要です。モジュールは、マルチアカウント、マルチリージョン、マルチ環境をどこで実行するのであれば、非常に理にかなっています。たとえば、アカウントごとに2つのリージョンで実行し、2つの異なる環境(ステージングと本番)で実行するとします。モジュールは、countなどの引数を使用して柔軟性を提供するため、ここで意味があります(ステージングでは、実行されるインスタンスの数が少なくなるなど)。
基本的には、1つの共有バケット内の状態を取得し、アカウントを切り替えるときに、提供される別の認証情報を指定するのがコツです。ワークスペースは私にとって完璧に機能します
provider "aws" {
version = "~> 2.18"
profile = "second_account"
}
terraform {
backend "s3" {
encrypt = true
bucket = "shared_bucket"
region = "us-east-1"
key = "state"
profile = "first_shared_account"
}
required_version = "~> 0.12.7"
}
プロバイダー構成とバックエンド構成の両方に異なるプロファイルが指定されていることに注意してください。それぞれが独自のワークスペースを介して分離されている限り、さまざまなプロファイルを束ねることができます。
aws configure --profile third_account
terraform workspace new third_account
terraform workspace select third_account