我在 AWS EKS 集群中使用
@aws/client-sqs
npm 包将消息推送到标准 SQS 队列并收到以下错误:
CredentialsProviderError: 169.254.170.23 is not a valid container metadata service hostname
at getCmdsUri (/test/node_modules/@smithy/credential-provider-imds/dist-cjs/fromContainerMetadata.js:57:19)
at /test/node_modules/@smithy/credential-provider-imds/dist-cjs/fromContainerMetadata.js:16:38
at retry (/test/node_modules/@smithy/credential-provider-imds/dist-cjs/remoteProvider/retry.js:5:19)
at /test/node_modules/@smithy/credential-provider-imds/dist-cjs/fromContainerMetadata.js:15:36
at /test/node_modules/@smithy/property-provider/dist-cjs/chain.js:12:39
at async coalesceProvider (/test/node_modules/@smithy/property-provider/dist-cjs/memoize.js:14:24)
at async /test/node_modules/@smithy/property-provider/dist-cjs/memoize.js:33:24
at async /test/node_modules/@smithy/core/dist-cjs/middleware-http-auth-scheme/httpAuthSchemeMiddleware.js:35:23
at async /test/node_modules/@aws-sdk/middleware-sdk-sqs/dist-cjs/send-message.js:7:18
at async /test/node_modules/@aws-sdk/middleware-logger/dist-cjs/loggerMiddleware.js:7:26 {
tryNextLink: false
}
代码是:
const { SQSClient, SendMessageCommand } = require('@aws-sdk/client-sqs');
const sqsClient = new SQSClient();
const sendCommand = new SendMessageCommand({ QueueUrl: '<queue-url>', MessageBody: '{"a":1}' });
sqsClient
.send(sendCommand)
.then(() => console.log('Message sent!'))
.catch(console.error);
看起来
169.254.170.23
更像是本地网络IP。 SQS 队列 URL 是否以某种方式解析为该本地 IP?
我们有开发和生产 EKS 集群。它在 dev env 中工作,但在 prod 中不起作用。我看到的区别是,我们在每个节点组内的 prod EKS 集群中运行
coredns
和 kube-proxy
side car 容器,但不在 dev 中运行。
任何人都可以帮我理解这里的问题是什么吗?
169.254.170.23
是容器的 AWS 元数据 IP 地址(EKS pod 身份),从错误中可以推测,所使用的 SDK 版本似乎尚不支持它。
在这种情况下,printenv | grep "AWS_CONTAINER_CREDENTIALS_FULL_URI"
将返回AWS_CONTAINER_CREDENTIALS_FULL_URI=http://169.254.170.23/v1/credentials
。