使用 terraform 订阅 AmazonIpSpaceChanged 的​​ SNS 主题

Bon*_*ond 5 amazon-web-services terraform

我正在尝试使用 terraform 订阅 Aws AmazonIpSpaceChanged SNS 主题。但是,我不断收到以下错误

SNS 主题订阅到 AWS

resource "aws_sns_topic_subscription" "aws_ip_change_sns_subscription" {
  topic_arn = "arn:aws:sns:us-east-1:806199016981:AmazonIpSpaceChanged"
  protocol  = "lambda"
  endpoint  = "${aws_lambda_function.test_sg_lambda_function.arn}"
}
Run Code Online (Sandbox Code Playgroud)

错误:

* module.test-lambda.aws_sns_topic_subscription.aws_ip_change_sns_subscription: 1 error(s) occurred:

* aws_sns_topic_subscription.aws_ip_change_sns_subscription: Error creating SNS topic: InvalidParameter: Invalid parameter: TopicArn
        status code: 400, request id: 3daa2940-8d4b-5fd8-86e7-7b074a16ada9
Run Code Online (Sandbox Code Playgroud)

我使用 aws cli 尝试了同样的方法,但当我没有包含选项 --region us-east-1 时,它第一次失败了。但是一旦包含在内,它就可以很好地订阅。

有任何想法吗?

BMW*_*BMW 1

您的 topic_arn 被硬编码到 Region us-east-1

arn:aws:sns:us-east-1:806199016981:AmazonIpSpaceChanged
Run Code Online (Sandbox Code Playgroud)

因此,当您具有AWS_DEFAULT_REGION或类似的配置并指向另一个区域时,您的代码将会失败。

这就是如果您指定区域,代码就可以正常运行的原因。

为了避免硬编码,例如区域、帐户 ID,您可以这样做:

data "aws_caller_identity" "current" {}

variable "region" {
  type = "string"
  default = "us-east-1"
}

resource "aws_sns_topic_subscription" "aws_ip_change_sns_subscription" {
  topic_arn = "arn:aws:sns:${var.region}:${data.aws_caller_identity.current.account_id}:AmazonIpSpaceChanged"
  protocol  = "lambda"
  endpoint  = "${aws_lambda_function.test_sg_lambda_function.arn}"
}
Run Code Online (Sandbox Code Playgroud)

这样,您应该可以更灵活地在其他区域和其他 aws 账户中运行它。

  • 谢谢@宝马。问题是 SNS 主题是 Amazon 唯一可以订阅 IP 更改的主题。AFAIK,其他地区没有其他主题。 (2认同)