标签: aws-api-gateway

使用 AWS Lambda 作为中间件的 AWS API Gateway 代理

我想使用 AWS API Gateway 作为我的后端的单个入口点,它将根据 URL 前缀将请求代理(重定向)到不同的微服务。然而,在进行代理之前,最好有 lambda,它可以检查请求并做出决定是否允许进行代理,或者最好立即做出响应,所以,换句话说,我希望将 AWS lambda 作为中间件。可以做吗?

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

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

有没有办法将请求的标头和正文传递到 aws 步骤函数管道?

我目前陷入了请求直通的困境。我需要使用步骤函数管道处理来自标头和请求正文的信息。我正在使用 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 放入我的状态机模板中时,它仍然没有为我提供标头和正文作为输入。

有人可以帮我吗?

json amazon-web-services aws-api-gateway aws-step-functions

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

AWS API Gateway:授权 Cognito 用户组

我是 AWS API Gateway 领域的新手,我正在尝试限制用户组对我的 API 的访问。为了澄清我已经可以运行经过身份验证的 API,问题在于授权(将一组用户限制为 API-1,将另一组用户限制为 API-2)。我正在使用 HTTP-API,我不想使用其他 API(以节省成本)。

我创建了一个 Cognito 用户池,并创建了两个名为“常规”和“管理员”的组。我还设置了一个应用程序客户端。

用户池

接下来,我有两个 API 路由,它们映射到两个不同的 Lambda 函数(只是 hello world)。这些可以在没有身份验证的情况下完美地工作,也可以在有身份验证的情况下完美地工作。我将 JWT-auth 与 Cognito 结合使用,出于多种原因,这是适合我的应用程序的正确方法。

API认证

问题是如何限制相关用户组对 API 的访问。因此,只有 admin-group 中的用户才能使用 admin-api。我相信红色部分可以提供帮助,但我似乎找不到正确的文档。我读到我还可以创建一个 lambda 函数来授权用户,但这似乎是一种浪费,如果可以在此处应用限制,为什么还要花钱购买另一个 lambda 函数。

授权用户

将不胜感激任何帮助。

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

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

Go中没有API网关的AWS lambda函数URL

我有一个使用 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.APIGatewayProxyRequestGET方法。但是当我尝试将 URL 迁移到Function URLs时,我没有类似的设置GET方法。URL 如何知道在 POSTMAN 中使用哪种方法?和...

我们有等效的方法来event.APIGatewayProxyRequest完成该请求吗?

当我使用 URL 调用它时,出现502 BAD GATEWAY错误。

go amazon-web-services aws-lambda aws-api-gateway

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

使用临时凭证通过curl 签署AWS SIGv4 请求

我正在尝试使用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

curl amazon-web-services aws-api-gateway

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

在 aws 代理集成 js lambda 中,是否有正确或标准的方法从 event.body 获取 html 表单值,而不仅仅是使用查询字符串?

有一个简单的 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)

请注意,这个问题严格来说仅与使用代理集成网关有关。(当然,您不能使用代理集成,而是以您想要的任何方式映射它。)

另请注意,这是关于使用 …

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

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

API网关-主体映射模板-可选主体参数

我有一个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

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

如何在映射模板中添加换行符

似乎微不足道,但我无法使其正常工作:我将编码为JSON对象的数据发送到调用Firehose的API Gateway。S3中的结果文件在一行中包含所有JSON对象。我读过应该可以添加换行符,但是无论我尝试什么,都可能有错误或者根本不执行任何操作。映射模板如下所示

{
    "DeliveryStreamName": "file-datadump",
    "Record": { 
    "Data": "$util.base64Encode($input.json('$'))"
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么想法怎么办?

aws-api-gateway amazon-kinesis-firehose

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

在serverless.yml文件中引用AWS API Gateway的主机名以获取其他CloudFormation资源吗?

我正在使用无服务器框架使用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

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

AWS SAM模板/ cloudformation没有为方法定义集成(服务:AmazonApiGateway

我正在尝试部署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

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