我有一个通过顶点创建的 AWS lambda 函数。我还通过地球形态创建了一个SNS主题和订阅。
我的主题是:arn:aws:sns:ap-southeast-1:178284945954:fetch_realm_auctions
我有一个订阅:<code>arn:aws:sns:ap-southeast-1:178284945954:fetch_realm_auctions:2da1d182-946d-4afd-91cb-1ed3453c5d86
我已经确认这是正确的函数ARN。一切似乎都连接正确:
我手动触发SNS:
aws sns publish
--topic-arn arn:aws:sns:ap-southeast-1:178284945954:fetch_realm_auctions
--message '{"endpoint": "https://us.api.battle.net", "realm": "spinebreaker"}'
它返回消息ID,但是没有调用发生。为什么?
对我来说,问题是我在AWS中指定了源帐户
参数::Lambda::P
在我的云信息模板和文档中声明如下:
添加策略时,不要使用--source account参数将源帐户添加到Lambda策略。Amazon SNS事件源不支持源帐户,这将导致访问被拒绝。由于源帐户包含在源ARN中,因此这对安全性没有影响。
一旦我删除了SourceUser
,一切都正常。
SNS主题需要有调用Lambda的权限。
下面是一个如何在Terraform中表达的示例:
# Assumption: both SNS topic and Lambda are deployed in the same region
# resource "aws_sns_topic" "instance" { ... }
# resource "aws_lambda_function" "instance" {... }
# Step 1: Allow the SNS topic to invoke the Lambda
resource "aws_lambda_permission" "allow_invocation_from_sns" {
statement_id = "AllowExecutionFromSNS"
action = "lambda:InvokeFunction"
function_name = "${aws_lambda_function.instance.function_name}"
principal = "sns.amazonaws.com"
source_arn = "${aws_sns_topic.instance.arn}"
}
# Step 2: Subscribe the Lambda to the SNS topic
resource "aws_sns_topic_subscription" "instance" {
topic_arn = "${aws_sns_topic.instance.arn}"
protocol = "lambda"
endpoint = "${aws_lambda_function.instance.arn}"
}
解决此问题的一些一般提示(Lambda未被启动):
一旦您确认了这些基本检查,并且您仍然没有看到任何调用,那一定是权限错误。当您在 AWS 控制台中打开 Lambda 时,您应该会看到 SNS 被列为触发器:
相比之下,如果缺少权限,您将看不到SNS:
如果您没有使用自动部署(例如,使用CloudFormation或Terraform),您也可以手动添加缺少的权限:
添加触发器
下选择SNS
(您需要在列表中向下滚动才能看到它)配置触发器
中,选择SNS主题添加
并保存Lambda我添加了一个内联策略以允许调用lambda:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1474873816000",
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"arn:aws:lambda:ap-southeast-1:178284945954:function:wowauctions_get_auction_data"
]
}
]
}
它现在正在工作。
我有一个名为的类,它扩展了接口和。但是,当我使用该类并且不调用它的方法时,不会触发存在资源泄漏的警告。我还有一个名为的类,它有一个名为的方法,返回一个对象。当我以以下方式创建一个新的对象时,不会触发任何资源泄漏警告:
在非gui模式下使用Jmeter 3.3进行分布式测试的过程中,我得到的错误是,如何修复此问题: 我在主机器和从机器上使用相同版本的JMeter和JDK。 JVM应该已经退出,但没有退出。以下非守护进程线程仍在运行(DestroyJavaVM正常):线程[main,5,main],
我目前有一个AWS Lambda函数正在更新DynamoDB表,我需要另一个Lambda函数,该函数需要在数据更新后运行。在这种情况下,使用DynamoDB触发器而不是使用第一个Lambda调用第二个Lambda有什么好处吗? 看起来编程调用会让我更好地控制何时调用Lambda(即。我可以在调用之前等待几个更新发生),并且从DynamoDB Stream读取会花钱,而简单地调用Lambda不会。
背景: 我正在通过Terraform开发一个自定义AWS github webhook。我使用AWS API网关触发一个AWS Lambda函数,该函数从请求头验证GitHub webhook的sha256签名。如果lambda函数成功验证了请求,我希望通过lambda提供的异步调用目标特性调用子lambda函数。 问题: 即使我已经使用目标子Lambda函数配置了异步调用,但当父Lambda函数
我正在试验Dynamo db和lambda,并且在以下流程中遇到问题: Lambda A由put to S3事件触发。它获取对象(一个音频文件),计算其持续时间,并在dynamoDB中为每30秒的段写入一条记录。 Lambda B由DynamoDB触发,从S3下载文件并对Dynamo行中定义的30秒记录进行操作。 我的问题是,当我运行这个流时,函数A通过函数B写入Dynamo所需的所有行 似乎没有
假设: 让我们假设数据插入DynamoDB的速率是巨大的。 上下文: 在DynamoDB表上启用流,这将触发lambda。lambda读取流记录,并在弹性搜索中对记录进行索引。 问题陈述: 在将记录插入DynamoDB的时间和通过流式记录触发lambda的时间之间存在延迟。这种延迟或滞后不断增加,并且与插入DynamoDB的数据量成正比。 如何找到滞后的位置?是流没有立即触发lambda吗?还是因