出现错误:getaddrinfo EAI_AGAIN 使用 Amazon S3 开发工具包

Posted

技术标签:

【中文标题】出现错误:getaddrinfo EAI_AGAIN 使用 Amazon S3 开发工具包【英文标题】:Getting Error: getaddrinfo EAI_AGAIN using Amazon S3 SDK 【发布时间】:2019-05-15 09:35:45 【问题描述】:

我在我的 Node.js 项目中收到来自 Amazon S3 SDK 的错误,如下所示。

 Error: getaddrinfo EAI_AGAIN ***.s3-accelerate.amazonaws.com:443
    at Object._errnoException (util.js:992:11)
    at errnoException (dns.js:55:15)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:92:26)
  message: 'getaddrinfo EAI_AGAIN ***.s3-accelerate.amazonaws.com:443',
  code: 'NetworkingError',
  errno: 'EAI_AGAIN',
  syscall: 'getaddrinfo',
  hostname: '***.s3-accelerate.amazonaws.com',
  host: '***.s3-accelerate.amazonaws.com',
  port: 443,
  region: 'us-east-1',
  retryable: true,
  time: 2018-12-14T05:46:18.649Z 

error: There was an error viewing your album: getaddrinfo EAI_AGAIN ***.s3-accelerate.amazonaws.com:443

我知道这是一个 DNS 问题错误。但错误偶尔会发生。如果我一次又一次地尝试运行代码,则可能不会显示此错误。

S3 在美国东部地区,我从亚洲访问。但据我所知,Amazon S3 区域与此无关。

我的部分代码如下:

仅供参考:我承诺了 S3 SDK

const s3 = new AWS.S3(useAccelerateEndpoint: true);
        const bucket_name = s3Storage.bucketName;


s3getImageV2: async function (albumPhotosKey) 
        albumPhotosKey = albumPhotosKey.toString();

        try 
            const s3 = new AWSP.S3(useAccelerateEndpoint: true);
            const bucket_name = s3Storage.bucketName;
            if (!albumPhotosKey) 
                return 
                    status: false,
                    message: 'Album name is not given.'
                ;
            
            const data = await listImageObjects(s3, bucket_name, albumPhotosKey);
            var photos = [];
            logger.debug('S3:data.Contents: ', data.Contents.length);
            for (let i = 0; i < data.Contents.length; i++) 
                const photo = data.Contents[i];
                if (photo.Key.endsWith("/")) continue;
                const params = 
                    Bucket: bucket_name,
                    Key: photo.Key,
                    Expires: config.cache.ttl || 86400
                ;
                logger.silly(`iteration:, $i`);
                // skiniq:s3
                const resp = await s3.getSignedUrlProm('getObject', params);
                photos.push(resp);
            
            logger.debug('S3:OUTPUT: ', photos);
            return photos;
         catch (e) 
            console.error(e);
            return null;
        

【问题讨论】:

【参考方案1】:

是的,我们也开始得到这些。在我们的例子中它们并不太严重,一旦我们检测到故障,我们可以重新启动我们的节点进程,但它们非常令人惊讶。我们看不到一个合乎逻辑的解释(在我们的例子中,我们启动了 64 个相同的 pod,其中一两个在启动时出现了该错误)。

【讨论】:

【参考方案2】:

我最近遇到了同样的问题,经过很长时间的谷歌搜索后,我找到了一个解决方案,该解决方案指出应该从初始化中删除 REGION 参数,你应该没问题。我做到了并且工作了。我希望这可以帮助任何遇到此错误的人。

【讨论】:

【参考方案3】:

我们正在执行 deleteObject,当有人在 AWS 控制台中查看文件/对象所在的目录时发生了这种情况。 因此,当 SDK 正在删除 S3 对象时,并且如果有人正在查看文件所在的同一目录,那么我们就会发生此错误。

所以我们在从控制台选项卡移到其他选项卡后尝试删除对象,但问题没有发生。

同样在 S3 的控制台中,我们输入了搜索查询,它将在结果中显示文件。然后当我们对结果中的一个文件发出删除对象请求时,我们得到了这个错误。

【讨论】:

以上是关于出现错误:getaddrinfo EAI_AGAIN 使用 Amazon S3 开发工具包的主要内容,如果未能解决你的问题,请参考以下文章

Error: getaddrinfo ENOTFOUND 怎么解决?

getaddrinfo() 连续失败并出现 EAI_AGAIN

NodeMailer:getaddrinfo错误

Nodejs错误:getaddrinfo ENOENT [重复]

CHEF 服务器--错误:网络错误:getaddrinfo:提供节点名或服务名,或未知

Nodemailer getaddrinfo ENOTFOUND 错误