我想使用 AWS API Gateway 作为我的后端的单个入口点,它将根据 URL 前缀将请求代理(重定向)到不同的微服务。然而,在进行代理之前,最好有 lambda,它可以检查请求并做出决定是否允许进行代理,或者最好立即做出响应,所以,换句话说,我希望将 AWS lambda 作为中间件。可以做吗?
我目前陷入了请求直通的困境。我需要使用步骤函数管道处理来自标头和请求正文的信息。我正在使用 REST API 网关,该网关在集成请求中具有以下映射模板
#set($data = $util.escapeJavaScript($input.json('$')))
{
"input": "{ \"input\": $data, \"stageVariables\" : { #foreach($key in $stageVariables.keySet()) \"$key\" : \"$util.escapeJavaScript($stageVariables.get($key))\" #if($foreach.hasNext),#end #end } }",
"stateMachineArn": "arn:aws:states:eu-west-1:xxxxxxxxxxxx:stateMachine:StateMachine-1"
}
Run Code Online (Sandbox Code Playgroud)
但这是行不通的。如果我使用 lambda 事件访问标头,它将是 event['headers']['Authorization'] 但我仅将请求正文作为步骤函数的输入。
当我将数据流模拟器用于整个请求,然后将 JsonPath 放入我的状态机模板中时,它仍然没有为我提供标头和正文作为输入。
有人可以帮我吗?
我是 AWS API Gateway 领域的新手,我正在尝试限制用户组对我的 API 的访问。为了澄清我已经可以运行经过身份验证的 API,问题在于授权(将一组用户限制为 API-1,将另一组用户限制为 API-2)。我正在使用 HTTP-API,我不想使用其他 API(以节省成本)。
我创建了一个 Cognito 用户池,并创建了两个名为“常规”和“管理员”的组。我还设置了一个应用程序客户端。
接下来,我有两个 API 路由,它们映射到两个不同的 Lambda 函数(只是 hello world)。这些可以在没有身份验证的情况下完美地工作,也可以在有身份验证的情况下完美地工作。我将 JWT-auth 与 Cognito 结合使用,出于多种原因,这是适合我的应用程序的正确方法。
问题是如何限制相关用户组对 API 的访问。因此,只有 admin-group 中的用户才能使用 admin-api。我相信红色部分可以提供帮助,但我似乎找不到正确的文档。我读到我还可以创建一个 lambda 函数来授权用户,但这似乎是一种浪费,如果可以在此处应用限制,为什么还要花钱购买另一个 lambda 函数。
将不胜感激任何帮助。
我有一个使用 API Gateway 调用的 lambda 函数。该函数通过以下代码使用 GET 方法来工作:
func handleRequest(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
// add code here
return events.APIGatewayProxyResponse{Body: request.Body, StatusCode: 200}, nil
}
func main() {
lambda.Start(handleRequest)
}
Run Code Online (Sandbox Code Playgroud)
我有这个event.APIGatewayProxyRequest和GET方法。但是当我尝试将 URL 迁移到Function URLs时,我没有类似的设置GET方法。URL 如何知道在 POSTMAN 中使用哪种方法?和...
我们有等效的方法来event.APIGatewayProxyRequest完成该请求吗?
当我使用 URL 调用它时,出现502 BAD GATEWAY错误。
我正在尝试使用curl来自假定角色的临时凭据向 API Gateway 发出 SIGv4 签名请求。我使用 进行此工作awscurl,它提供了传递(会话令牌)的选项--security_token。
awscurl --service execute-api -X POST -d '{}' https://aaaaaaaa.execute-api.eu-west-1.amazonaws.com/endpoint --region eu-west-1 --access_key ${AWS_ACCESS_KEY_ID} --secret_key ${AWS_SECRET_KEY} --security_token "${SESSION_TOKEN}"
{"response":{}}
Run Code Online (Sandbox Code Playgroud)
但我无法使用标准使相同的请求成功curl:
curl --aws-sigv4 "aws:amz:eu-west-1:execute-api" --user '${AWS_ACCESS_KEY_ID}:${AWS_SECRET_KEY}' -XPOST https://aaaaaaaa.execute-api.eu-west-1.amazonaws.com/endpoint -d'{}'
{"message":"Forbidden"}
Run Code Online (Sandbox Code Playgroud)
有谁知道如何使用传递会话令牌curl?
有一个简单的 aws lambda(.mjs 文件)。有一个简单的 API 网关,使用代理集成。有一个简单的网络表单,
<form method="post" action="...">
<input type="text" name="team">
<input type="text" name="score">
<input type="submit" value="send">
Run Code Online (Sandbox Code Playgroud)
在您的 lambda 中,“事件”捕获从网关发送的整个信息块
export const handler = async (event, context) => {
...
Run Code Online (Sandbox Code Playgroud)
例如,您将在这里找到 queryStringParameters,
查询字符串参数:{示例:'值'},
标题在这里
headers: {
accept: '*/*',
...
Run Code Online (Sandbox Code Playgroud)
等等。问题的实质内容被标记为“正文”
body: 'team=sec+west&score=42',
Run Code Online (Sandbox Code Playgroud)
实际例子!
据我所知(似乎完全没有记录)html 表单参数作为 url 查询字符串样式的字符串传递。
因此,我总是这样简单地解析它们......
import querystring from 'querystring'
...
if (event.body) {
console.log('here is the "body" ...')
console.log(event.body)
let parsed = querystring.decode(event.body)
team = parsed.team
Run Code Online (Sandbox Code Playgroud)
请注意,这个问题严格来说仅与使用代理集成网关有关。(当然,您不能使用代理集成,而是以您想要的任何方式映射它。)
另请注意,这是关于使用 …
我有一个POST API网关方法,我将向其中发送以下application / json主体,以将参数从其传递到该方法所连接的Lambda:
{
"otherClientId": "12345",
"message": "Text",
"seconds": 0,
"hours": 0
}
Run Code Online (Sandbox Code Playgroud)
我正在使用以下映射模板:
#set($inputRoot = $input.path('$'))
{
"authorizedUser": "$context.authorizer.principalId",
"otherClientId": "$inputRoot.otherClientId",
"message": "$inputRoot.message",
"amount": $inputRoot.amount,
"duration": $inputRoot.duration
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,我尝试发送没有数量或持续时间的请求时收到“错误字符串”错误。由于某些原因,这些参数似乎不是可选的(但我需要将它们设为!)。我能够错过其他参数,例如消息,但不能错过两个数字参数。
有人遇到过这种情况吗?或者有人可以指出我很可能会失踪的明显现象吗?AWS文档对此主题很少。
post http-post amazon-web-services aws-lambda aws-api-gateway
似乎微不足道,但我无法使其正常工作:我将编码为JSON对象的数据发送到调用Firehose的API Gateway。S3中的结果文件在一行中包含所有JSON对象。我读过应该可以添加换行符,但是无论我尝试什么,都可能有错误或者根本不执行任何操作。映射模板如下所示
{
"DeliveryStreamName": "file-datadump",
"Record": {
"Data": "$util.base64Encode($input.json('$'))"
}
}
Run Code Online (Sandbox Code Playgroud)
有什么想法怎么办?
我正在使用无服务器框架使用S3,Lambda和API网关创建图像大小调整服务。这与此处的概念相似,但是将使用Serverless来设置和配置整个堆栈。
现在,我需要找到一种体面的方法来引用serverless.yml文件中生成的API网关的主机名。这就是我所拥有的资源。(只是一个片段)
imageBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: ${env:IMAGE_BUCKET}
WebsiteConfiguration:
RoutingRules:
-
RedirectRule:
Hostname: ${HOSTNAME HERE}
HttpRedirectCode: 302
RoutingRuleCondition:
HttpErrorCodeReturnedEquals: 404
Run Code Online (Sandbox Code Playgroud)
$ {HOSTNAME HERE}的显示位置,我需要为无服务器框架生成的API Gateway API的主机名。
现在,我能想到的最好的方法是在某个地方创建一个CNAME别名,并在我的API前面使用它。然后,我将该CNAME作为环境变量传递,然后在此文件中引用它。不过这对我来说并不理想。我希望有人能够将这个项目拉下来,并能够仅使用存储桶名称来运行它。反正有做到这一点吗?
amazon-web-services aws-cloudformation aws-api-gateway serverless-framework serverless-architecture
我正在尝试部署lambda函数和API网关。我使用AWS CLI创建一个.net核心Web API项目。在AWS Web控制台上仅部署功能并手动创建API网关和资源即可。
如果我确实将API网关包括在模板中,则在通过Web控制台或CLI进行SAM包部署后,出现以下错误:
“没有为方法定义任何集成(服务:AmazonApiGateway;状态代码:400;错误代码:BadRequestException;请求ID:...。)”
这里有什么问题或遗漏吗?
SAM软件包命令:
sam package --template-file sam-profile.yaml --output-template-file serverless-output.yaml --s3-bucket testapp-fewtfvdy-lambda-deployments
Run Code Online (Sandbox Code Playgroud)
SAM模板:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
ProfileFunction:
Type: AWS::Serverless::Function
Properties:
Handler: testapp.Profile.NetCoreVS::testapp.Profile.NetCoreVS.LambdaEntryPoint::FunctionHandlerAsync
Runtime: dotnetcore2.0
MemorySize : 128
Timeout : 5
CodeUri: bin/Release/netcoreapp2.0/publish
Events:
ProfileAny:
Type: Api
Properties:
RestApiId: !Ref ProfileApiGateway
Path: /profile/v1
Method: GET
ProfileApiGateway:
DependsOn: ProfileFunction
Type: 'AWS::Serverless::Api'
Properties:
StageName: Prod
DefinitionUri: './swagger.yaml'
Run Code Online (Sandbox Code Playgroud)
swagger.yaml:
---
swagger: '2.0'
info:
version: v1
title: ProfileAPI
paths:
"/profile/v1":
get:
tags:
- Values
operationId: ProfileV1Get
consumes: []
produces: …Run Code Online (Sandbox Code Playgroud) aws-cloudformation aws-lambda aws-api-gateway aws-serverless