Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.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
Terraform 不同s3存储桶中的地形工作区状态?_Terraform_Terraform Provider Aws - Fatal编程技术网

Terraform 不同s3存储桶中的地形工作区状态?

Terraform 不同s3存储桶中的地形工作区状态?,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我使用terraform在开发和生产环境中提供资源。这些环境位于两个不同的aws帐户上。我的状态是本地的,但我现在想把它推到s3。问题是terraform将def和prod ENV的状态存储在同一个s3存储桶中,是否可以将它们分开?如果不是的话,还有哪些不拆分terraform代码库的替代解决方案?我在terraform周围有一个bash包装器,并为每个帐户创建一个状态文件,以分离关注点。我还将自动化分解为许多组件,以保持状态较小,从而不会影响性能,并将状态下载并上传到bucket: funct

我使用terraform在开发和生产环境中提供资源。这些环境位于两个不同的aws帐户上。我的状态是本地的,但我现在想把它推到s3。问题是terraform将def和prod ENV的状态存储在同一个s3存储桶中,是否可以将它们分开?如果不是的话,还有哪些不拆分terraform代码库的替代解决方案?

我在terraform周围有一个bash包装器,并为每个帐户创建一个状态文件,以分离关注点。我还将自动化分解为许多组件,以保持状态较小,从而不会影响性能,并将状态下载并上传到bucket:

function set_backend () {
    local STATE_PATH=$1
    if [[ $BACKEND == "s3" ]]; then
        cat << EOF > ./backend.tf
terraform {
  backend "s3" {
    bucket = "${TF_VAR_state_bucket}"
    dynamodb_table = "${DYNAMODB_STATE_TABLE}"
    key    = "terraform/$STATE_PATH/terraform.tfstate"
    region = "$REGION"
    encrypt = "true"
  }
}
provider "aws" {
  region  = "$REGION"
  version = "1.51.0"
}
provider "aws" {
  region  = "$DR_REGION"
  version = "1.51.0"
  alias = "dr"
}
provider "archive" { version = "1.1.0" }
provider "external" { version = "1.0.0" }
provider "local" { version = "1.1.0" }
provider "null" { version = "1.0.0" }
provider "random" { version = "2.0.0" }
provider "template" { version = "1.0.0" }
provider "tls" { version = "1.2.0" }
EOF
    fi
}
函数集\u后端(){
本地状态路径=$1
如果[[$BACKEND==“s3”];则
cat./backend.tf
地形{
后端“s3”{
bucket=“${TF\u VAR\u state\u bucket}”
dynamodb_table=“${dynamodb_STATE_table}”
key=“terraform/$STATE\u PATH/terraform.tfstate”
region=“$region”
encrypt=“true”
}
}
提供商“aws”{
region=“$region”
version=“1.51.0”
}
提供商“aws”{
region=“$DR_region”
version=“1.51.0”
alias=“dr”
}
提供程序“存档”{version=“1.1.0”}
提供程序“外部”{version=“1.0.0”}
提供程序“本地”{version=“1.1.0”}
提供程序“null”{version=“1.0.0”}
提供程序“随机”{version=“2.0.0”}
提供程序“模板”{version=“1.0.0”}
提供程序“tls”{version=“1.2.0”}
EOF
fi
}

Terragrunt是一个很好的工具,用于管理不同环境的terraform状态文件,并将状态文件存储在不同的存储桶中,而不是使用terraform workspace

有用的链接,


Terraform将在您设置的任何位置存储状态。你是如何配置你的状态的?我目前只是硬编码bucket名称。理想情况下,我希望为此使用某种变量,如local.env,但我找不到一个好的方法…您不能在后端配置中使用插值,因为后端需要在运行该部分代码之前进行配置。如果您需要变量状态配置(您需要),那么您应该考虑使用包装脚本或类似TravaRunt之类的东西。如果我只需要在后端配置之前向terraform传递一个简单变量(aws帐户名),那么最好的方法是什么?这对我帮助很大!