我有一个带有 AWS API Gateway 和 Lambda 函数的无服务器 API。我正在使用自定义授权功能进行授权。标题太大,因此我收到此错误。通常,对于 nginx 服务器,我会更改 nging 配置,这将得到修复。我不知道如何在 AWS API Gateway 中处理这个问题。
我们在 AWS 中拥有 dockerized 微服务,所有这些都在 API 网关之后并可通过 REST 访问。身份验证由 API 网关管理。
有没有可能在本地机器上测试那些 REST 微服务(包括身份验证/api 网关逻辑)?是否有可能让 API Gateway 将请求回显到我的本地机器并调用本地运行的微服务?在本地测试 API Gateway 托管身份验证的最佳实践是什么?
谢谢!
我最近熟悉了 AWS 最奇特的 API 网关映射模板语法,这对我来说并没有多大意义。
我想做的很简单。我在JSON请求主体,而我想增加额外的现场timeReceived与$context.requestTime作为其值。我天真的第一次尝试是#set( $bodyObj.timeReceived = $context.requestTime )行不通的。
我很肯定我会让它工作,但是做这样简单的事情需要时间和精力,IMO 很愚蠢,AWS 应该改进现有的文档。
编辑:我在下面写的解决方案有效,但我主张重新考虑使用 API Gateway。我最近更新了我的应用程序,改为使用 edge lambda 和 CloudFront,这在各方面都是一个更好的解决方案。一些棘手的 lambda 配置无法使用环境变量,因此将 DeliveryStreamName 自动化到代码有点问题(我最终使用带有 Sceptre 的自定义解析器)。但还是好多了。不需要这些愚蠢的黑客 =)。
首先,有人可能会说这个问题与HTTP request body not getting to AWS lambda function via AWS API Gateway或Getting json body in aws Lambda via API gateway非常相似
但是,这些问题都没有解决使用 Golang 的问题,我遇到的问题是找到event与 Node.js 文档中随处使用的参数等效的参数。
这是我的 Lambda 函数:
package main
import (
"context"
"encoding/json"
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-lambda-go/events"
"log"
)
type MyReturn struct {
Response string `json:"response"`
}
type APIGWResponse struct {
IsBase64Encoded bool `json:"isBase64Encoded"`
StatusCode int `json:"statusCode"`
Headers map[string]string `json:"headers"`
Body string `json:"body"`
}
func handle(ctx context.Context, name MyReturn) (APIGWResponse, error) {
log.Print("Called by …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 AWS CDK 构建应用程序,如果我要使用 AWS 控制台手动构建应用程序,我通常会在 API 网关中启用 CORS。
尽管我可以从 API Gateway 中导出 swagger 并找到了许多选项来为 OPTIONS 方法生成 Mock 端点,但我不知道如何使用 CDK 来做到这一点。目前我正在尝试:
const apigw = require('@aws-cdk/aws-apigateway');
Run Code Online (Sandbox Code Playgroud)
在哪里:
var api = new apigw.RestApi(this, 'testApi');
Run Code Online (Sandbox Code Playgroud)
并定义 OPTIONS 方法,如:
const testResource = api.root.addResource('testresource');
var mock = new apigw.MockIntegration({
type: "Mock",
methodResponses: [
{
statusCode: "200",
responseParameters : {
"Access-Control-Allow-Headers" : "string",
"Access-Control-Allow-Methods" : "string",
"Access-Control-Allow-Origin" : "string"
}
}
],
integrationResponses: [
{
statusCode: "200",
responseParameters: {
"Access-Control-Allow-Headers" : "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'",
"Access-Control-Allow-Origin" : "'*'",
"Access-Control-Allow-Methods" …Run Code Online (Sandbox Code Playgroud) 我使用 AWS api 网关创建了一个 API,其中包含一个模拟端点/test。
在我的回复中,我得到了标题x-amzn-RequestId和x-amz-apigw-id. 如果出现错误,例如使用不存在的端点/test2,我也会得到x-amazn-ErrorType标头。
我不希望这些 aws 标头出现在我的 api 响应中。如何去除这些?
我有一个 API 网关,其端点由 AWS Lambda 代理集成实现。我还为此端点配置了自定义授权方。我看到一个问题,我向该端点发出的第一个请求成功,但其他调用将失败;我收到一个 403 - 禁止的错误。如果我等待一段时间,我可以提出另一个成功的请求,但随后我开始看到同样的问题。
这是我的授权人代码:
const jwt = require('jsonwebtoken');
exports.authorizer = async function (event, context) {
const bearerToken = event.authorizationToken.slice(7);
const { payload } = jwt.decode(bearerToken);
return {
principalId: payload.sub,
policyDocument: {
Version: '2012-10-17',
Statement: [{
Action: 'execute-api:Invoke',
Effect: 'Allow',
Resource: event.methodArn,
}],
},
};
};
Run Code Online (Sandbox Code Playgroud)
在此端点的 API 网关日志中,我可以看到授权方正在返回,Allow但我仍然可以看到授权失败:
(50ac5f87-e152-4933-a797-63d84a528f61) 客户端无权执行此操作。
有谁知道这会如何或为什么会发生?
javascript amazon-web-services node.js aws-lambda aws-api-gateway
我有以下 terraform 脚本,它创建一个 API 网关,将请求传递给 lambda 函数。
provider "aws" {
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
#
region = "${var.region}"
version = "~> 2.6"
}
resource "aws_api_gateway_rest_api" "MyDemoAPI" {
name = "MyDemoAPI"
description = "This is my API for demonstration purposes"
}
resource "aws_api_gateway_resource" "MyDemoResource" {
rest_api_id = "${aws_api_gateway_rest_api.MyDemoAPI.id}"
parent_id = "${aws_api_gateway_rest_api.MyDemoAPI.root_resource_id}"
path_part = "mydemoresource"
}
resource "aws_api_gateway_method" "MyDemoMethod" {
rest_api_id = "${aws_api_gateway_rest_api.MyDemoAPI.id}"
resource_id = "${aws_api_gateway_resource.MyDemoResource.id}"
http_method = "POST"
authorization = "NONE"
}
resource "aws_api_gateway_integration" "MyDemoIntegration" {
rest_api_id = "${aws_api_gateway_rest_api.MyDemoAPI.id}" …Run Code Online (Sandbox Code Playgroud) 无法让 API Gateway 与私有 VPC 链接(在网络负载均衡器后面到 Fargate 容器)容器一起使用
大家好,过去三天我一直在努力让它发挥作用。我的目标是设置一个 POST 方法,该方法重定向到运行 Go 容器的私有 VPC。我在线查看了一些指南并尝试了其中的大部分。为了这个实验,我复制了我们的容器在单个网络负载均衡器后面运行,创建了一个 VPC 链接并设置了 API 方法来使用它,但是当我测试它时,我得到的只是一个非常无用的 500内部服务器错误。我查看了我的 CloudWatch 日志,我很确定容器没有被击中。任何帮助都会很棒,让我知道我需要提供什么,以便我可以提供帮助。
谢谢!
这是我在测试方法时从 API Gateway 得到的:
Thu Aug 22 23:27:10 UTC 2019 : Endpoint request body after transformations: { "userId": <omitted>, ... }
Thu Aug 22 23:27:10 UTC 2019 : Sending request to http://<network load balancer DNS>:<port my code listens to>/api/someApi
Thu Aug 22 23:27:20 UTC 2019 : Execution failed due to configuration error: There was an internal error while …Run Code Online (Sandbox Code Playgroud) amazon-web-services amazon-ecs amazon-elb aws-api-gateway aws-fargate
关于 API 网关使用计划的 AWS 文档都暗示它们是使用/附加到 API 密钥创建的,但没有说明如果没有 API 密钥它将如何运行。我有一个未经授权的 API,我想对其应用限制。我可以创建使用计划,将其附加到资源,而不将 API 密钥与其关联吗?它会起作用吗?
上下文:我正在尝试使用 CloudFormation 的 Java SDK 来定义堆栈,但我无法弄清楚如何以编程方式指定特定于资源的节流阀。我还将接受一个答案,该答案告诉我如何在不使用控制台的情况下执行此操作。
throttling amazon-web-services aws-cloudformation aws-api-gateway aws-cdk
aws-api-gateway ×10
aws-lambda ×3
aws-cdk ×2
amazon-ecs ×1
amazon-elb ×1
api ×1
aws-fargate ×1
go ×1
javascript ×1
node.js ×1
terraform ×1
throttling ×1