如何共享没有模块依赖关系的terraform脚本

时间:2016-10-06 15:51:58

标签: amazon-web-services terraform

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

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

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

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

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

1 个答案:

答案 0 :(得分:5)

如果我理解正确,您有一些资源R是“单身人士”。也就是说,您的AWS账户中只能存在R的一个实例。例如,您只能拥有一个名为“foo.com”的aws_route53_zone。如果您将R作为模块包含在两个不同的位置,那么任何一个都可以在您运行terraform apply时创建它,并且任何一个可能会在您运行terraform destroy时将其删除。您希望避免这种情况,但仍需要某种方式从R获取输出属性(例如,zone_id资源的aws_route53_zone由AWS生成,因此您可以'猜猜看。)

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

  1. 在自己的一组Terraform模板中单独创建R。我们说这些都在/terraform/R
  2. 之下
  3. 配置/terraform/R以使用Remote State。例如,以下是如何配置这些模板以将其远程状态存储在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"
    
  4. R所需的任何输出属性定义为输出变量。例如:

    output "zone_id" {
      value = "${aws_route_53.example.zone_id}"
    }
    
  5. 当您在terraform apply中运行/terraform/R时,它会将其Terraform状态(包括该输出)存储在S3存储桶中。
  6. 现在,在需要R输出属性的所有其他Terraform模板中,您可以使用terraform_remote_state data source从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}"]
    }
    
  7. 请注意terraform_remote_state是只读数据源。这意味着当您在使用该资源的任何模板上运行terraform applyterraform destroy时,它们将不会对R产生任何影响。
  8. 有关详细信息,请查看How to manage terraform state Terraform: Up & Running