【问题标题】:How to construct AWS CloudFormation integration URI for AWS ApiGateway integration with S3, SQS, SNS, DynamoDB and other services?如何为 AWS ApiGateway 与 S3、SQS、SNS、DynamoDB 和其他服务的集成构建 AWS CloudFormation 集成 URI?
【发布时间】:2021-11-23 15:30:54
【问题描述】:

是否有一些关于如何通过 ApiGateway 集成进行一系列操作的示例?寻找如何将对象上传到 S3、将项目推送到 SQS 和 SNS 队列、进行 DynamoDB 调用和许多其他事情,试图找到有关如何构建这些路径的文档。

我正在使用 CloudFormation 模板,它使用集成 URI 来设置此 AWS ApiGateway 与 AWS 服务的集成。

找不到说明如何为所有类型的服务创建这些 URI 路径的文档。

【问题讨论】:

  • 不确定 API 网关集成,但您是否将 lambda 视为集成,您的可能性无穷无尽。
  • 我更喜欢使用 !sub 而不是 !join 因为它更强大且更具可读性。
  • @Lucasz 我想避免 lambda 调用。我不喜欢管理并发、额外的延迟、跟踪峰值是否会通过突然升温、额外的 $ 等来处理。通常不需要 Lambda。 !Sub!Join 我同时使用这两种方法,但问题仍然相同,如何制作这些路径
  • 我同意这一点。只是想确保你知道这种可能性。使用 sub 将是: !Sub "/${ProfilePictureBucketArn}/images/{objectname}"

标签: amazon-web-services amazon-cloudformation aws-api-gateway


【解决方案1】:

在使用另一个 AWS 服务操作设置集成请求时,集成请求 URI 也是一个 ARN。

例如,对于与 Amazon S3 的 GetBucket 操作的集成,集成请求 URI 是以下格式的 ARN:

arn:aws:apigateway:api-region:s3:path

查看更多:https://docs.aws.amazon.com/apigateway/latest/developerguide/integration-request-basic-setup.html

动态数据库: 比 S3 复杂一点: https://aws.amazon.com/blogs/compute/using-amazon-api-gateway-as-a-proxy-for-dynamodb/

社交网络: https://aws.amazon.com/premiumsupport/knowledge-center/api-gateway-proxy-integrate-service/

对于 SQS,我找到了 cloudformation 设置:

PostMethod:
    Type: "AWS::ApiGateway::Method"
    Properties:
      AuthorizationType: "NONE"
      ApiKeyRequired: "true"
      HttpMethod: "POST"
      ResourceId: !Ref "SomeResource"
      RestApiId: !Ref "RestApi"
      MethodResponses:
      - StatusCode: 200
      Integration:
        Credentials: !GetAtt "RestApiRole.Arn"
        IntegrationHttpMethod: "POST"
        IntegrationResponses:
        - StatusCode: 200
        Type: "AWS"
        Uri: !Sub "arn:aws:apigateway:${AWS::Region}:sqs:action/SendMessage"
        RequestParameters:
          integration.request.querystring.QueueUrl: !Sub "'${SomeQueue}'"
          integration.request.querystring.MessageBody: "method.request.body"

这里是 RestApiRole 的代码:

RestApiRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
        - Action:
          - "sts:AssumeRole"
          Principal:
            Service:
            - "apigateway.amazonaws.com"
          Effect: "Allow"
      Policies:
      - PolicyName: "InvokeLambda"
        PolicyDocument:
          Version: "2012-10-17"
          Statement:
          - Action:
            - "lambda:InvokeFunction"
            Resource: !GetAtt "LambdaFunction.Arn"
            Effect: "Allow"

【讨论】:

    【解决方案2】:

    来自 Uri 属性documentation

    如果您为 Type 属性指定 AWS,请指定遵循以下格式的 AWS 服务:arn:aws:apigateway:region:subdomain.service|service:path|action/service_api。例如,Lambda 函数 URI 遵循以下形式:arn:aws:apigateway:region:lambda:path/path。该路径的格式通常为 /2015-03-31/functions/LambdaFunctionARN/invocations。有关更多信息,请参阅 Amazon API Gateway REST API 参考中的 Integration 资源的 uri 属性。

    来自另一个 AWS documentation 的更多描述和示例:

    从这些文档示例和描述中,似乎有 2 种类型的 API - 基于操作和基于路径。

    使用基于动作的 API ?

    我认为大多数人(如果不是全部)都支持这一点。虽然这些操作在 IAM 设置和所有 API 文档中都可用,但所有 AWS 服务都是 web 服务,也就是它们具有 API 接口并且这些接口使用操作。如果某些服务有误,请纠正我,但我认为通过遵循这种结构应该可以对任何与 API Gateway 服务集成的服务进行任何调用。

    有时需要使用路径 API ?

    正在尝试使用 PutObject 将文件上传到 S3,但出现错误:

    <?xml version="1.0" encoding="UTF-8"?>
    <Error>
        <Code>MethodNotAllowed</Code>
        <Message>The specified method is not allowed against this resource.</Message>
        <Method>PUT</Method>
        <ResourceType>SERVICE</ResourceType>
        <RequestId>....</RequestId>
        <HostId>....=</HostId>
    </Error>
    

    替换为路径 API 格式并成功了。所以这里的学习是我将继续尝试首先使用操作 API,如果不能用于特定操作 - 切换到路径 API,同时我觉得操作 API 更具声明性。

    示例结构 Action API:

    arn:aws:apigateway:us-east-1:SERVICE_NAME:action/ACTION_NAME&Var1=Value1&Var2=Value2
    

    对 S3 服务的调用示例。操作名称 - GetObject。此 API 操作的文档说有 2 个必需的属性 - 存储桶(存储桶名称)和密钥。如此完整的示例 URI:

    arn:aws:apigateway:us-east-1:s3:action/GetObject&Bucket=myDemoBucket1&Key=some/path/to/file
    

    与路径 API 相同:

    arn:aws:apigateway:us-east-1:s3:path/myDemoBucket1/some/path/to/file
    

    我找到了一种获取样品的方法。使用控制台 UI,制作端点,部署到某个阶段并进入阶段,选择导出选项卡,然后导出为 Yaml 格式的 Swagger + API Gateway Extensions。虽然我将 Yaml 与 cloudformation 一起使用。在那个 Yaml 里面有你需要的一切。如果没有“阶段”,请转到“资源”并从下拉列表中选择部署并在对话框中创建阶段。


    以下是我为主要服务找到的一些不同示例:

    调用 Lambda docs:

    arn:aws:apigateway:api-region:lambda:path//2015-03-31/functions/arn:aws:lambda:lambda-region:account-id:function:lambda-function-name /调用

    路径部分似乎映射到来自API docs 的 API 操作:

    DynamoDB blog post

    您需要通过 API Action 文档 + Api Action 名称 + IntegrationRequest 模板使用 HTTP 方法来调用 DynamoDB。

    查询操作的示例 URI:

    arn:aws:apigateway:us-east-1:dynamodb:action/Query

    社交网络blog post

    示例 URI:arn:aws:apigateway:region:sns:action/Publish 带地区:arn:aws:apigateway:us-east-1:sns:action/Publish

    需要通过 URL Query String Parameters 传入 TopicArn 和 Message 等参数。该主题有很好的线程:https://stackoverflow.com/a/64268791/1737158

    https://docs.aws.amazon.com/sns/latest/api/API_Publish.html#API_Publish_Examples

    【讨论】:

    • 您可以使用github.com/iann0036/AWSConsoleRecorder 之类的工具来记录您在控制台中所做的事情,这将为您在控制台中所做的事情创建一个 cloudformation、CDK 或 CLI 命令。它不支持所有资源,但可能会很好尝试
    • @Lucasz 刚刚尝试过,创建了一个存储桶,更改了该存储桶上的一些选项,但没有任何记录:(稍后将尝试更多地使用它
    • 我检查了支持的资源,S3 Ddoesnt 似乎被覆盖了。但支持 API 集成! github.com/iann0036/AWSConsoleRecorderGenerator/blob/master/…
    • 真的好用?谢谢:)
    猜你喜欢
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2020-12-16
    • 2020-06-14
    • 2017-09-17
    • 1970-01-01
    相关资源
    最近更新 更多