间歇性问题:无法定位凭据。

5
我们正在使用以下版本的Boto来编写SQS -
  • boto3==1.7.16
  • botocore==1.10.16
代码在生产环境中成功运行,但是偶尔我们会看到以下间歇性错误 -

NoCredentialsError 无法定位凭据。

下面是堆栈跟踪 -
File "botocore/client.py", line 317, in _api_call
    return self._make_api_call(operation_name, kwargs)
File "botocore/client.py", line 602, in _make_api_call
    operation_model, request_dict)
File "botocore/endpoint.py", line 143, in make_request
  return self._send_request(request_dict, operation_model)
File "botocore/endpoint.py", line 168, in _send_request
  request = self.create_request(request_dict, operation_model)
File "botocore/endpoint.py", line 152, in create_request
  operation_name=operation_model.name)
File "botocore/hooks.py", line 227, in emit
  return self._emit(event_name, kwargs)
File "botocore/hooks.py", line 210, in _emit
  response = handler(**kwargs)
File "botocore/signers.py", line 90, in handler
  return self.sign(operation_name, request)
File "botocore/signers.py", line 154, in sign
  auth.add_auth(request)
File "botocore/auth.py", line 352, in add_auth
  raise NoCredentialsError

我们有以下 API 可以从多个线程调用 -
    def client(self):
        if not self._client:
            self._client = boto3.client('sqs', self.region)
        return self._client

你是如何提供凭据的?是在具有分配角色的亚马逊EC2实例上运行,还是通过.aws/credentials文件传递?如果这是间歇性的问题,可能是网络错误,你只需要再试一次。 - undefined
嗨约翰,凭证来自.aws/credentials。 - undefined
1
你解决过这个问题吗?我们在使用boto3的多线程时遇到了类似的问题。 - undefined
很不幸,它并没有解决问题。为了解决这个问题,我们引入了重试机制,考虑到这是一个间歇性问题。 - undefined
2个回答

0
我不时会从运行aws cloudwatch put-metric-data的cron作业中看到这个错误。(相关性:"AWS CLI实际上是用Python编写的,它实际上使用了boto库(botocore)的一部分。"

无法找到凭据。您可以通过运行"aws configure"来配置凭据。

这个cron作业已经在数十台使用Amazon EC2的IAM角色的服务器上每五分钟运行一次多年了,我每周大约会收到一次关于这个错误的电子邮件。根据粗略的计算,我所有服务器的失败率约为0.00007%。
实例上的应用程序从实例元数据项iam/security-credentials/role-name中检索角色提供的安全凭证。通过与角色关联的安全凭证,应用程序被授予您为该角色定义的操作和资源的权限。这些安全凭证是临时的,并且我们会自动轮换它们。我们会在旧凭证到期前至少五分钟提供新的凭证。
我的工作理论是,网络故障(尤其是廉价的传统t2.micro服务器)导致凭证下载失败,然后将其显示为身份验证错误。
这对我来说还不足以引起更大的干扰,但也许有人因此而感到烦恼,可以证明或证伪我的理论。

-2
这个问题主要是因为Boto3无法识别AWS的正确凭证而引起的。有不同的方法来解决这个问题。在一切之前,请尝试以下步骤。 步骤1:手动指定ACCESS_ID和ACCESS_KEY。出于安全原因,不要直接将这些值插入代码中。如果这样可以解决问题,那么你可以确定Boto很难找到访问凭证。
import boto3
client = boto3.client(
    'sqs',
    aws_access_key_id=ACCESS_KEY,
    aws_secret_access_key=SECRET_KEY,
)

其他选项:打开 AWS 凭据文件 ~/.aws/credentials,将配置文件名添加为默认,并运行程序。
[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYY

如果你希望使用不同的个人资料名称,你可以在 Boto 会话中指定。
session = boto3.Session(profile_name=your_profile_name)

或者你也可以将AWS_DEFAULT_PROFILE环境变量名称更改为"your_profile_name"。

其他选项:您可以通过AWS CLI来设置凭证。使用PIP安装AWS CLI。

pip install awscli

接下来,通过以下命令配置凭据和其他信息。
aws configure

希望这能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接