AWS S3 - java.net.UnknownHostException:repo-user-bucket.s3.us-west-2.amazonaws.com

问题描述 投票:0回答:2

我有一个使用S3上传图像的服务。当本地运行时(在 Windows 中仅运行服务的 jar),它工作正常。 但是将 docker compose 与其他服务一起使用时,当我尝试上传图像时出现此错误:

com.amazonaws.SdkClientException: Unable to execute HTTP request: repo-user-bucket.s3.us-west-2.amazonaws.com
Caused by: java.net.UnknownHostException: repo-user-bucket.s3.us-west-2.amazonaws.com                                                                                                                           at java.net.InetAddress.getAllByName0(InetAddress.java:1280) ~[na:1.8.0_144]
at java.net.InetAddress.getAllByName(InetAddress.java:1192) ~[na:1.8.0_144]
at java.net.InetAddress.getAllByName(InetAddress.java:1126) ~[na:1.8.0_144] 

docker compose 的 yml 文件如下所示:

version: '2'

services:

  mysqldb:
    image: mysql:5.6.26
    environment:
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: db
    ports:
      - "3306:3306"

  eureka-service:
    image: services/eureka-server
    ports:
    - "8761:8761"


  image-service:
    image: services/image-service
    ports:
      - "8060:8060"
    links:
      - mysqldb
      - eureka-service
    depends_on:
      - eureka-service
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://mysqldb:3306/db
      - SPRING_DATASOURCE_USERNAME=user
      - SPRING_DATASOURCE_PASSWORD=password
      - SPRING_PROFILES_ACTIVE=compose

配置文件撰写的配置为:

server.port:8060
spring.application.name=imageService

spring.datasource.url:jdbc:mysql://localhost/db
spring.datasource.username:user
spring.datasource.password:password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

cloud.aws.region.static:us-west-2
cloud.aws.credentials.accessKey:accessKey
cloud.aws.credentials.secretKey:secretKey
cloud.aws.stack.auto=false
cloud.aws.region.auto=true
s3.bucket.name.photos.profiles:repo-user-bucket

eureka.client.service-url.defaultZone=http://192.168.99.100:8761/eureka/
eureka.client.initialInstanceInfoReplicationIntervalSeconds=5
eureka.client.registryFetchIntervalSeconds=5
eureka.instance.leaseExpirationDurationInSeconds=5
eureka.instance.leaseRenewalIntervalInSeconds=5

可能是什么问题?

amazon-web-services docker docker-compose aws-sdk spring-cloud
2个回答
0
投票

此错误的一般原因是 DNS 查找失败。

java.net.UnknownHostException: repo-user-bucket.s3.us-west-2.amazonaws.com

背景

在 AWS SDK 下运行 AWS API 调用的 HTTP 客户端需要查找 S3 存储桶的 DNS 条目才能建立 TCP 连接,以运行请求的 S3 操作。这种 DNS 故障可能会作为暂时性网络错误偶尔发生,应该通过重试来预测和缓解这种情况。底层 HTTP 客户端库内置了一定量的重试机制。问题在于这是一个持续性错误。

我们案例中的问题

当我们遇到这个问题时,经过调查,我们意识到引发此错误的代码是在 AWS Lambda 中运行的,并且附加到 Lambda 函数的安全组没有任何出口规则设置。因此,所有查找 S3 DNS 条目的 DNS 请求都会在 VPC 边界处被丢弃。添加出口规则以允许出站流量后,问题得到解决。

您的情况可能存在的问题

您遇到的问题可能与出站网络路由和阻塞类似。要检查的事情可能是

  • docker compose 的网络配置
  • ECS 集群设置和 EC2 主机配置
  • VPC 设置

其他选择

如果想要限制出站流量以实现更严格的合规性,则另一种方法是为所需的 AWS 服务设置 VPC 网关终端节点


0
投票

我也遇到了这个错误,早上自己解决了,也许 aws 服务器本身就出现了类似的问题。

© www.soinside.com 2019 - 2024. All rights reserved.