我正在使用 AWS HTTP API Gateway 将请求路由到 VPC 中的集成。
我添加了一个自定义域,我想通过以下方式根据路径将我的请求路由到我的集成
基本上,传入 API 网关的所有请求都应根据基本路径路由到不同的集成,但集成应仅接收基本路径之后的路径。因此,到达 my.custom.domain/foo/<path1>/<path2>/<path3> 的所有请求都应路由到集成Foo,但网关应剥离基本路径(即 /foo)并将其余部分转发到集成。
其功能与 nginx 中的以下功能相同,其中 nginx 从请求路径中剥离 foo 并将其余部分转发到服务
location /foo/ {
proxy_pass http://foo.service
}
Run Code Online (Sandbox Code Playgroud)
我尝试在 AWS API 网关中添加自定义域和 API 映射,但这不起作用。我的服务仍然收到请求的整个路径,因此失败。我在互联网上找不到任何有关此的文档或提及。
目前,我使用以下内容为 RestApi 键入 lambda 函数:
import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda';
export const handler = async (event: APIGatewayProxyEvent): Promise<APIGatewayProxyResult> => {}
Run Code Online (Sandbox Code Playgroud)
这不适用于新的 AWS Gateway HTTP API,其中可以使用event.requestContext.http.method.
我应该使用其他类型吗?
我有一个使用无服务器框架创建的 HTTPApi API 网关。但对于某些路线,CORS 不起作用。
provider:
name: aws
runtime: nodejs12.x
stage: dev
region: us-west-2
timeout: 29
httpApi:
cors:
allowedOrigins:
- '*'
allowedMethods:
- GET
- OPTIONS
- POST
- PUT
- DELETE
allowedHeaders:
- Content-Type
- X-Amz-Date
- Authorization
- X-Api-Key
- X-Amz-Security-Token
- X-Amz-User-Agent
- X-Transaction-Key
- Access-Control-Allow-Origin
Run Code Online (Sandbox Code Playgroud)
我尝试cors:true在提供商上设置该选项,但仍然不起作用。这是所有路由返回的响应,无论是 4xx 还是 2xx 代码。
return {
statusCode: StatusCode,
headers: {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Credentials" : true,
"Access-Control-Allow-Headers" : "*",
"Access-Control-Allow-Methods": "OPTIONS,POST,GET,PUT,DELETE"
},
body: JSON.stringify(Res, null, 2),
}; …Run Code Online (Sandbox Code Playgroud) aws-lambda aws-api-gateway serverless-framework aws-http-api
发生错误:HttpApiRoutePostv1Banks - 提供的路由密钥格式不适合 HTTP 协议。格式应为“[HTTP METHOD] /[RESOURCE PATH]”或“$default”(服务:AmazonApiGatewayV2;状态代码:400;错误代码:BadRequestException;请求 ID:38370b30-9c11-4a66-9f2d-710fd2c25329;代理:null )。
provider:
...
httpApi:
payload: '2.0' # Define Http format needed for API GW
...
functions:
banksCreate:
handler: src/banks.create
events:
- httpApi: 'POST v1/banks'
Run Code Online (Sandbox Code Playgroud)
我已经根据官方文档设置了 serverless.yml 文件
当我离线运行无服务器时,一切正常,但是当我尝试部署时,会出现上述错误。
我不知道我哪里出错了?
请注意, restApi事件部署正常
我开始考虑使用 AWS HTTP API 作为使用 ECS 运行的一些微服务的单点入口。
一个微服务在服务器内部有以下路由:
/sessions/{session_id}/topics
Run Code Online (Sandbox Code Playgroud)
我在 HTTP API 中定义了完全相同的路由,并使用 CloudMap 和 VPC 链接来访问我的 ECS 集群。到目前为止一切顺利,请求可以到达服务器。然而,到达时的路径并不相同。根据 AWS 文档 [1],它将在前面添加阶段名称,以便请求到达时如下所示:
/{stage_name}/sessions/{session_id}/topics
Run Code Online (Sandbox Code Playgroud)
所以我开始研究参数映射,以便我可以更改集成的路径,但我无法让它工作。
对于 requestParameters,我想覆盖如下所示的路径,但由于某种原因,带有阶段变量的原始路径仍然存在。如果我只是将 overwrite:path 定义为 $request.path.sessionId,我只会得到 ID 作为路径,或者如果我写了我想要的任何字符串,它就会按照我的定义到达。但是当我混合 $request.path.sessionId 和字符串的其他部分时,它似乎不起作用。
我如何正确格式化它?
paths:
/sessions/{sessionId}/topics:
post:
responses:
default:
description: "Default response for POST /sessions/{sessionId}/topics"
x-amazon-apigateway-integration:
requestParameters:
overwrite:path: "/sessions/$request.path.sessionId/topics"
payloadFormatVersion: "1.0"
connectionId: (removed)
type: "http_proxy"
httpMethod: "POST"
uri: (removed)
connectionType: "VPC_LINK"
timeoutInMillis: 30000
Run Code Online (Sandbox Code Playgroud)
我有一个Type: AWS::Serverless::HttpApi正在尝试连接到 aType: AWS::Serverless::StateMachine作为触发器。这意味着 HTTP API 将触发 Step Function 状态机。
我只需指定一个输入就可以让它工作。例如,DefinitionBody当它工作时,看起来像这样:
DefinitionBody:
info:
version: '1.0'
title:
Ref: AWS::StackName
paths:
"/github/secret":
post:
responses:
default:
description: "Default response for POST /"
x-amazon-apigateway-integration:
integrationSubtype: "StepFunctions-StartExecution"
credentials:
Fn::GetAtt: [StepFunctionsApiRole, Arn]
requestParameters:
Input: $request.body
StateMachineArn: !Ref SecretScannerStateMachine
payloadFormatVersion: "1.0"
type: "aws_proxy"
connectionType: "INTERNET"
timeoutInMillis: 30000
openapi: 3.0.1
x-amazon-apigateway-importexport-version: "1.0"
Run Code Online (Sandbox Code Playgroud)
请注意以下行:Input: $request.body。我只是指定$request.body.
但是,我需要能够发送$request.body和$request.header.X-Hub-Signature-256。我需要将这两个值作为输入发送到我的状态机。
我尝试过很多不同的方法。例如:
Input: " { body: $request.body, header: $request.header.X-Hub-Signature-256 }" …Run Code Online (Sandbox Code Playgroud) amazon-web-services aws-lambda aws-api-gateway aws-step-functions aws-http-api
使用 AWS Direct Connect,我们在本地和 AWS VPC 之间构建了一个网络。我们开发了一个 Web 应用程序,用户可以从本地网络内访问该应用程序。我们使用 HTTP API 网关,它使用 VPC 链接连接到私有 ALB。我们将自定义域名与 HTTP API 网关结合使用并禁用了默认端点。该域名在 Route 53 上的私有托管区域中注册。
我们希望将客户端和 API 网关之间的所有流量保留在我们的专用网络内。但是,我们可以看到发送到 HTTP API 网关的请求离开了我们的网络,因为 API 网关的自定义域名解析为公共 IP 地址。
有没有办法为 HTTP API 网关分配私有 IP 地址?或者有什么其他方法可以保持我们网络内的流量?
一种选择是切换到 REST API 网关并将其端点类型设为私有。然而,HTTP API 网关以其简单性更适合我们的需求。它还可以选择使用 VPC Link 连接到 ALB,这是 REST 网关所缺乏的。
amazon-web-services amazon-vpc aws-api-gateway aws-http-api aws-rest-api
我使用 a 创建了一个应用程序AWS::SERVERLESS::FUNCTION,其中附加了一个 HttpApi 事件。我认为为每个资源创建一个 lambda 是一个好主意,因此例如 Post、Get 和 Put on /customer 都由单个 lambda 处理,该 lambda 决定使用
switch (input.getHttpMethod()) {
case "GET": ...
case "POST: ...
}
Run Code Online (Sandbox Code Playgroud)
现在来解决我的问题:当使用sam local start-api我的 lambda 启动应用程序时,它被正确调用,但既没有input.getHttpMethod()设置也没有input.getRequestContext().getHttpMethod()设置。
鉴于 SAM 支持多个 HttpApi 事件,在本地运行应用程序时未能提供 http 方法实际上会完全减轻本地开发的负担。是我做错了什么,还是这真的不起作用?顺便说一句,我使用的是 Java,我无法判断使用其他语言是否也存在这个问题。
以防万一:我的“每个资源一个 lambda”方法是否错误,每个操作都应该有自己的 lambda 吗?
使用 REST API(AWS API Gateway v1),我们可以X-API-Key在请求中使用标头并维护 API 密钥来控制对给定端点的访问。
在 AWS 中,如果我转到 API Gateway 并选择 REST API (v1),则在资源下我会看到:API Key Required在 API 密钥下我可以找到我的密钥。
使用serverless它可以像这样配置:
provider:
apiKeys:
- my-api-key
functions:
hello:
handler: handler.hello
events:
- http:
path: /hello
method: get
private: true
Run Code Online (Sandbox Code Playgroud)
但如果我切换到httpApi然后我得到:
Configuration warning at 'functions.hello.events[0].httpApi': unrecognized property 'private'
Run Code Online (Sandbox Code Playgroud)
此外,在 API Gateway 中,在 HTTP API (v2) 下,任何地方都没有 API 密钥。
当我检查文档时,REST API 下有很大一部分关于 API 密钥:https: //www.serverless.com/framework/docs/providers/aws/events/apigateway 但 API Gateway HTTP API 没有任何关于 API 密钥的内容: https: …
rest amazon-web-services aws-api-gateway serverless aws-http-api
aws-http-api ×9
aws-lambda ×5
amazon-vpc ×1
aws-rest-api ×1
proxy ×1
rest ×1
sam ×1
serverless ×1