
私は Terraform で複数の AWS アカウントに同時にデプロイできる方法を探していましたが、うまくいきませんでした。AWS には Stacks を使用してこれを行うという概念がありますが、TF でこれを行う方法があるかどうかはわかりません。ある場合、解決策は何でしょうか。
AWSソリューションの詳細については、こちらをご覧ください。https://aws.amazon.com/blogs/mt/supercharge-multi-account-management-with-aws-cloudformation/
答え1
複数の AWS アカウントで同じ Terraform 構成を使用するには、克服する必要がある問題が 2 つあります。1 つ目は、アカウントごとに異なる状態ファイルを使用する必要があることです。2 つ目は、AWS プロバイダーが目的のアカウントに対して正しいプロファイル/認証情報を使用していることを確認することです。
アカウントごとに異なる状態ファイルを使用する
大まかに言うと、Terraformは、指定されたTerraform構成ファイル(*.tf)から依存関係リソースグラフを作成し、それを状態ファイルと比較するだけで動作します。状態ファイルは、ローカル(terraform.tfstate
)またはリモートのいずれかにあります。バックエンド; 一般的なAWSリモートバックエンドはs3。
変数を使用して AWS プロバイダーが別々のアカウントを使用するように指定した場合でも (詳細は後述)、両方のアカウントが同じバックエンドを使用している場合、Terraform は継続的にクラッシュします。これは、あるアカウントから別のアカウントに切り替えるときに、リソースの AWS ID が一致しない、または、Terraform が現在参照しているアカウントに存在しないリソースが状態ファイルに記述されるために発生します。
これを回避する簡単な方法はワークスペースワークスペースを使用すると、異なるバックエンド キーを指定せずに、異なる状態ファイルを使用できます。ワークスペースの使用は非常に簡単です。次のような単純な 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 プロバイダー リソース ブロック内にあるため、ワークスペースを切り替えると、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 プロファイル名を付けると、ワークスペースを切り替えるときに、Terraform は状態を更新して依存関係グラフを構築するときに、異なる AWS 認証情報プロファイルを使用します。
代替方法
これは、これを実現する唯一の方法ではありません。モジュール; そして、異なる AWS プロバイダーと状態ファイルを指定してモジュールを呼び出す異なるディレクトリを用意します。それぞれの方法には長所と短所があります。
ワークスペース メソッドは、単一のディレクトリで実行する方法であり、記述されているのとまったく同じ Terraform 構成ファイルを使用します。
モジュールには、少なくともモジュールを呼び出し、プロバイダーとバックエンドを指定する個別の構成ファイルが必要です。複数のアカウント、複数のリージョン、複数の環境を実行する場合は、モジュールが非常に役立ちます。たとえば、アカウントごとに 2 つのリージョンで実行し、2 つの異なる環境 (ステージングと本番) で実行する場合などです。モジュールは、count などの引数を使用して柔軟性を提供するため、ここで役立ちます (ステージングではインスタンスの数が少なくなるなど)。
答え2
基本的に、秘訣は、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