ehi*_*ime 4 amazon-web-services terraform
我一直在寻找一种 Terraform 方式,以便能够在 Terraform 中同时部署到多个 AWS 账户,但很快就会枯竭。AWS 有使用 Stacks 执行此操作的概念,但我不确定是否有办法在 TF 中执行此操作?如果是这样,会有什么解决方案?
您可以在此处阅读有关 AWS 解决方案的更多信息,https://aws.amazon.com/blogs/mt/supercharge-multi-account-management-with-aws-cloudformation/
小智 14
要在多个 AWS 账户中使用相同的 terraform 配置,需要克服两个问题。首先,您需要为每个帐户使用不同的状态文件。第二,将确保 AWS 提供商为所需账户使用正确的配置文件/凭证。
为每个帐户使用不同的状态文件
在较高的层次上,terraform 的工作原理很简单,就是从给定的 terraform 配置文件 (*.tf) 创建一个依赖资源图;并将它们与状态文件进行比较。状态文件可以是本地( terraform.tfstate) 或远程后端;一个常见的 AWS 远程后端是s3。
即使您通过变量指定 AWS 提供商使用单独的账户(更多内容见下文),如果两个账户使用相同的后端,terraform 也会不断崩溃。这会发生,因为当它从一个账户切换到另一个账户时,资源 AWS ID 将不匹配,和/或资源将在当前正在查看的账户 terraform 中不存在的状态文件中声明。
解决此问题的一个简单方法是使用workspaces。工作区允许您使用不同的状态文件,而无需指定不同的后端密钥。使用工作区非常简单。如果您有一个简单的 terraform 块,例如:
terraform {
backend "s3" {
bucket = "aws_bucket"
key = "terraform.tfstate"
region = "us-east-1"
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用terraform workspace new <workspace-name>. 因此,您可以使用以下序列为您的两个帐户创建工作区:
terraform workspace new account-1
terraform workspace new account-2
Run Code Online (Sandbox Code Playgroud)
您可以使用terraform workspace select以下命令切换当前工作区:
terraform workspace select account-1
Run Code Online (Sandbox Code Playgroud)
将 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
Run Code Online (Sandbox Code Playgroud)
然后,您可以简单地将 aws 提供程序块编写为:
provider "aws" {
region = "us-east-1"
profile = "${terraform.workspace}"
}
Run Code Online (Sandbox Code Playgroud)
所以只要你将你的工作区命名为你的 aws 配置文件名称,那么当你切换工作区时,terraform 将在刷新状态和构建依赖关系图时使用不同的 aws 凭据配置文件。
替代方法
到目前为止,这并不是实现这一目标的唯一方法。你可以构建模块;然后使用不同的目录调用具有不同 AWS 提供程序和指定状态文件的模块。每种方法都有优点和缺点。
工作空间方法是您将如何使用单个目录进行操作,并且您将使用与编写的完全相同的 terraform 配置文件。
模块需要单独的配置文件,至少调用模块并指定提供者和后端。如果您要进行多帐户、多区域和多环境,模块会很有意义。例如,如果您要为每个账户在两个区域和两个不同的环境(暂存和生产)中运行。模块在这里是有意义的,因为它使用诸如计数之类的参数提供了灵活性(也许登台将运行较少数量的实例等)。
| 归档时间: |
|
| 查看次数: |
12363 次 |
| 最近记录: |