当前位置: 首页 > 知识库问答 >
问题:

利用API网关发布SNS主题/带API网关的多重lambda函数

戎洛城
2023-03-14

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

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

但问题是,我不能从API网关发布到SNS主题。我得到了类似topicarn或TargetArn的错误原因:所需参数没有值。

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

共有1个答案

子车宏浚
2023-03-14

下面的参考资料在某种程度上详细说明了API-网关到SNS的直接集成,而不需要Lambda定义:

文章:带API网关和SNS的异步API

代码/模板示例:Profit4Cloud(NL)API到SNS示例代码@BitBucket

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
 类似资料:
  • 早上好,你能帮我们解决下一个问题吗:我有一个API网关+Java Lambda处理程序。这个Lambda使用httpconnection获取一些Internet REST API。 当我们使用这个Lambda而不使用VPC时,它工作得很好。但当我们使用配置了internet访问的VPC时--有时Lambda会出现超时错误而失败。它在20%的请求中失败(80%的请求工作正常),下一个错误发生在日志中

  • 我有一个Lambda函数,它在直接执行时工作得非常好。由于目前只是为了测试,它只读取请求,并返回其中一个子项的值作为响应: 然而,当我使用AWSAPI网关从中创建Api时,出现了一种奇怪的行为。如果Lambda函数包含上述代码,则响应主体为空。但是,如果我更改响应以返回整个请求正文,而不是一个子请求(在本例中为),它将返回整个请求正文。无论如何,尽管lambda函数在隔离状态下工作良好,但在API

  • 我试图使用java脚本访问一个AWS api网关来调用一个带有传递头的lambda。通过邮递员测试效果很好。 我得到以下信息: 我在GET和OPTION方法上启用了CORS,但没有用。 我可以坦率地承认,我只是几乎不明白CORS的概念,我是否错过了一些非常明显的东西?

  • 我正在开发一个React JS web应用程序。通过这个应用程序,用户可以将他们的照片/视频上传到S3存储桶中。而且视频大小相当大(超过300MB)。所以我决定使用Multipart上传方法将视频文件上传到S3存储桶。在研究了Multipart之后,我理解了这个多部分概念,但我无法在React项目中实现它。因此,我来到这里,提出了几个关于multipart如何与React或其他Frontend一起