【问题标题】:Terraform remote state configuration for modules模块的 Terraform 远程状态配置
【发布时间】:2018-03-17 22:04:35
【问题描述】:

Terraform v0.10.7

我正在为我们的 DevOps 团队整合 terraform 模块。我们正在使用的每个组件都有单独的模块,然后将使用这些模块针对不同的环境和要求创建整个堆栈。

目录层次如下:

Terraform
  - modules
     - module-1 (main.tf, vars.tf, outputs.tf, backend.tf)
     - module-2 (main.tf, vars.tf, outputs.tf, backend.tf)
     - module-3 (main.tf, vars.tf, outputs.tf, backend.tf)
     ...
  - environments
     - qa (main.tf, vars.tf, outputs.tf, bakend.tf)
     - stage (main.tf, vars.tf, outputs.tf, bakend.tf)
     - prod (main.tf, vars.tf, outputs.tf, bakend.tf)

backend.tf 中,我将后端指定为 S3,并将完整的层次结构指定为 /resources/mod-1/terraform.tfstate。同样的事情也适用于环境中的 backend.tf。

当我为任何环境提供 terraform getterraform apply 时,它将获取所有指定的模块并将更改应用到 AWS 基础设施,并将该环境的 terraform.tfstate 存储在 S3 中的指定位置。

所以问题是,环境中使用的所有模块的 terraform.tfstate 是否也会生成并推送到 S3(单个应用到 env)? 我还没有将terraform apply 运行到任何模块。

因为我计划使用来自 S3 的这些模块的 terraform.tfstate 中的一些数据,同时希望避免对这些模块提供多个应用程序并将单个 terraform apply 提供给环境.如何实现?

【问题讨论】:

    标签: amazon-web-services amazon-s3 terraform


    【解决方案1】:

    首先,我认为您不需要为每个环境重新编写相同的*.tf 文件。因此,对于每个应用程序,取决于将获取哪些模块,您应该具有以下文件结构:

    Application-1
         - modules-1.tf
         - modules-2.tf
         - modules-3.tf
         - main.tf, vars.tf, outputs.tf
         - qa (qa/backend.conf, qa/qa.tfvars)
         - stag (stag/backend.conf, stag/stag.tfvars)
         - prod (prod/backend.conf, stag/prod.tfvars)
    

    在 /backend.conf 中,您可以定义 s3 后端(如果您使用 aws)

    bucket  = "<global_unique_bucket_name>"
    key     = "<env>/network.tfstate"
    region  = "us-east-1"
    kms_key_id = "alias/terraform"
    encrypt = true
    

    其次,每个模块应该不需要后端(如果我的理解是正确的,后端是用来保存tfstate文件的)。后端文件应该在我上面列出的每个环境中。

    第三,*.tfstate文件应该在每个环境中定义。我在&lt;env&gt;/backend.conf中给出了上面的示例

    然后我们有服务器层来管理 terraform 堆栈、VPC/网络层、数据库/elasticache 层、应用程序层。因此,您可以相应地对堆栈资源进行分组。

    【讨论】:

    • 感谢您的详细解答!但是如果没有 main.tf 的环境,你会运行什么?任何环境的main.tf 文件都将包含所有带有源代码的模块。所以 envs 的 main.tf 将只有要使用的模块列表(与其他模块的 main.tf 不同)。是的,我正在使用 AWS,我希望 S3 作为后端。但是 Terraform 中有一个错误,它不允许将 S3 配置为后端,并且在 terraform init 期间它说 InvalidClientTokenId 尽管是 root 用户。
    • 请确保您正确设置 AWS API 密钥 (terraform.io/docs/providers/aws)
    • 说真的,先生?您认为我在没有正确设置 AWS API 密钥的情况下如何达到这一点?请参阅 Terraform Git 以了解未解决的问题。如果有的话,我要求解决。 (github.com/terraform-providers/terraform-provider-aws/issues/…)
    • @arman K,我浏览了您提供的链接。我认为这是一个新问题,与您首先提出的问题无关。并且您在 github 上有票,那是您解决新问题的最佳场所。对于您提出的设计问题,您还有任何疑问吗?
    • 不,先生。您提出的设计可以根据我的要求在这里和那里进行修改。所以看起来不错。感谢您的帮助!
    猜你喜欢
    • 2021-12-11
    • 2016-11-24
    • 1970-01-01
    • 2022-12-15
    • 2016-12-22
    • 1970-01-01
    • 2022-12-22
    • 2019-07-28
    • 2021-02-22
    相关资源
    最近更新 更多