使用S3中的Terraform远程状态和多个文件夹

6

我目前使用默认工作空间,我的文件夹结构是这样的 -

dev
        ├── app
        │   └── main.tf
        ├── mysql
        │   └── main.tf
        └── vpc
            └── main.tf

我已经创建了一个S3后端,并且对于单个文件夹的情况它可以正常工作。

terraform {
  backend "s3" {
    bucket         = "mybucket"
    key            = "global/s3/mykey/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "terraform-state-wellness-nonprod"
    encrypt        = true
  }
}

我正在苦恼如何在所有文件夹中包含这个后端配置,比如我想在应用程序、mysql和vpc中使用相同的后端s3存储桶(Dynamodb的密钥不同),但是当这在一个文件夹中工作时,在第二个文件夹中terraform却想要删除S3存储桶和Dynamodb。


你是怎么运行这个的?看起来你有三个应用程序,所以存储桶会像这样:[app | mysql | vpc]/global/s3/mykey/terraform.tfstate - x80486
所以我应该在存储桶内创建“文件夹” - 所以我的后端块中的存储桶键应该像mybucket-app,mybucket-mysql等一样?我只是运行terraform init和terraform apply/plan。 - Illusionist
根据您提供的文件,您的backend配置重复了三次,这应该就可以了。如果您进入每个目录并运行命令,一切都应该没问题。不,您不需要在那个存储桶上手动执行任何操作,Terraform会为您管理所有这些文件。 - x80486
不幸的是,这并不起作用,terraform 确实找到了它,但当我在一个新文件夹中计划它时,它想要销毁旧的后端,然后显然一切都失败了。 - Illusionist
1个回答

9

我建议您在terraform代码中使用module结构。

例如:

   dev
    ├──modules
    │    ├── app
    │    │   └── app.tf
    │    ├── mysql
    │    │   └── mysql.tf
    │    └── vpc
    │        └── vpc.tf
    └──main.tf

main.tf :

module "app" {
  source = "./modules/app"
...
}

module "mysql" {
  source = "./modules/mysql"
...
}

module "vpc" {
  source = "./modules/vpc"
...
}

terraform {
  backend "s3" {
    ...
  }
}

如果您想应用/销毁每个模块:

terraform apply -target module.app
terraform destroy -target module.app

请看:

这里有一个使用module结构的代码库


谢谢,我可以有嵌套模块吗?因为我的一些代码已经在子文件夹的模块中了。 - Illusionist
然后尝试使用另一个工作区。这可以将同一模块用于不同的资源。您可以在同一工作区中使用重复的模块,只需更改模块的名称即可。 - GNOKOHEAT
它基本上可以工作,但我在一个模块文件中有一个变量,我该如何从主文件传递它们?这是一个必需的变量。 - Illusionist
运行命令 terraform plan -var="password=mypass" 时,我遇到了一个错误:“在命令行上分配了名为“password”的变量,但根模块没有声明该名称的变量。要使用此值,请将“variable”块添加到配置中。”,它在模块级别被定义。 - Illusionist
你有没有查看过这个仓库(https://github.com/gnokoheat/aws-serverless-data-pipeline-by-terraform)?你可以在 main.tf 中找到如何在 modules 中设置变量的方法。 - GNOKOHEAT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接