【问题标题】:AWS Lambda & SNS: Invoke Lambda cross-regionAWS Lambda 和 SNS:跨区域调用 Lambda
【发布时间】:2016-05-02 14:04:03
【问题描述】:

我有一个部署到多个区域的 Lambda 函数。我想向 SNS 发布一条将调用这些函数的消息。

我使用 aws-cli 创建了主题,授予 Lambda 与 SNS 对话的权限,并创建订阅。订阅似乎创建成功,我可以在 AWS 控制台中看到它。但是,它不起作用。不会调用 lambda 函数。

【问题讨论】:

  • 您是否在 lambda 函数设置中将订阅添加为事件源?
  • 感谢@AssafLavie 的提问。我没有专门这样做,但我认为从 SNS 或 S3 调用时没有必要这样做。
  • 为了澄清,我可以在一个更简单的示例中复制这一点,方法是在不同区域中创建一个具有单个订阅者的 SNS 主题。在这种情况下,我向主题发布了一条消息,但从未调用过该函数。似乎权限相关,但我看不到任何特定于跨区域的内容

标签: amazon-web-services amazon-sns aws-lambda


【解决方案1】:

这是基于CloudFormation 的示例。您必须将SNS 的调用权限添加到Lambda 函数:

{
    "Type" : "AWS::Lambda::Permission",
    "Properties" : {
        "FunctionName" : { "Fn::GetAtt" : [ "YourLambda", "Arn" ] },
        "Action" : "lambda:InvokeFunction",
        "Principal" : "sns.amazonaws.com",
        "SourceArn" : { "Ref" : "YourSNSTopicArn" }
    }
}

然后您需要将您的Lambdas 订阅到您的SNS 主题。这可以通过 API 调用或CloudFormation 来完成。

{
    "Type" : "AWS::SNS::Topic",
    "Properties" : {
        "TopicName" : "YourTopicName",
        "Subscription" : [ {
            "Endpoint" : { "Fn::GetAtt" : [ "YourLambda", "Arn" ] },
            "Protocol": "lambda"
        } ]
    }
}

如果您缺少任何这些,您的Lambdas 将不会调用。以上信息来源为官方博客文章Invoking Lambda functions via SNS

【讨论】:

  • 谢谢。你能帮我理解这个 AssumeRole 政策发生了什么吗?我没有使用 Cloud Formation,所以我不太了解,但是您没有在该策略中指定资源,那么是否授予 Lambda 承担任何角色的权限?这样做有什么安全隐患吗?
  • 对于第一次迭代不完全正确,我深表歉意。您不需要 root 角色。更正后的例子是否更有意义?
  • 暂时我创建了一个带有通配符资源的策略。不幸的是,它没有帮助。我已经给 Lambda 一个“PassRole”策略。
  • 是的,好的,因此 Lambda 角色包含 InvokeFunction 的策略。当我向主题发布消息时,它会调用与主题相同区域中的函数。问题是,它并没有调用其他区域的函数,即使我在看主题时可以清楚地看到他们的订阅。
  • 谢谢!我发现了问题。您可以在我之前粘贴的语句中看到它:我在该语句中硬编码了主题名称。感谢您的帮助,因为我担心这是 AWS 的限制,我并没有在代码中寻找问题。
猜你喜欢
  • 2018-06-23
  • 1970-01-01
  • 2020-10-24
  • 2022-01-21
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 2016-12-25
  • 2020-06-17
相关资源
最近更新 更多