![](/img/trans.png)
[英]SNS subscription error for AmazonIpSpaceChanged on different region
[英]SNS topic subscription to AmazonIpSpaceChanged using terraform
我正在尝试使用 terraform 订阅 Aws AmazonIpSpaceChanged SNS 主题。 但是,我不断收到以下错误
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.