代码之家  ›  专栏  ›  技术社区  ›  xyz1234

解决Terraform中的资源依赖

  •  5
  • xyz1234  · 技术社区  · 8 年前

    我是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处理这些问题的正确方法是什么?

    2 回复  |  直到 8 年前
        1
  •  10
  •   fishi0x01    8 年前

    正如评论中所提到的,这看起来像是一个语法问题。

    它应该是:

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

    这个 depends_on 语法与其他语法略有不同,不需要 ${} 引用的资源变量周围的括号。我还是有点奇怪,你收到同样的错误 取决于 .

        2
  •  2
  •   ydaetskcoR    8 年前

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

    这在 docs :

    不受支持的协议包括:

    • 电子邮件--通过SMTP传递邮件
    • 电子邮件json—通过SMTP传递json编码的邮件

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

    您在问题中显示的错误消息是由于使用了中指出的错误语法 @fishi's answer 但您的长期问题将归结于缺少电子邮件SNS订阅支持(并且可能是在使用错误的 depends_on 语法。顺便说一句,你也绝对不需要 取决于 因为您引用了 aws_sns_topic 中的资源 aws_sns_topic_subscription 资源

    当我在没有 取决于 相反,我得到了以下更清楚的错误:

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