AWS Gateway API,设置一个 lambda 作为代理

问题描述

在 AWS 中,我在没有在线访问的 VPC 中有一个带有私有 IP 的 EC2。
我按照此处的说明将私有 VPC 端点连接到网关 API:How to create a VPC endpoint for API Gateway

现在,我可以向 Lambda 发送请求了:
curl -i "https://xxxxx-vpce-xxxxxx.execute-api.us-east-1.amazonaws.com/Test/"

现在,无论请求如何,我的 lambda 都只返回一条消息:

def lambda_handler(event,context):
    print(event,context)
 
    return {
        'statusCode': 200,'body': json.dumps('Hello from Lambda!')
    } 

我想让 lambda 充当出站代理,以便在我运行时:
curl -i --proxy "https://xxxxx-vpce-xxxxxx.execute-api.us-east-1.amazonaws.com/Test/" https://google.com
我得到了 https://google.com

内容

我的计划是运行最后一个 curl 命令,打印事件/内容并弄清楚可以做什么。
但是当我运行它时,我收到 403 Forbidden 错误,网关 API 日志中没有任何条目。

我不确定我正在尝试做的事情是否可行。但这就是我试图确定的。如果可能,我该怎么做?

解决方法

您正尝试将 API Gateway 用作 HTTP 代理,这就是您收到“403 禁止错误”的原因。

您可以在 curl 中使用 --trace-ascii 选项查看发生了什么。

使用这个命令:

curl -i --trace-ascii - --proxy "https://xxxxx-vpce-xxxxxx.execute-api.us-east-1.amazonaws.com/Test/" https://google.com

您将在日志中看到类似这样的内容:

=> Send header,112 bytes (0x70)
0000: CONNECT google.com:443 HTTP/1.1
0021: Host: xxxxx-vpce-xxxxxx.execute-api.us-east-1.amazonaws.com:443
00XX: User-Agent: curl/7.71.1
00XX: Proxy-Connection: Keep-Alive

基本上,curl 向 api-gateway 发出 HTTP CONNECT 动词,而不是 POST 或 GET 或 PUT 或 DELETE,API-Gateway 阻止 CONNECT 动词,因此出现 403 错误。

您尝试做的是使用 API-Gateway 作为 HTTPS 代理,这在设计上是被阻止的。调用甚至不会到达您的 lambda,它会在 API-Gateway 被拒绝。

您可以使用 lambda + API-Gateway 组合设计“高级”代理,但我非常怀疑您是否能够像您尝试的那样使用 API-Gateway 制作 HTTPS 代理。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...