Amazon web services 如何在没有模块依赖项的情况下共享terraform脚本

Amazon web services 如何在没有模块依赖项的情况下共享terraform脚本,amazon-web-services,terraform,Amazon Web Services,Terraform,我想分享一个将在不同项目中使用的terraform脚本。我知道如何创建和共享模块,但这种设置有一个很大的麻烦:当我在脚本中引用模块并执行terraform apply时,如果模块资源不存在,它将被创建,但如果我执行terraform destroy则此资源将被销毁 如果我有两个项目依赖于同一个模块,并且在其中一个项目中我称之为terraform destroy,这可能会导致不一致的状态,因为该模块正被另一个项目使用。脚本可能会失败,因为它无法销毁资源,也可能会销毁资源并影响其他项目 在我的场景中

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

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

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

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


有没有什么方法可以引用资源,比如通过它的名称,或者有没有其他更好的方法来完成我想要的任务?

如果我理解正确,您有一些资源
R
是“单例”。也就是说,您的AWS帐户中只能存在一个
R
实例。例如,您只能拥有一个名为“foo.com”的网站。如果您将
R
作为一个模块包含在两个不同的位置,那么任何一个都可以在您运行
terraform apply
时创建它,并且在您运行
terraform Distroy
时删除它。您希望避免这种情况,但仍然需要某种方法从
R
获取输出属性(例如
aws\u route53\u zone
资源的
zone\u id
是由aws生成的,因此您无法猜到)

如果是这种情况,那么您应该:

  • 在自己的一组地形模板中自行创建
    R
    。假设它们在
    /terraform/R
  • 配置要使用的
    /terraform/R
    。例如,下面是如何配置这些模板以将其远程状态存储在S3 bucket中(您需要填写bucket名称/区域,如图所示):

  • R
    中需要的任何输出属性定义为输出变量。例如:

    output "zone_id" {
      value = "${aws_route_53.example.zone_id}"
    }
    
  • 当您在
    /terraform/R
    中运行
    terraform apply
    时,它将其terraform状态(包括该输出)存储在S3存储桶中
  • 现在,在所有其他需要从
    R
    输出属性的地形模板中,您可以使用。例如,假设您有一个模板
    /terraform/foo
    ,它需要
    zone\u id
    参数来创建一个(您需要填写bucket name/region,如图所示):

  • 请注意,
    terraform\u remote\u state
    是只读数据源。这意味着当您在使用该资源的任何模板上运行
    terraform apply
    terraform destroy
    时,它们在
    R
    中不会产生任何效果

  • 有关更多信息,请查看和。

    如果我理解正确,您有一些资源
    R
    是“单例”。也就是说,您的AWS帐户中只能存在一个
    R
    实例。例如,您只能拥有一个名为“foo.com”的网站。如果您将
    R
    作为一个模块包含在两个不同的位置,那么任何一个都可以在您运行
    terraform apply
    时创建它,并且在您运行
    terraform Distroy
    时删除它。您希望避免这种情况,但仍然需要某种方法从
    R
    获取输出属性(例如
    aws\u route53\u zone
    资源的
    zone\u id
    是由aws生成的,因此您无法猜到)

    如果是这种情况,那么您应该:

  • 在自己的一组地形模板中自行创建
    R
    。假设它们在
    /terraform/R
  • 配置要使用的
    /terraform/R
    。例如,下面是如何配置这些模板以将其远程状态存储在S3 bucket中(您需要填写bucket名称/区域,如图所示):

  • R
    中需要的任何输出属性定义为输出变量。例如:

    output "zone_id" {
      value = "${aws_route_53.example.zone_id}"
    }
    
  • 当您在
    /terraform/R
    中运行
    terraform apply
    时,它将其terraform状态(包括该输出)存储在S3存储桶中
  • 现在,在所有其他需要从
    R
    输出属性的地形模板中,您可以使用。例如,假设您有一个模板
    /terraform/foo
    ,它需要
    zone\u id
    参数来创建一个(您需要填写bucket name/region,如图所示):

  • 请注意,
    terraform\u remote\u state
    是只读数据源。这意味着当您在使用该资源的任何模板上运行
    terraform apply
    terraform destroy
    时,它们在
    R
    中不会产生任何效果

  • 有关更多信息,请查看并查看。

    Wow!这真是一个好方法!我不知道您可以检索远程状态并将其用作数据源。哇!这真是一个好方法!我不知道您可以检索远程状态并将其用作数据源。
    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}"]
    }