标签: aws-api-gateway

AWS Api Gateway 无法重写路径 - 400 错误请求错误

我正在尝试为以前由 nginx 反向代理处理的内容设置 AWS API 网关。我的端点是 VPC 内的 EC2 实例。我已经进行了设置,以便网关可以访问这些实例。

之前的 nginx 设置如下所示:


http {
    server {
        listen 80;

        location /host1/ {
            proxy_pass http://host1:8000/;
        }
        location /host2/ {
            proxy_pass http://host2:8070/;
        }
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试重写请求路径时出现问题。我在 Gateway: 中设置了一条测试路由ANY /test/{proxy+},并将其传递给相应的 EC2 实例。我已经验证,请求已通过,但它们包含请求的完整路径:

# machine 1:
curl -v 'https://<endpoint>.amazonaws.com/test/hello_world/test/a'
< HTTP/2 404 
< date: Sat, 18 Dec 2021 09:21:42 GMT
< content-type: text/html;charset=utf-8
< content-length: 469
< server: SimpleHTTP/0.6 Python/3.7.10
< apigw-requestid: Kic2FiLIFiAEN_g=
< 
--- response ---
# server:
192.168.9.6 - …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-api-gateway aws-elb

1
推荐指数
1
解决办法
1143
查看次数

设置 GatewayResponse 时指定的映射表达式无效

默认 API 网关响应采用以下形式:{"message":$context.error.messageString}。通过控制台更改此模板,"error"例如将其包装在对象中,效果很好。但是,当我在 CDK 中尝试时,在部署过程中出现错误Invalid mapping expression specified

代码注意这实际上是默认模板):

webServiceApi.addGatewayResponse('4XX', {
   type: apigw.ResponseType.DEFAULT_4XX,
   responseHeaders: COMMON_HEADERS,
   templates: {
      'application/json': '{"message":$context.error.messageString}',
   },
});
Run Code Online (Sandbox Code Playgroud)

任何更改都会发生这种情况,包括我能找到的所有 AWS 编写的示例。AWS 中的各个地方都没有充分记录:CDK、SDK、API Gateway 和 CloudFormation,因此我很难找出那里出了什么问题?

云形成错误

Resource handler returned message: "Invalid mapping expression specified: Validation Result: warnings : [], errors : [Invalid mapping expression specified: *] (Service: ApiGateway, Status Code: 400, Request ID: [TRUNCATED], Extended Request ID: null)" (RequestToken: [TRUNCATED], HandlerErrorCode: InvalidRequest)
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-cloudformation aws-lambda aws-api-gateway aws-cdk

1
推荐指数
1
解决办法
1388
查看次数

浏览器中的 AWS API 网关 ERR_CONTENT_DECODING_FAILED

在我的用例中,API Gateway 作为 HTTP 代理,使用官方教程中的默认设置。

它已在测试控制台中或通过 curl 进行测试。但是如果我在浏览器中访问链接或进行 AJAX 调用,我会得到ERR_CONTENT_DECODING_FAILED.

似乎 API Gateway 损坏了内容。相关问题

有没有办法禁止 API Gateway 更改我的内容?我设置Content Handlingpassthrough,但显然它正在改变我的内容。

proxy amazon-web-services aws-api-gateway

0
推荐指数
1
解决办法
2107
查看次数

AWS API Gateway GET 响应始终缓存

更新:我想通了,请参阅下面的回答帖子。

我有一个 AWS API Gateway api,定义了各种资源和各种 GET 和 POST 方法。

一切正常。POST 正在通过。GET 返回一个响应(JSON 负载),但返回的值似乎是一个缓存值。

我的 GET api 调用了一个向 RDS 调用查询的 Lambda 函数。我可以确认我的回答是陈旧的,因为:

  • 当我手动查询 RDS 时,我得到更新的值
  • 我启用了 Cloud Watch 日志并且没有调用 lambda 函数(我相信我已经正确设置了它,因为当我测试调用 lambda 时,我可以获得 Cloud Watch 日志)

它确实刷新了一次,但我认为那是因为我超过了一些(如 1 小时)缓存阈值或其他什么。

我了解 API Gateway 在幕后生成 CloudFront。我觉得这就是缓存的作用。但这只是猜测,我没有证据。也许某种默认缓存TTL?

我显然在 API Gateway 阶段关闭了缓存。我什至尝试启用它,将 TTL 设置为 1,刷新缓存,然后再次禁用缓存。该测试的每个阶段仍然返回陈旧的值。

我不知道它是否相关,但更多细节:

  • 我启用了 CORS(“*”)
  • 我启用了 Cognito 授权方
  • 我通过 Authorization 标头传入 JWT 令牌(这一切正常)

我是否应该传递一些标头来请求未缓存的值?我去了 CloudFront,但这里没有配置。

API Gateway 缓存上的所有其他帖子似乎都是关于缓存不起作用或人们询问缓存键的特殊性。无论如何,我都没有看到任何关于总是被缓存的值。所以我觉得我错过了一些明显的东西......

任何帮助或调试技巧将不胜感激!

caching amazon-web-services aws-api-gateway

0
推荐指数
1
解决办法
948
查看次数

如何在 AWS API Gateway 请求的后端获取 Cognito Identity Id?

我在我的 Web 应用程序中使用 AWS Cognito 身份验证。我有一个带有 REST API 的 PHP 后端。用户身份验证后,我使用此库向 AWS API Gateway 发出请求。API 网关方法具有 HTTP 集成类型。他们将 HTTP 请求代理到我的 PHP 后端。如何在我的 PHP 后端获取 Cognito Identity Id?我需要在后端设置对 Cognito 用户的关系引用。

amazon-web-services aws-api-gateway aws-cognito

0
推荐指数
1
解决办法
911
查看次数

AWS API Gateway自定义授权程序是否有用?

我希望为AWS Lambda/zappa使用一些"无服务器api服务器",它使用自定义API网关授权程序进行用户身份验证.在无服务器的AWS lambda服务中,使用自定义授权器而不是直接在代码控制器中检查已发布的JWT令牌是否具有相当大的安全性或成本优势?对我来说,检查代码可能更方便.

更新我去了pre请求钩子,但是有头级别的授权器,它更容易用于CORS,但我认为zappa不支持它.也可以通过swagger上传为Options设置模拟API,如果成功则会更新.

authentication authorization aws-lambda aws-api-gateway

0
推荐指数
2
解决办法
654
查看次数

在无服务器框架中设置AWS API网关自定义授权者

我需要将AWS API网关自定义授权者添加到Lambda函数中。目前,我已经为每个端点添加了授权者。如下serverless.yml

无服务器

service: test-service

provider:
    name: aws
    runtime: nodejs6.10
    stage: dev
    region: us-east-1

functions:
    bff:
        handler: app.handler
        events:
            - http:
                path: /home
                method: get
                cors: true
                authorizer :
                    arn: arn:aws:lambda:us-east-1:xxxxxx:function:token-verifier
                    resultTtlInSeconds: 0
                    identitySource: method.request.header.Authorization
                    identityValidationExpression: '.*'
Run Code Online (Sandbox Code Playgroud)

如何将自定义授权者添加到整个lambda函数,而不是分别添加到每个端点?

amazon-web-services aws-lambda aws-api-gateway serverless-framework

0
推荐指数
1
解决办法
2146
查看次数

无法使用 Lambda 和 API Gateway 访问 API

我有一个 aws lambda 函数,它返回以下响应:

var responseBody = { cost: price };
var response = {
   statusCode: 200,
   headers: {
          "Access-Control-Allow-Origin": "*"
     },
    body: JSON.stringify(responseBody),
    isBase64Encoded: false
};

callback(null, response);
Run Code Online (Sandbox Code Playgroud)

但是我在前端 Angular 应用程序中收到以下错误。

CORS 政策已阻止在“ https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/price ”处访问 XMLHttpRequest,来自源“ http://127.0.0.1:8080 ”:响应预检请求未通过访问控制检查:它没有 HTTP ok 状态。

amazon-web-services node.js aws-lambda aws-api-gateway

0
推荐指数
1
解决办法
2352
查看次数

调用 post_to_connection 时 Lambda 超时

我将 WebSocket ApiGateway 与 AWS Lambda 集成一起使用。当我尝试使用Lambda 函数的post_to_connection方法将数据发布到客户端时,boto3.client('apigatewaymanagementapi')总是超时而没有任何错误消息。只有超时消息会记录在 CloudWatch 中:

3.00 秒后任务超时

我的代码:

import json
import boto3
import time
import urllib

api_client = boto3.client('apigatewaymanagementapi')

def lambda_handler(event, context):

    connectionId = event['requestContext']['connectionId']

    api_client.post_to_connection(ConnectionId=connectionId, Data=json.dumps({'test': '1'}))

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
        }
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

websocket boto3 aws-lambda aws-api-gateway

0
推荐指数
1
解决办法
613
查看次数

如何使用 OpenAPI 为 AWS API Gateway 配置 CORS?

我有一个用于通过 CDK 部署的 api 的 OpenAPI 规范。规范看起来像:

openapi: 3.0.1
info:
  title: My API
  description: My REST API with CORS enabled
  version: 0.1.0

x-amazon-apigateway-cors:
  allowOrigins:
    - "*"
  allowCredentials: true
  exposeHeaders:
    - "x-apigateway-header"
    - "x-amz-date"
    - "content-type"
  maxAge: 3600
  allowMethods:
    - "*"
  allowHeaders":
    - "x-apigateway-header"
    - "x-amz-date"
    - "content-type"
    - "Authorization"

components:
  securitySchemes:
    lambda:
      type: "apiKey"
      name: "Authorization"
      in: "header"
      x-amazon-apigateway-authtype: "custom"
      x-amazon-apigateway-authorizer:
        authorizerUri: "{{my-lambda-authorizer}}"
        authorizerResultTtlInSeconds: 300
        type: "token" 

paths:
  /user/{id}:
    get:
      summary: Get info of specified user.
      parameters:
        - in: path …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-cloudformation aws-lambda aws-api-gateway aws-cdk

0
推荐指数
1
解决办法
2012
查看次数