繁体   English   中英

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

[英]SNS topic subscription to AmazonIpSpaceChanged using 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}"
}

错误:

* 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

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

有什么想法吗?

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

arn:aws:sns:us-east-1:806199016981:AmazonIpSpaceChanged

因此,当您有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}"
}

有了它,您应该可以更灵活地在其他区域和其他 aws 帐户中运行它。

我知道这是一个老问题,但没有公认的答案-如果您同意并将其标记为已接受,也许这会对某人有所帮助?

SNS 主题arn:aws:sns:us-east-1:806199016981:AmazonIpSpaceChanged仅在区域us-east-1可用,因此您需要在 Terraform 中使用为该区域配置的提供程序。

您还需要授予 SNS 主题权限以调用 Lambda 函数(不确定您是否刚刚将其排除在问题之外)。

如果您的 lambda 函数定义在不同的区域,这也适用。

provider "aws" {
  region = "{your target region}"
}

provider "aws" {
  alias  = "us_east_1"
  region = "us-east-1"
}

resource "aws_lambda_function" "my_function" {

  # This uses your default target region

  :
  :
}

resource "aws_lambda_permission" "lambda_permission" {

  # This uses your default target region

  statement_id  = "AllowExecutionFromSNS"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.my_function.function_name
  principal     = "sns.amazonaws.com"
  source_arn    = "arn:aws:sns:us-east-1:806199016981:AmazonIpSpaceChanged"
}

resource "aws_sns_topic_subscription" "aws_ip_change_sns_subscription" {

  # This needs to use the same region as the SNS topic
  provider = aws.us_east_1

  topic_arn = "arn:aws:sns:us-east-1:806199016981:AmazonIpSpaceChanged"
  protocol  = "lambda"
  endpoint  = aws_lambda_function.my_function.arn
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM