如何在没有模块依赖性的情况下共享terraform脚本

Raf*_*cci 1 amazon-web-services terraform

我想分享一个将在不同项目中使用的terraform脚本.我知道如何创建和共享模块,但这个设置有一个很大的烦恼:当我在脚本中引用模块并执行时terraform apply,如果模块资源不存在,它将被创建,但是如果我执行terraform destroy此资源将被摧毁.

如果我有两个依赖于同一模块的项目,并且在其中一个项目中我调用terraform destroy它可能会导致状态不一致,因为该模块正被另一个项目使用.该脚本可能会失败,因为它无法销毁资源,或者它会破坏资源并影响其他项目.

在我的场景中,我想在两个项目之间共享网络脚本,我希望网络资源永远不会被销毁.我不能只为这个资源创建一个项目,因为我需要在我的项目中以某种方式引用它,唯一的方法是通过它的ID,我不知道将会是什么.

prevent_destroy也不是一个选项,因为我确实需要销毁除共享脚本资源之外的其他资源.此配置terraform destroy失败.

有没有办法引用资源,比如它的名字,还是有任何其他更好的方法来实现我想要的东西?

Yev*_*man 5

如果我理解正确,你有一些资源R是"单身".也就是说,R您的AWS账户中只能存在一个实例.例如,您只能拥有一个名为"foo.com"的aws_route53_zone.如果您R将模块作为模块包含在两个不同的位置,那么任何一个都可以在您运行时创建它,terraform apply并且任何一个可以在您运行时删除它terraform destroy.你想避免这种情况,但你仍然需要一些方法来获取输出属性R(例如,zone_id对于aws_route53_zone资源是由AWS生成的,所以你无法猜测它).

如果是这种情况,那么R您应该:而不是使用模块作为模块:

  1. R在自己的一组Terraform模板中自行创建.让我们说那些是在/terraform/R.
  2. 配置/terraform/R为使用远程状态.例如,以下是如何配置这些模板以将其远程状态存储在S3存储桶中(您需要按指示填写存储桶名称/区域):

    terraform remote config \
      -backend=s3 \
      -backend-config="bucket=(YOUR BUCKET NAME)" \
      -backend-config="key=terraform.tfstate" \
      -backend-config="region=(YOUR BUCKET REGION)" \
      -backend-config="encrypt=true"
    
    Run Code Online (Sandbox Code Playgroud)
  3. R输出变量中定义所需的任何输出属性.例如:

    output "zone_id" {
      value = "${aws_route_53.example.zone_id}"
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 当您运行terraform apply/terraform/R,它会将其Terraform状态(包括该输出)存储在S3存储桶中.
  5. 现在,在需要该输出属性的所有其他Terraform模板中R,您可以使用terraform_remote_state数据源从S3存储桶中提取它.例如,假设您有一些模板/terraform/foo需要该zone_id参数来创建aws_route53_record(您需要按指示填写存储桶名称/区域):

    data "terraform_remote_state" "r" {
      backend = "s3"
      config {
        bucket = "(YOUR BUCKET NAME)"
        key = "terraform.tfstate"    
        region = "(YOUR BUCKET REGION)"
      }
    }
    
    resource "aws_route53_record" "www" {
      zone_id = "${data.terraform_remote_state.r.zone_id}"
      name = "www.foo.com"
      type = "A"
      ttl = "300"
      records = ["${aws_eip.lb.public_ip}"]
    }
    
    Run Code Online (Sandbox Code Playgroud)
  6. 请注意,这terraform_remote_state是一个只读数据源.这意味着当您运行terraform applyterraform destroy使用该资源的任何模板时,它们将不会产生任何影响R.

有关详细信息,请查看如何管理terraform状态Terraform:Up&Running.