【问题标题】:Using API Gateway to publish SNS topics / multiple lambda function with API Gateway使用 API Gateway 发布 SNS 主题 / 使用 API Gateway 的多个 lambda 函数
【发布时间】:2016-11-08 20:31:47
【问题描述】:

现在我的要求是,每当我通过 API 获取数据时,我必须将其保存到 2-3 个不同的位置(例如,保存到我自己的数据库、某些 BI 服务,有时还保存到日志数据库)。

我不知道是否可以将单个资源和单个方法绑定到多个 lambda 函数左右。所以,我的替代方法是,因为我已经知道如何通过订阅 SNS 主题来触发多个 lambda 函数,我想如果我能以某种方式从 API 网关发布到 SNS 主题,剩下的就很容易了。我目前的想法如下:

但问题是,我无法从 API Gateway 发布到 SNS 主题。我收到TopicArn or TargetArn Reason: no value for required parameter 之类的错误。

我的方法是,创建一个普通的 SNS 主题。然后,创建一个特殊的角色策略,如下所示:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "StmtXXXXXXXXXXX",
            "Effect": "Allow",
            "Action": [
                "sns:Publish",
                "sns:Subscribe",
                "sns:Unsubscribe"
            ],
            "Resource": [
                "SNS-TOPIC-ARN"
            ]
        }
    ]
}

然后使用 POST/GET 方法创建一个 API(我都尝试了),并将 SNS 主题添加为 AWS 服务代理,并将角色添加为执行角色。

【问题讨论】:

  • 那么为什么你决定让 SNS 主题点击 API 网关,它会调用你的 lambda 函数而不是仅仅触发一个函数?这不会增加不必要的成本吗?
  • 你认为另一个 lambda 函数会比 SNS 主题更便宜吗?
  • 没有。我误解了你的问题。没关系。

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


【解决方案1】:

以下资源在某种程度上详细说明了直接 API-网关到 SNS 集成,没有 Lambda 定义:

文章:Async API with API Gateway and SNS

代码/模板示例:Profit4Cloud(NL) API-to-SNS Example code @Bitbucket

基本上,x-amazon-apigateway-integration Swagger/OpenAPI 'extension' 是在网关的 API 描述中配置的。请注意,在网关扩展中引用了“ExampleTopic”SNS 工件(请参阅integration.request.querystring.TopicArn)。

AWSTemplateFormatVersion: "2010-09-09"
Transform: "AWS::Serverless-2016-10-31"

Resources:
  ExampleTopic:
    Type: "AWS::SNS::Topic"
    Properties:
      TopicName: !Sub "${AWS::StackName}-example-topic"

  ExampleAPI:
    Type: "AWS::Serverless::Api"
    Properties:
      StageName: "prod"
      DefinitionBody:
        swagger: "2.0"
        info:
          title: !Sub "${AWS::StackName}-api"
        paths:
          /example-path:
            post:
              responses:
                "202":
                  description: Accepted
              x-amazon-apigateway-integration:
                type: "aws"
                httpMethod: "POST"
                uri: !Sub "arn:aws:apigateway:${AWS::Region}:sns:action/Publish"
                credentials: !GetAtt ExampleTopicAPIRole.Arn
                requestParameters:
                  integration.request.querystring.Message: "method.request.body"
                  integration.request.querystring.TopicArn: !Sub "'${ExampleTopic}'"
                responses:
                  default:
                    statusCode: 202


  ExampleTopicAPIRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Principal:
              Service: "apigateway.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Policies:
        - PolicyName: !Sub "${AWS::StackName}-example-topic-policy"
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Action: "sns:Publish"
                Effect: "Allow"
                Resource: !Ref ExampleTopic
      ManagedPolicyArns:
        - "arn:aws:iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs"

  ExampleLambda:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: index.handler
      Runtime: nodejs6.10
      CodeUri: ./app
      Events:
        SNSMessage:
          Type: SNS
          Properties:
            Topic: !Ref ExampleTopic

【讨论】:

    【解决方案2】:

    您必须通过 AWS API Gateway 将 TopicArn 或 TargetArn 传递给 SNS。有不同的方法可以实现:

    1。 您可以创建一个方法请求参数,然后创建一个名为TopicArn/TargetArn 的集成请求查询字符串参数并将方法请求参数映射到它。

    2。 您可以创建一个名为 TopicArn/TargetArn 的集成请求查询字符串参数,并将您的 Arn 设置为静态值。

    这是 AWS API Gateway 提供的step by step instruction

    【讨论】:

    • 我不确定,但我认为我已经尝试了您的第二个建议但没有成功。我会仔细检查并尽快回复您。
    • 仅供参考,您还需要将查询字符串从方法请求映射到集成请求。
    猜你喜欢
    • 2016-05-18
    • 2018-11-25
    • 2017-06-26
    • 1970-01-01
    • 2017-05-27
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    相关资源
    最近更新 更多