56. [Paimon]Flink读写Nginx代理的OSS上的Paimon表

56.1. 概要

有这样一种场景,在阿里云环境中有一个EMR集群,其存储采用OSS,其上构建了Paimon表,而在公司OA环境有另一套集群,如果想要OA环境的Flink直接读写阿里云环境的Paimon表,需要涉及到网络环境的打通,还可能需要打通防火墙,并且,如果EMR集群动态扩容,还可能涉及到网络策略的更新,较为复杂,维护成本也高。于是,我们内部提出了使用Nginx去代理OSS,即在一台机器上部署Nginx,来自Flink的请求将会被转发到对应的OSS上,只需要开通一台机器的网络和防火墙,维护较为简单。

经过实际测试,此方案可行。

56.2. 部署与配置Nginx

Nginx的配置是本方案的核心。

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    server {
        listen       80;
        server_name  flink-shanghai.company.com;
        location / {
              proxy_pass https://oss-test-ai.oss-cn-shanghai-internal.aliyuncs.com; 
              proxy_set_header Authorization $http_authorization;
              proxy_pass_request_headers on;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_connect_timeout 1000s;
              proxy_send_timeout 300s;
              proxy_read_timeout 300s;
        }

    }

}

在上述配置中,proxy_set_header Authorization $http_authorization;表示将请求头原封不动转发至服务端,没有声明该配置时,我们遇到了如下错误:

SignatureFailed

验签失败,打开上面最后给到的地址定位原因

使用API接口或者SDK访问OSS时,客户端需要携带签名信息以供OSS服务端进行身份认证。如果服务器返回如上所示的响应,说明您在请求中提供的签名与服务端计算的不一致,导致请求被拒绝。

如果业务场景允许,推荐您使用SDK访问OSS,免去手动计算签名的过程。具体步骤,请参见使用阿里云SDK发起请求

这里提到用SDK访问,可是我们目前就是使用SDK的,怎么还会验签失败?

这里推测,如果不使用SDK,需要自己根据特定方法生成前面,包含在请求头中,一并提交请求,如果使用SDK则会自动计算这个签名。那么还是不行的原因,一定是nginx没有转发过去,所以在上述的nginx配置中加入了proxy_set_header Authorization $http_authorization;,随后在本地环境成功提交了FlinkSQL