【问题标题】:Solving resource dependency in Terraform解决 Terraform 中的资源依赖性
【发布时间】:2017-12-14 23:15:36
【问题描述】:

我是 Terraform 的新手,我正在尝试创建 AWS SNS 主题和订阅。我的代码如下所示:

provider "aws" {
  region = "${var.aws_region}"
}

resource "aws_sns_topic" "sns_my_topic" {
  name = "${var.sns_topic_name}"
}

resource "aws_sns_topic_subscription" "code_commit_notification" {
  depends_on  = ["${aws_sns_topic.sns_my_topic}"]

  topic_arn   = "${aws_sns_topic.sns_my_topic.arn}"
  protocol    = "email"    
  endpoint    = "${var.sns_subscribe_endpoint}"
}

但是,我在运行terraform apply 时得到以下错误输出:

Error: aws_sns_topic_subscription.code_commit_notification: resource depends on non-existent resource '${aws_sns_topic.sns_my_topic}'

在添加上面的depends on 块之前,我也收到了同样的错误(并且在阅读https://github.com/hashicorp/terraform/issues/10462 之后也将其移出模块)。让 Terraform 处理这些的正确方法是什么?

【问题讨论】:

  • 它应该是depends_on = ["aws_sns_topic.sns_my_topic"](没有${}括号 - depends_on 语法与其他语法略有不同)。仍然奇怪的是,当您不使用 depends_on 时也会出现该错误。
  • @fishi 可能值得将其发布为答案,尤其是如果您可以充实一点。

标签: amazon-web-services terraform


【解决方案1】:

正如 cmets 中所述,这看起来像是一个语法问题。

应该是:

resource "aws_sns_topic_subscription" "code_commit_notification" {
  depends_on  = ["aws_sns_topic.sns_my_topic"]

  ...
}

depends_on 语法与其他语法略有不同,它不需要在引用的资源变量周围加上 ${} 括号。在没有depends_on 的情况下您收到同样的错误对我来说还是有点奇怪。

【讨论】:

  • @xyz1234 很高兴它有帮助。但是你绝对应该仔细看看ydaetskcoR answer。它指出了您在使用 email 协议类型时可能遇到的长期问题。
  • 是的,只是将其用作测试参数,这不是必需的。但是,ydaetskcoR 确实是正确的,即电子邮件不是受支持的协议,并且在应用时会导致进一步的错误。
【解决方案2】:

一开始我没有发现它,但 email 不支持作为 Terraform 中的 SNS 协议,因为它需要在 ARN 可用之前带外接受订阅。

docs中提到了这个:

不支持的协议包括:

  • 电子邮件 -- 通过 SMTP 传递消息
  • email-json -- 通过 SMTP 传递 JSON 编码的消息

这些不受支持,因为端点需要获得授权,并且在目标电子邮件地址得到验证之前不会生成 ARN。这破坏了 Terraform 模型,因此目前不受支持。

您在问题中显示的错误消息归结为使用了 @fishi's answer 中指出的错误语法,但您的长期问题将归结为缺乏电子邮件 SNS 订阅支持(并且可能是导致不同在使用错误的depends_on 语法之前出现错误。顺便说一句,您也绝对不需要depends_on,因为您在已经创建的资源之间存在隐式依赖关系,因为您引用了aws_sns_topic 资源aws_sns_topic_subscription 资源。

当我在没有depends_on 的情况下计划您的问题中的代码时,我得到了以下错误,这更清楚:

Error: aws_sns_topic_subscription.code_commit_notification: Unsupported protocol (email) for SNS Topic

【讨论】:

    猜你喜欢
    • 2021-10-24
    • 1970-01-01
    • 2021-06-05
    • 2020-09-16
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2015-08-07
    • 2020-09-15
    相关资源
    最近更新 更多