标签: aws-api-gateway

AWS API Gateway 获取带有“+”号的请求查询参数不起作用

我已经在 API 网关中实现了 GET 请求,并且工作正常,但今天我得到一个名称,其中有“+”符号,所以有人知道.../score?team=name+with+sign在哪里不起作用as ..../score?team-with-dashes工作得很好。请求的内容类型是application/json。

这是身体映射模板(application/json)

{
  "body" : $input.json('$'),
  "headers": {
    #foreach($header in $input.params().header.keySet())
      "$header": "$util.escapeJavaScript($input.params().header.get($header))" #if($foreach.hasNext),#end
    #end
  },
  "method": "$context.httpMethod",
  "params": {
    #foreach($param in $input.params().path.keySet())
      "$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end
    #end
  },
  "query": {
    #foreach($queryParam in $input.params().querystring.keySet())
      "$queryParam": "$util.escapeJavaScript($input.params().querystring.get($queryParam))" #if($foreach.hasNext),#end
    #end
  }  
}
Run Code Online (Sandbox Code Playgroud)

这与 URL 查询字符串参数或其他内容有关吗?

api amazon-web-services aws-api-gateway

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

无服务器 - 服务之间通信的选项?

我有一些不同的服务(由无服务器框架生成)需要相互通信。数据敏感,需要身份验证。

我当前的策略是为每个服务创建一个 api 密钥,使用 json web 令牌在服务之间进行通信,如下所示的令牌。

fM61kaav8l3y_aLC/3ZZF7nlQGyYJsZVpLLiux5d84UnAoHOqLPu4dw3W7MiGwPiyN
Run Code Online (Sandbox Code Playgroud)

服务之间通信还有哪些其他选项?这种方法有什么缺点吗?重申一下,请求需要经过身份验证并适当处理敏感数据。

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

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

AWS Api Gateway 403 错误 - 从所有来源启用 CORS

我创建了一个 lambda 函数,可以通过 API 网关访问该函数。但是,每当发出发布请求时,我都会收到以下错误

在此输入图像描述

当我导航到控制台并查看 API Gateway 时,我有

在此输入图像描述

最后,我的代码(Angular2)确实通过以下方式将适当的标头添加到请求中:

var headers = new HttpHeaders();
headers.append('Content-Type', 'application/json');

this.http.post('https://execute-api.us-east-1.amazonaws.com/prod/LambdaFunction', this.email, { headers: headers })
  .subscribe(data => console.log(data),
    err => console.log(err));
Run Code Online (Sandbox Code Playgroud)

知道如何解决这个问题吗?

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

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

如何根据 Cognito 用户池(或 DynamoDB)中的用户属性实现授权?

我对 AWS 比较陌生,但阅读了大量文档,但找不到我需要的内容。

我正在尝试实现身份验证,用户支付订阅费用,并根据他们是否付费来访问 S3 存储桶和项目。

我尝试将 API Gateway 与 Cognito 授权者一起使用,但我不知道如何在用户已付款时添加检查(例如通过在 DynamoDB 中查找)。有没有办法向 Cognito 授权者添加自定义授权逻辑?如果没有,是否仍可以将 Cognito 用户池与自定义授权者一起使用?最重要的是,你将如何实施整个事情?

我愿意接受建议。

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

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

如何将模板添加到cloudformation中APIgateway的body映射模板(在integrationResponse中)

我正在使用 api 网关,并且在我的集成响应的正文映射模板中,我有:

#set ($errorMessageObj = $util.parseJson($input.path('$.errorMessage')))
#set ($bodyObj = $util.parseJson($input.body))

 {
  "searchObjects":"$input.body",
  "statusCode":"$errorMessageObj.statusCode",
  "message":"$errorMessageObj.message"

 }
Run Code Online (Sandbox Code Playgroud)

现在,在我的代码的 api 网关部分中,我有:

GetMethod:
  Type: AWS::ApiGateway::Method
  DependsOn: APIGatewayToLambdaPermission
  Properties:
    AuthorizationType: NONE
    HttpMethod: GET
    Integration:
      Type: AWS
      IntegrationHttpMethod: POST
      Uri:
        Fn::Join:
        - ''
        - - 'arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/'
          - Fn::ImportValue: !Sub ${project}-${EnvironmentApp}-lambda-es-
            search
          - "/invocations"
      IntegrationResponses:
      - StatusCode: 200
        ResponseParameters:
          method.response.header.Access-Control-Allow-Origin: "'*'"
Run Code Online (Sandbox Code Playgroud)

我不知道如何将其添加到我的云结构中:

    #set ($errorMessageObj = $util.parseJson($input.path('$.errorMessage')))
#set ($bodyObj = $util.parseJson($input.body))

 {
  "searchObjects":"$input.body",
  "statusCode":"$errorMessageObj.statusCode",
  "message":"$errorMessageObj.message"

 }
Run Code Online (Sandbox Code Playgroud)

这是我的 api 网关设置:

在此输入图像描述

任何想法?

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

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

在python AWS lambda函数中访问来自python的json请求

我在 AWS API 网关中有一个 API,使用 lambda 代理集成连接到 python 中的 AWS Lambda 函数。在我的本地计算机上,我正在用 python 测试这个 API。我想向 api 发送字典,并让 api 返回字典中元素的函数。

我用来测试的python代码是:

import requests
import json

url = "https://p68yzl6gu6.execute-api.us-west-1.amazonaws.com/test/helloworld"

headers = {'data': [0,1]}

response = requests.post(url, json=headers)

print(response.text)
Run Code Online (Sandbox Code Playgroud)

由于我无法通过 requests.post 的标头参数发送列表,所以我想我会使用 json。当我尝试这个时,我收到一条 {"message": "Internal server error"}。这是我的 AWS lambda 函数(python):

import json

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': event['data']
    }
Run Code Online (Sandbox Code Playgroud)

查看日志,“数据”不是事件的关键。如何访问 AWS Lambda 函数中的列表?当我测试这个时,如何找出事件字典的样子?展望未来,我想发送一个包含字典和列表的大字典。这是正确的方法吗?

python json python-requests aws-lambda aws-api-gateway

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

AWS API-Gateway 缓存设置在控制台中不可见

按照 AWS 文档Caching在 API-Gateway 中启用API -我在那里找不到任何缓存设置。

似乎我有一个旧版本的控制台,也许吧?

这是我看到的: 在此处输入图片说明

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

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

如何将 API Gateway 指向 CDK 中的 lambda 别名?

使用 CDK 将 ApiGateway 连接到 lambda,我们首先创建一个 RestApi(),然后创建一个 LambdaIntegration 将 Apigateway 连接到 lambda。使用 lambda 别名时如何执行此操作?

如何将 ApiGateway 指向特定的 Lambda 别名解释了如何在没有 CDK 的情况下将 ApiG 连接到 Lambda 别名。如何将其转换为 CDK?

我们的目标是为与 API Gateway 一起使用的 lambda 添加预配置并发和自动缩放。

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

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

Cloudformation 中的 VPC 端点 - 端点类型(网关)与可用服务类型不匹配([接口])

我正在尝试在 Cloudformation 中为 API 网关创建 VPC 端点,但收到此错误:

Endpoint type (Gateway) does not match available service types ([Interface]).
Run Code Online (Sandbox Code Playgroud)

下面的模板放置在资源部分中:

  executeApiEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal: "*"
            Action:
              - "execute-api:Invoke"
              - "execute-api:ManageConnections"
            Resource:
              - "arn:aws:execute-api:*:*:*"
      RouteTableIds:
        - !Ref privateRouteTable
      ServiceName: !Sub com.amazonaws.${AWS::Region}.execute-api
      VpcId: !Ref pubPrivateVPC
Run Code Online (Sandbox Code Playgroud)

这个也不起作用:

  executeApiEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal: "*"
            Action:
              - "execute-api:*"
            Resource:
              - "*"
      RouteTableIds:
        - !Ref privateRouteTable
      ServiceName: !Sub com.amazonaws.${AWS::Region}.execute-api
      VpcId: !Ref pubPrivateVPC
Run Code Online (Sandbox Code Playgroud)

但是,这个块(来自模板)能够在没有任何错误的情况下执行: …

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

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

如何将 API Gateway 的 AWS 签名 v4 预签名链接中的过期时间从默认 5 分钟增加?

我正在尝试生成指向 API 网关(使用 IAM 身份验证)的预签名链接,因此客户端可以访问我在此 API 网关后面的 Lambda 函数之一,而无需对请求进行身份验证。这主要是为了方便客户端,因此它可能会透明地使用响应中的一些链接,无论它们指向同一个经过身份验证的 API 网关、某个 S3 存储桶还是 Internet 中的任意 URL。

为此,我使用查询参数制作 API 签名 v4(请参阅文档示例

因此,如果我尝试签署以下针对us-west-2区域和execute-api服务范围的链接:

https://example.com/some/path?some=params
Run Code Online (Sandbox Code Playgroud)

我将得到以下结果(使用 Node.jsaws4,但在这里无关紧要):

https://example.com/some/path?some=params&
X-Amz-Security-Token=<Session Token Removed>
X-Amz-Date=20210330T180303Z&
X-Amz-Algorithm=AWS4-HMAC-SHA256&
X-Amz-Credential=<Access Key Removed>%2F20210330%2Fus-west-2%2Fexecute-api%2Faws4_request&
X-Amz-SignedHeaders=host&
X-Amz-Signature=884f132ad6f0c7a850e6b1d22b5fed169c13e2189b6e0d0d568d11f967f4a8bd
Run Code Online (Sandbox Code Playgroud)

它有效!但只有在一代后的前 5 分钟......

五分钟过去后,我将收到以下错误响应:

https://example.com/some/path?some=params
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅对此问题的回复

我尝试X-Amz-Expires使用各种值(小于和大于 300 秒)添加文档中提到的查询参数,但没有运气:行为不会改变。

对于由 IAM 实例凭证生成的链接,我至少需要几个小时,最多需要6 个小时,因为链接正在由另一个 Lambda 函数签名。

有没有办法增加 API Gateway 访问的预签名链接有效期?

amazon-web-services pre-signed-url aws-api-gateway sigv4

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