Amazon web services 如何启动一个新的terraform项目,将s3设置为后端

Amazon web services 如何启动一个新的terraform项目,将s3设置为后端,amazon-web-services,terraform,environment,Amazon Web Services,Terraform,Environment,我在terraform工作了两个月。在阅读这个主题时,您会自动点击一些项目,比如为您的状态文件配置S3后端,而不是在本地使用该文件 但是,当您希望从一开始就将terraform.tfstate文件保存在s3 bucket中时,我找不到启动新terraform项目的好方法 我在这个主题上遇到的所有文档都是关于创建一个S3 bucket、创建一个DymanoDB表、在配置了S3后端设置的情况下执行一个新的初始化。但所有这些步骤都依赖于一个事实,即已经有一个本地terraform.tfstate文件可

我在terraform工作了两个月。在阅读这个主题时,您会自动点击一些项目,比如为您的状态文件配置S3后端,而不是在本地使用该文件

但是,当您希望从一开始就将terraform.tfstate文件保存在s3 bucket中时,我找不到启动新terraform项目的好方法

我在这个主题上遇到的所有文档都是关于创建一个S3 bucket、创建一个DymanoDB表、在配置了S3后端设置的情况下执行一个新的初始化。但所有这些步骤都依赖于一个事实,即已经有一个本地terraform.tfstate文件可用

在没有可用的tfstate文件的情况下,当您想要启动一个新项目时,它是如何工作的

我这么做是为了什么

为了开始使用我的env-t项目,我首先运行这个系统命令来设置所有正确的s3后端设置。(我采用了这种结构,因此我可以轻松地在不同的环境之间切换,这些环境都需要应用相同的TF代码。通过使用var文件进行更改。)

文件集_env_env-t.sh

#!/bin/sh
export TF_VAR_CMDLINE_environment=env-t
export TF_VAR_CMDLINE_tf_state_bucket=tfstate-files-env-t
export TF_VAR_CMDLINE_tf_state_table=tfstate-locks-env-t
export TF_VAR_CMDLINE_region=eu-west10001

export AWS_PROFILE=$TF_VAR_CMDLINE_environment

/tmp/terraform init -backend-config "bucket=$TF_VAR_CMDLINE_tf_state_bucket" -backend-config "dynamodb_table=$TF_VAR_CMDLINE_tf_state_table" -backend-config "region=$TF_VAR_CMDLINE_region" -backend-config "key=$TF_VAR_CMDLINE_environment/terraform.tfstate"
然后在我的main.tf中使用此代码,因此前面设置的后端配置是 也可在TF脚本中使用

variable "CMDLINE_environment"                   {}
variable "CMDLINE_tf_state_bucket"               {}
variable "CMDLINE_tf_state_table"                {}
variable "CMDLINE_region"                                {}

terraform {
  backend "s3" {
  }
}

data "terraform_remote_state" "state" {
  backend = "s3"
  config = {
    profile        = var.CMDLINE_environment
    bucket         = var.CMDLINE_tf_state_bucket
    dynamodb_table = var.CMDLINE_tf_state_table
    region         = var.CMDLINE_region
    key            = "${var.CMDLINE_environment}/terraform.tfstate"
  }
}
设置S3后端一切正常

. ./set_env_env-t.sh
但一旦我运行这个plan命令,它就会退出,错误是没有tfstate 可在S3后端是的,这是正确的这是我的第一次运行

terraform plan -var-file=env-t/vars.tfvars
错误:找不到远程状态

在main.tf第53行的数据“地形远程状态”中: 53:数据“地形远程状态”“状态”{

在给定后端中找不到给定工作区的存储状态

解决这个问题的唯一方法是首先使用本地terraform.tfstate文件 为S3后端配置所有需要的东西。做一个新的初始化,terraform就会检测到 本地状态文件,并提供将其移动到S3存储桶的选项


是否有更好/更简单的方法解决此问题?

您只需提供适当的凭据即可:

terraform {
  backend "s3" {
    bucket = "mybucket"
    key    = "path/to/my/key"
    region = "us-east-1"
  }
}

要将您的状态文件存储在S3中,您不需要数据。terraform\u remote\u state源。

您可以通过将此代码放在main.tf中在后端添加S3。您不需要数据“terraform\u remote\u state”“state”{…}


谢谢你的建议。它现在可以正常工作了。唯一的问题是——你已经说过了——后端资源不支持变量。这是我希望尽可能动态地生成代码的东西。但是在使用后端配置时,我开始注意到,当我这样声明它时。terraform{backend“s3”{}并预先运行../set_env_env-t.sh它现在似乎也能工作了。@Madcowtha首先修复了答案
terraform {
  backend "s3" {
    bucket = "bucket-name"
    key    = "path/to/key/terraform.tfstate"
    region = "us-west-2"
  }
}