【问题标题】:AWS S3 - java.net.UnknownHostException: repo-user-bucket.s3.us-west-2.amazonaws.comAWS S3 - java.net.UnknownHostException:repo-user-bucket.s3.us-west-2.amazonaws.com
【发布时间】:2020-11-24 12:11:30
【问题描述】:

我有一个使用 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


    【解决方案1】:

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

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

    背景

    在 AWS 开发工具包底层运行 AWS API 调用的 HTTP 客户端需要查找 S3 存储桶的 DNS 条目以建立 TCP 连接,以运行请求的 S3 操作。这种 DNS 故障有时会作为暂时的网络错误发生,应该通过重试进行预期和缓解。一些重试机制内置在底层 HTTP 客户端库中。问题是当这是一个持续性错误时。

    我们案例中的问题

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

    您的情况可能存在问题

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

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

    其他选择

    如果它旨在限制出站流量以实现更严格的合规性,那么另一种方法是为所需的 AWS 服务设置 VPC Gateway Endpoints

    【讨论】:

      猜你喜欢
      • 2016-04-13
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      相关资源
      最近更新 更多