Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 与AWS上的无服务器框架一样,使用terraform创建独立堆栈_Amazon Web Services_Terraform_Terraform Provider Aws - Fatal编程技术网

Amazon web services 与AWS上的无服务器框架一样,使用terraform创建独立堆栈

Amazon web services 与AWS上的无服务器框架一样,使用terraform创建独立堆栈,amazon-web-services,terraform,terraform-provider-aws,Amazon Web Services,Terraform,Terraform Provider Aws,我正在AWS上开发一个无服务器数据管道。与相比,它对Glue等服务有更好的支持 Serverless的好处在于,您可以在部署时定义--stage参数。这允许在AWS上创建隔离堆栈。在数据管道上开发新功能时,我可以部署我的代码状态,如 serverless deploy --stage my-new-feature 这使我能够对与同事共享的AWS帐户进行独立的集成测试。这是否可能使用Terraform 你看过工作区了吗 Terraform通过状态管理资源 如果资源已经存在于状态文件中,并且Ter

我正在AWS上开发一个无服务器数据管道。与相比,它对Glue等服务有更好的支持

Serverless的好处在于,您可以在部署时定义
--stage
参数。这允许在AWS上创建隔离堆栈。在数据管道上开发新功能时,我可以部署我的代码状态,如

serverless deploy --stage my-new-feature

这使我能够对与同事共享的AWS帐户进行独立的集成测试。这是否可能使用Terraform

你看过工作区了吗

Terraform通过状态管理资源

如果资源已经存在于状态文件中,并且Terraform没有检测到配置、状态和提供程序中的任何差异之间的任何漂移(例如,AWS控制台或其他工具中的某些内容发生了更改),那么它将显示没有任何更改。如果它确实检测到某种形式的漂移,那么一个
计划
将向您显示它需要做哪些更改,以将提供者中的现有状态推送到地形代码中定义的状态

分离不同环境之间的状态 如果您想拥有多个相互独立的环境或甚至其他资源,而不是由相同的地形操作(例如
计划
应用
销毁
)管理,那么您需要将它们分离到不同的状态文件中

一种方法是按环境分离Terraform代码,并使用与代码库目录结构匹配的状态文件。一个简单的示例可能如下所示:

terraform/
├── production
│   ├── main.tf -> ../stacks/main.tf
│   └── terraform.tfvars
├── stacks
│   └── main.tf
└── staging
    ├── main.tf -> ../stacks/main.tf
    └── 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
stacks/main.tf 生产/地形.tfvars staging/terraform.tfvars 这使用了符号链接,这样登台和生产在代码中保持一致,只有
terraform.tfvars
文件引入了更改。在本例中,它更改Lambda函数的名称以包含环境

这是我通常为静态环境推荐的方法,因为通过查看存在哪些环境的代码/目录结构可以更清楚地看到这一点

动态环境 但是,如果您有更多的动态环境,例如每个功能分支,那么直接在
terraform.tfvars
文件中硬编码环境名称是行不通的

在这种情况下,我建议如下:

terraform/
├── production
│   ├── main.tf -> ../stacks/main.tf
│   └── terraform.tfvars
├── stacks
│   └── main.tf
└── staging
    ├── main.tf -> ../stacks/main.tf
    └── 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环境变量进行设置(例如
export TF_VAR_environment=${TRAVIS_BRANCH}
在TRAVIS CI中运行时,调整此变量以支持您使用的任何CI系统)

在不同分支上的审阅环境之间保持状态分离 这只会让你半途而废,因为当另一个人试图将其用于另一个分支时,他们会看到Terraform想要销毁/更新任何已经通过运行Terraform创建的资源,如果你只是使用默认的

工作空间提供了一个以更动态的方式分离状态的选项,还允许您:

相反,审查环境将需要创建或使用仅适用于该分支的动态工作区。您可以通过运行以下命令来执行此操作:

如果工作区已存在,则应改为使用以下内容:


在CI中,您可以使用与以前相同的环境变量来自动使用分支名称作为工作区名称。

如果将其展开以提供示例或解释更多有关工作区帮助的内容,这将是一个更好的答案。现在,这几乎是一个只有链接的答案,如果链接断了,那么这个答案是没有帮助的。
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
resource "aws_instance" "example" {
  tags {
    Name = "web - ${terraform.workspace}"
  }

  # ... other arguments
}
terraform workspace new [NAME]
terraform workspace select [NAME]