我们正在使用以下版本的 Boto 来写入 SQS -
代码在生产环境中运行成功,但偶尔我们会看到以下间歇性错误 -
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
我间歇性地从运行的 cron 作业中看到此错误
aws cloudwatch put-metric-data
。 (相关性:“AWS CLI 也是用 Python 编写的,实际上使用了 boto 库 (botocore) 的一部分。”)
多年来,该 cron 作业在数十台使用 Amazon EC2 的 IAM 角色的服务器上每五分钟运行一次,我大约每周都会收到一封有关此错误的电子邮件。根据餐巾纸背面的计算,我所有服务器的故障率约为 0.00007%。无法找到凭据。您可以通过运行“aws configure”来配置凭证。
实例上的应用程序从实例元数据项 iam/security-credentials/role-name 中检索角色提供的安全凭证。应用程序被授予执行您通过与角色关联的安全凭证为角色定义的操作和资源的权限。这些安全凭证是临时的,我们会自动轮换它们。我们在旧凭证到期前至少五分钟提供新凭证。
这还不足以让我进一步深入研究,但也许其他人已经足够恼火来证明或反驳我的理论。我的工作理论是,网络故障(尤其是在廉价的传统 t2.micro 服务器上)会导致凭证下载失败,然后表现为身份验证错误。
此问题主要是由于 Boto3 无法识别 AWS 的正确凭证而导致的。有
import boto3
client = boto3.client(
'sqs',
aws_access_key_id=ACCESS_KEY,
aws_secret_access_key=SECRET_KEY,
)
~/.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
希望这有帮助。