如何将 s3 设置为后端启动新的地形项目



在过去的几个月里,我一直在研究地形。阅读此主题后,您会自动点击诸如为状态文件配置 S3 后端而不是在本地使用该文件之类的项目。

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

我遇到的有关此主题的所有文档都在讨论创建 S3 存储桶、创建 DymanoDB 表、使用 S3 后端设置执行新的初始化。但所有这些步骤都依赖于这样一个事实,即已经有一个本地的 terraform.tfstate 文件可用。

当您想在尚无可用的 tfstate 文件时启动一个新项目时,如何工作?

我这么努力是为了什么。

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

文件 set_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

但是一旦我运行这个计划命令,它就会出现没有 tfstate 的错误 在 S3 后端可用是的,没错这是我第一次运行.....

terraform plan -var-file=env-t/vars.tfvars

错误:找不到远程状态

在第 53 main.tf 行,在数据"terraform_remote_state"状态"中: 53:数据"terraform_remote_state"状态"{

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

我现在唯一的解决方法是首先使用本地 terraform.tfstate 文件 为 S3 后端配置所有内容要求。做一个新的初始化,然后地球形态会检测到 本地状态文件,并提供将其移动到 S3 存储桶的选项。

有没有更好/更简单的方法解决这个问题?

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

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

要将状态文件存储在 S3 中,您不需要data.terraform_remote_state源。

您可以通过将此代码放在 main.tf 中来在后端添加 s3。 您不需要数据"terraform_remote_state"状态"{....}

terraform {
backend "s3" {
bucket = "bucket-name"
key    = "path/to/key/terraform.tfstate"
region = "us-west-2"
}
}

最新更新