尝试配置nginx以通过解析器代理传递到AWS Lambda

5uzkadbs  于 2023-10-17  发布在  Nginx
关注(0)|答案(1)|浏览(155)

所以我在cloudflare后面设置了一个nginx前端web服务器,我用它来转发请求到后端服务。一切基本上都在工作,但现在我添加了一个Lambda服务,用于身份验证和其他API的签名请求。
然而,一段时间后,对API网关后面的lambda的初始请求失败,HTTP错误代码为499。我能够弄清楚这是由于API网关DNS IP更改,理论上可以用nginx解析器(https://medium.com/driven-by-code/dynamic-dns-resolution-in-nginx-22133c22e3ab)解决。
然而,我试图修复它的任何方法都导致了两个错误情况之一:

  • Auth API不工作或在后端缺少Header参数(我沿着一个API密钥,但被删除)
  • 什么都不工作了(错误的auth API配置也会杀死其他API)

我相信我可能只是遗漏了一个小细节,所以我在这里分享我的代码,希望有人知道遗漏了什么。
这将一直有效,直到AWS更改API网关的IP

server {
    listen 443 ssl;
    server_name auth.mywebsite.com;

    ssl_certificate /etc/nginx/ssl/mywebsite.pem;
    ssl_certificate_key /etc/nginx/ssl/mywebsite.key;

    location / {
        return 301 https://mywebsite.com$request_uri;
    }

    location /v1/ {
        proxy_pass https://{AWS-GATEWAY-ID}.execute-api.us-west-1.amazonaws.com/main/;
        proxy_set_header Host $proxy_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

这会破坏后端的API key Header转发功能:

server {
    listen 443 ssl;
    server_name auth.mywebsite.com;

    ssl_certificate /etc/nginx/ssl/mywebsite.pem;
    ssl_certificate_key /etc/nginx/ssl/mywebsite.key;

    location / {
        return 301 https://mywebsite.com$request_uri;
    }

    location /v1/ {
        resolver 8.8.8.8 valid=30s;
        set $endpoint {AWS-GATEWAY-ID}.execute-api.us-west-1.amazonaws.com;
        
        proxy_pass https://$endpoint/main/;
        proxy_set_header Host $proxy_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

任何帮助真的很感激

ewm0tg9j

ewm0tg9j1#

好吧,我现在可以通过两步方法解决这个问题。
在nginx方面,我最终得到了以下代码:

server {
    listen 443 ssl;
    server_name auth.mywebsite.com;

    ssl_certificate /etc/nginx/ssl/mywebsite.pem;
    ssl_certificate_key /etc/nginx/ssl/mywebsite.key;

    # Use Google's DNS servers for resolution
    resolver 8.8.8.8 8.8.4.4 valid=30s;
    resolver_timeout 10s;

    location / {
        return 301 https://mywebsite.com$request_uri;
    }

    location /v1/ {
        # Make sure to use a variable in the proxy_pass for dynamic resolution
        set $backend {AWS-GATEWAY-ID}.execute-api.us-west-1.amazonaws.com;
        proxy_pass  https://$backend/main$request_uri;
        
        proxy_set_header Host $proxy_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

这允许请求通过Lambda,但有一个限制:
之前的配置直接进行了代理传递,但在一段时间后解析失败,将从作为请求路径发送到lambda的完整URI中删除/v1
新的配置总是包含/v1。在花了大约2个小时试图更改nginx配置,使/v1不是发送到后端的请求路径的一部分后,我放弃了,而是更改了lambda代码,以期望API版本也成为请求的一部分。
上周一切都在预期中。

相关问题