amazon-web-services - 使用 Ingress 的 Kubernetes 上的 s3 代理

标签 amazon-web-services nginx amazon-s3 kubernetes

我正在使用 this ingress controller并想为某个存储桶设置一个 s3 代理。如果我在浏览器中调用 url

https://my-kube-server.org/img/dog.jpg 

我希望看到/下载图像
https://s3.eu-central-1.amazonaws.com/mybucket123/pictures/dog.jpg

我可以设置重写规则并指向外部服务,如 this example 中所述。 :
kind: Service
apiVersion: v1
metadata:
  name: s3-proxy
spec:
  type: ExternalName
  externalName: s3.eu-central-1.amazonaws.com
  headers:
  - host: s3.eu-central-1.amazonaws.com

但是我从 aws 收到错误,因为标题中需要有“Host:s3.eu-central-1.amazonaws.com”。我无法在 s3-proxy 服务定义和入口规则中设置此 header ( configuration-snippet 不起作用,因为它会在已经在 nginx.conf pod 中设置后添加另一个 Host header 。

我的解决方案是为此入口规则获取整个位置 block 并将其包含为 server-snippet ,这是相当蛮力的。

另一种选择是在 ingress 后面有一个 nginx pod+service,负责设置正确的 header 。所以流程是 request -> ingress-controller -> nginx -> s3。

有人知道如何代理s3吗?

最佳答案

如果您需要使用server-snippet解决方案。类似于以下内容将添加自定义 location阻止 Nginx 入口配置。如果您对 Nginx 入口有其他自定义要求,这将特别有用。

metadata:
  annotations:
    <other annotations>
    nginx.ingress.kubernetes.io/server-snippet: |
      location "/img/" {
        proxy_pass http://s3.eu-central-1.amazonaws.com/mybucket123/pictures/;
        proxy_set_header Host s3.eu-central-1.amazonaws.com;
      }
此外,如果您要反向代理到提供有限日志记录 (AWS S3) 的端点。 Nginx mirror功能可以帮助调试正在发送的请求。向 Ingress Controller 添加一个额外的注解,并指定一个可以监控请求的系统。
nginx.ingress.kubernetes.io/mirror-target: "http://my-debug-target/"

关于amazon-web-services - 使用 Ingress 的 Kubernetes 上的 s3 代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52372230/

相关文章:

java - 使用 Java SDK 列出 Amazon S3 中的所有对象

amazon-web-services - 从 DynamoDB 中的嵌套结构创建索引

linux - Kibana4 无法通过 IP 连接到 Elasticsearch,只能通过 localhost

nginx - 带有子域的动态根不适用于 Nginx

sockets - Lua打开套接字报错

amazon-web-services - 是否有适用于本地离线开发的 AWS Firehose 的兼容替代方案

amazon-web-services - 如何使用 CloudFormation 创建具有集成 RDS 的 AWS Elasticbeanstalk 应用程序?

mysql - 为 MySQL 值生成 ID 键

amazon-web-services - 为什么 AWS Lambda 无法正确将图像上传到 S3?

javascript - 无法在 Safari 中加载跨源图像(来自 CloudFront)