我正在尝试为以前由 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) 默认 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
更新:我想通了,请参阅下面的回答帖子。
我有一个 AWS API Gateway api,定义了各种资源和各种 GET 和 POST 方法。
一切正常。POST 正在通过。GET 返回一个响应(JSON 负载),但返回的值似乎是一个缓存值。
我的 GET api 调用了一个向 RDS 调用查询的 Lambda 函数。我可以确认我的回答是陈旧的,因为:
它确实刷新了一次,但我认为那是因为我超过了一些(如 1 小时)缓存阈值或其他什么。
我了解 API Gateway 在幕后生成 CloudFront。我觉得这就是缓存的作用。但这只是猜测,我没有证据。也许某种默认缓存TTL?
我显然在 API Gateway 阶段关闭了缓存。我什至尝试启用它,将 TTL 设置为 1,刷新缓存,然后再次禁用缓存。该测试的每个阶段仍然返回陈旧的值。
我不知道它是否相关,但更多细节:
我是否应该传递一些标头来请求未缓存的值?我去了 CloudFront,但这里没有配置。
API Gateway 缓存上的所有其他帖子似乎都是关于缓存不起作用或人们询问缓存键的特殊性。无论如何,我都没有看到任何关于总是被缓存的值。所以我觉得我错过了一些明显的东西......
任何帮助或调试技巧将不胜感激!
我在我的 Web 应用程序中使用 AWS Cognito 身份验证。我有一个带有 REST API 的 PHP 后端。用户身份验证后,我使用此库向 AWS API Gateway 发出请求。API 网关方法具有 HTTP 集成类型。他们将 HTTP 请求代理到我的 PHP 后端。如何在我的 PHP 后端获取 Cognito Identity Id?我需要在后端设置对 Cognito 用户的关系引用。
我希望为AWS Lambda/zappa使用一些"无服务器api服务器",它使用自定义API网关授权程序进行用户身份验证.在无服务器的AWS lambda服务中,使用自定义授权器而不是直接在代码控制器中检查已发布的JWT令牌是否具有相当大的安全性或成本优势?对我来说,检查代码可能更方便.
更新我去了pre请求钩子,但是有头级别的授权器,它更容易用于CORS,但我认为zappa不支持它.也可以通过swagger上传为Options设置模拟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
我有一个 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 状态。
我将 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)
我究竟做错了什么?
我有一个用于通过 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
aws-api-gateway ×10
aws-lambda ×6
aws-cdk ×2
aws-cognito ×1
aws-elb ×1
boto3 ×1
caching ×1
node.js ×1
proxy ×1
websocket ×1