【问题标题】:AWS Gateway API, setup a lambda as a proxyAWS Gateway API,将 lambda 设置为代理
【发布时间】:2021-08-14 20:09:05
【问题描述】:

在 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 日志中没有任何条目。

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

【问题讨论】:

    标签: amazon-web-services aws-lambda proxy aws-api-gateway


    【解决方案1】:

    您正在尝试将 API 网关用作 HTTP 代理,这就是您收到“403 Forbidden error”的原因。

    您可以通过在 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 代理。

    【讨论】:

    • 谢谢,这很有意义。
    猜你喜欢
    • 1970-01-01
    • 2018-01-11
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 2018-01-27
    • 2017-10-04
    相关资源
    最近更新 更多