我正在对AWS开发无服务器数据管道。与无服务器框架相比,Terraform更好地支持了诸如Glue。
的服务。无服务器的好处是,部署时可以定义--stage
参数。这允许在AWS上创建一个孤立的堆栈。在我们的数据管道上开发新功能时,我可以部署代码状态,例如
serverless deploy --stage my-new-feature
这使我可以在与同事共享的AWS帐户上进行隔离的集成测试。这可以使用Terraform吗?
您是否看过工作区?https://www.terraform.io/docs/state/workspaces.html
Terraform通过状态管理资源。
如果状态文件中已经存在资源,而Terraform在提供商中的配置,状态和任何差异之间未检测到任何漂移(例如AWS控制台或其他工具中的某些东西已更改(,那么它将显示没有变化。如果它确实检测到某种形式的漂移,那么plan
将向您展示将提供商中现有事物的现有状态推向Terraform代码中所定义的需要的更改。
在不同环境之间分开状态
如果您想拥有多个环境,甚至还有其他彼此分开并且不受相同Terraform操作管理的资源(例如plan
,apply
或destroy
(,则您希望将它们分开为不同的状态文件。/p>
做到这一点的一种方法是通过环境分开您的Terraform代码,并使用与您的代码库目录结构相匹配的状态文件。一个简单的示例可能看起来像这样:
terraform/
├── production
│ ├── main.tf -> ../stacks/main.tf
│ └── terraform.tfvars
├── stacks
│ └── main.tf
└── staging
├── main.tf -> ../stacks/main.tf
└── terraform.tfvars
stacks/main.tf
variable "environment" {}
resource "aws_lambda_function" "foo" {
function_name = "foo-${var.environment}"
# ...
}
生产/Terraform.tfvars
environment = "production"
staging/terraform.tfvars
environment = "staging"
这使用符号链接,以使分期和生产在代码中保持一致,而terraform.tfvars
文件引入了唯一的更改。在这种情况下,它将lambda函数的名称更改为包括环境。
这通常是我对静态环境推荐的,因为查看存在的代码/目录结构更清楚。
动态环境
但是,如果您有更多动态的环境,例如每个功能分支,那么它将无法直接在terraform.tfvars
文件中进行硬编码环境名称。
在这种情况下,我会推荐这样的东西:
terraform/
├── production
│ ├── main.tf -> ../stacks/main.tf
│ └── terraform.tfvars
├── review
│ ├── main.tf -> ../stacks/main.tf
│ └── terraform.tfvars
├── stacks
│ └── main.tf
└── staging
├── main.tf -> ../stacks/main.tf
└── terraform.tfvars
这可以用相同的方式工作,但是我会从review
结构中省略environment
变量,以便进行交互或通过CI环境变量设置(例如,在Travis CI运行时,export TF_VAR_environment=${TRAVIS_BRANCH}
在Travis CI中运行时,请调整以支持您使用的任何CI系统(。<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
在不同分支机构上保持状态在审核环境之间分开
这只会让您一半,因为当另一个人试图将其与另一个分支一起使用时,他们会看到Terraform希望销毁/更新已通过运行Terraform创建的任何资源,如果您只是使用默认工作区。
工作区提供了以更动态的方式分离状态的选项,还允许您将工作区名称插入Terraform代码:
resource "aws_instance" "example" {
tags {
Name = "web - ${terraform.workspace}"
}
# ... other arguments
}
相反,审核环境将需要创建或使用仅针对该分支的动态工作区。您可以通过运行以下命令来执行此操作:
terraform workspace new [NAME]
如果工作空间已经存在,则应使用以下命令:
terraform workspace select [NAME]
在CI中,您可以使用与以前相同的环境变量来自动使用分支名称作为工作空间名称。