【问题标题】:"Invalid input" adding SNS topic as Lambda destination“无效输入”将 SNS 主题添加为 Lambda 目标
【发布时间】:2023-04-10 20:21:01
【问题描述】:

Lambda now supports 添加 SNS 主题(以及其他内容)作为目的地。这可以通过 UI 进行设置。

但我无法让它工作。我有一个简单的 Lambda,它返回一个我希望它推送到 SNS 主题的 JSON。我打开 Lambda 的目的地并在目的地中粘贴主题。这导致“输入无效”。

为了让目的地能够识别主题 ARN,我首先授予 Lambda SNS 完全访问权限,然后还将我的 Lambda 角色添加到 SNS 主题访问策略中。

"Resource": [topic arn],
      "Condition": {
        "StringEquals": {
          "AWS:SourceOwner": [topic owner],
          "Role": [Lambda role arn]  <---single added line
        }
      }

不再有“无效输入”!

不幸的是,当我返回 Lambda 并再次通过 Destination 流程时,我现在得到了

提供的目标配置 DestinationConfig(onSuccess=OnSuccess(destination=[topic arn]), onFailure=null) 无效。

但只能定义成功或失败(单选按钮),不能同时定义两者。所以大概是我在某处搞砸了权限,而 Lambda 实际上仍然无法发布。

我需要哪些权限来授予 Lambda 角色,以及我需要如何更新主题访问权限才能使其正常工作?

编辑:VPC

我没有提到我的 Lambda 位于 VPC 上。因为我正在调用一个外部数据库并且需要一个列入白名单的 IP,所以我正在使用 VPC/NAT 设置来保持一个稳定的 IP。

我不确定这是否会影响我的情况,但根据我对 VPC 的初步了解,我猜这会限制 Lambda 可以直接与之交互的内容。

【问题讨论】:

  • 同样的问题;你找到解决办法了吗?
  • 回过头来看,我最后只是直接在 lambda 代码中调用了 SNS

标签: aws-lambda amazon-sns amazon-vpc


【解决方案1】:

环顾四周,the Asynchronous Invocation docs 有一个关于 Lambda 目的地的部分。该部分似乎表明您需要的唯一权限是向您的 Lambda 提供 sns:Publish。您能否确认它确实获得了发布权限?

如果这不是问题,我会尝试使用他们的 Cloudformation 模板(引用如下 - 来自您上面的链接)并将其与您通过控制台进行设置时在您的帐户中生成的 Cloudformation 进行比较。

Resources: 
  EventInvokeConfig:
    Type: AWS::Lambda::EventInvokeConfig
    Properties:
        FunctionName: “YourLambdaFunctionWithEventInvokeConfig”
        Qualifier: "$LATEST"
        MaximumEventAgeInSeconds: 600
        MaximumRetryAttempts: 0
        DestinationConfig:
            OnSuccess:
                Destination: “arn:aws:sns:us-east-1:123456789012:YourSNSTopicOnSuccess”
            OnFailure:
                Destination: “arn:aws:lambda:us-east-1:123456789012:function:YourLambdaFunctionOnFailure”

请注意,从文档中可以看出,您可以在控制台中依次定义OnSuccessOnFailure,方法是执行两次。我不会完全放弃他们拥有例如隐含要求同时提供 OnSuccessOnFailure

【讨论】:

  • 确认我的 Lambda 有 sns:Publish。我过火并授予它允许:sns:*。对于顺序授予,我无法保存第一个,所以我不怀疑我可以通过流程两次并坚持任何尝试。我在哪里可以找到我的 Cloudformation?
  • 您可以使用Cloudformer 从现有资源生成 Cloudformation,但您似乎根本无法通过流程,或者 2. 尝试使用上面的 Cloudformation创建目标规则,然后在控制台中检查该规则以查看结果。您是否尝试过对您的 SNS 主题策略进行等效更改,即授予更多许可访问权限?或许见the sns policy page
【解决方案2】:

可能与您的情况不同,但我发现我收到此错误的原因仅仅是因为 SNS 与 lambda 位于不同的区域。确保它是按照以下示例工作的同一区域。希望这里的错误更清楚!

service: errorhandlingdemo

frameworkVersion: '2'
configValidationMode: error

plugins:
  - serverless-dotenv-plugin

provider:
  name: aws
  runtime: python3.7
  lambdaHashingVersion: 20201221
  profile: ${opt:profile, env:PROFILE}
  stage: ${opt:stage, env:STAGE}
  timeout: 5 # seconds, which is 5 seconds
  iamRoleStatements:
    - Effect: "Allow"
      Action:
       - sns:*
      Resource:
       - arn:aws:sns:us-east-1:540160934250:genesis-alerts

functions:
  helloworld:
    handler: handler.hello
    destinations:
      onFailure: helloFailure
  helloFailure:
    handler: failure_handler.handler
    destinations:
      onFailure: arn:aws:sns:us-east-1:540160934250:genesis-alerts
      onSuccess: arn:aws:sns:us-east-1:540160934250:genesis-alerts

custom:
  dotenv:
    basePath: ./env/
    logging: true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    相关资源
    最近更新 更多