同一应用程序下具有多个环境的 Terraform 和 Elastic Beanstalk
Terraform and Elastic Beanstalk with multiple Environments under the same Application
我正在使用 Terraform 创建一个 Elastic Beanstalk 应用程序和两个关联的环境,但在设置时遇到了一些困难。具体来说,我有两个 Terraform 配置用于我的两个环境,生产环境和暂存环境,以及一个 Elastic Beanstalk 模块。像这样:
├── environments
│ ├── production
│ │ ├── main.tf
│ │ └── variables.tf
│ └── staging
│ ├── main.tf
│ └── variables.tf
└── modules
└── elastic_beanstalk
├── main.tf
└── variables.tf
对于 Elastic Beanstalk,惯例是应用程序 > 环境 > 应用程序版本,因此 EB 应用程序类似于 "elastic_beanstalk",然后会有用于生产和暂存的 EB 环境。
问题:我不知道如何处理用TF创建EB应用程序,因为它需要在两个TF环境之间共享。如果我在从暂存配置调用的模块内部处理 EB 应用程序创建,那么从生产配置调用模块会抛出错误,因为它无法识别 EB 应用程序已经创建并且应该使用。也许是某种处理此问题并输出的全局配置,因此它在模块中可用?
Terraform 通常不处理 AWS 处理的某些版本化资源,相反,创建代表这些阶段的完全分离的资源通常更容易。对于 AWS 的 API 网关之类的东西尤其如此,它具有 Terraform 根本无法很好处理的阶段概念。
使用 Elastic Beanstalk,您可以选择忽略 EB 提供的环境功能,而只是为每个生产和暂存环境创建一个单独的应用程序和环境,因此非常基本的模块可能如下所示:
variable "environment" {}
resource "aws_elastic_beanstalk_application" "application" {
name = "my-application-${var.environment}"
}
resource "aws_elastic_beanstalk_environment" "environment" {
name = "my-application-${var.environment}"
application = "${aws_elastic_beanstalk_application.application.name}"
solution_stack_name = "64bit Amazon Linux 2015.03 v2.0.3 running Go 1.4"
}
然后您可以调用相同的模块,但传入不同的环境名称,以在 AWS 中获得完全独立的 EB 应用程序,该应用程序恰好由环境命名。
或者,如果您想坚持使用 EB 的环境模型,您可以单独定义应用程序,然后仅在环境级别部署环境。
所以在这种情况下,您的布局可能类似于:
.
├── application
│ ├── main.tf
│ └── variables.tf
├── environments
│ ├── production
│ │ ├── main.tf
│ │ └── variables.tf
│ └── staging
│ ├── main.tf
│ └── variables.tf
└── modules
└── elastic_beanstalk_environment
├── main.tf
└── variables.tf
└── elastic_beanstalk_application
├── main.tf
└── variables.tf
并且您必须先应用 application
目录,然后再部署环境目录。
在没有任何 Elastic Beanstalk 经验的情况下,我可能会倾向于第一个模型,因为它简化了我使用 Terraform 进行部署的方式,并且知道如果我应用暂存环境并且一切都很好,那么应用生产环境就是也会很好地工作。对于第二种模型,有人可能会在应用暂存环境后对 application
应用更改,然后您可能会将尚未部署到暂存环境的更改部署到生产中。
使用 API Gateway 和 Lambda,它们也支持某种形式的内部版本控制,我发现通常最好忽略此版本控制并创建完全不同的资源并使用 Terraform 模块和符号链接配置来保存内容正确排列。
我正在使用 Terraform 创建一个 Elastic Beanstalk 应用程序和两个关联的环境,但在设置时遇到了一些困难。具体来说,我有两个 Terraform 配置用于我的两个环境,生产环境和暂存环境,以及一个 Elastic Beanstalk 模块。像这样:
├── environments
│ ├── production
│ │ ├── main.tf
│ │ └── variables.tf
│ └── staging
│ ├── main.tf
│ └── variables.tf
└── modules
└── elastic_beanstalk
├── main.tf
└── variables.tf
对于 Elastic Beanstalk,惯例是应用程序 > 环境 > 应用程序版本,因此 EB 应用程序类似于 "elastic_beanstalk",然后会有用于生产和暂存的 EB 环境。
问题:我不知道如何处理用TF创建EB应用程序,因为它需要在两个TF环境之间共享。如果我在从暂存配置调用的模块内部处理 EB 应用程序创建,那么从生产配置调用模块会抛出错误,因为它无法识别 EB 应用程序已经创建并且应该使用。也许是某种处理此问题并输出的全局配置,因此它在模块中可用?
Terraform 通常不处理 AWS 处理的某些版本化资源,相反,创建代表这些阶段的完全分离的资源通常更容易。对于 AWS 的 API 网关之类的东西尤其如此,它具有 Terraform 根本无法很好处理的阶段概念。
使用 Elastic Beanstalk,您可以选择忽略 EB 提供的环境功能,而只是为每个生产和暂存环境创建一个单独的应用程序和环境,因此非常基本的模块可能如下所示:
variable "environment" {}
resource "aws_elastic_beanstalk_application" "application" {
name = "my-application-${var.environment}"
}
resource "aws_elastic_beanstalk_environment" "environment" {
name = "my-application-${var.environment}"
application = "${aws_elastic_beanstalk_application.application.name}"
solution_stack_name = "64bit Amazon Linux 2015.03 v2.0.3 running Go 1.4"
}
然后您可以调用相同的模块,但传入不同的环境名称,以在 AWS 中获得完全独立的 EB 应用程序,该应用程序恰好由环境命名。
或者,如果您想坚持使用 EB 的环境模型,您可以单独定义应用程序,然后仅在环境级别部署环境。
所以在这种情况下,您的布局可能类似于:
.
├── application
│ ├── main.tf
│ └── variables.tf
├── environments
│ ├── production
│ │ ├── main.tf
│ │ └── variables.tf
│ └── staging
│ ├── main.tf
│ └── variables.tf
└── modules
└── elastic_beanstalk_environment
├── main.tf
└── variables.tf
└── elastic_beanstalk_application
├── main.tf
└── variables.tf
并且您必须先应用 application
目录,然后再部署环境目录。
在没有任何 Elastic Beanstalk 经验的情况下,我可能会倾向于第一个模型,因为它简化了我使用 Terraform 进行部署的方式,并且知道如果我应用暂存环境并且一切都很好,那么应用生产环境就是也会很好地工作。对于第二种模型,有人可能会在应用暂存环境后对 application
应用更改,然后您可能会将尚未部署到暂存环境的更改部署到生产中。
使用 API Gateway 和 Lambda,它们也支持某种形式的内部版本控制,我发现通常最好忽略此版本控制并创建完全不同的资源并使用 Terraform 模块和符号链接配置来保存内容正确排列。