我是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处理这些的正确方法是什么?
答案 0 :(得分:5)
如评论中所述,这看起来像语法问题。
应该是:
resource "aws_sns_topic_subscription" "code_commit_notification" {
depends_on = ["aws_sns_topic.sns_my_topic"]
...
}
depends_on
语法与其他语法略有不同,并且在引用的资源变量周围不需要${}
括号。如果没有depends_on
,您收到同样的错误,我仍然有点奇怪。
答案 1 :(得分: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