python - Boto3 访问 S3 存储桶时访问令牌无效
问题描述
我正在尝试使用具有假定角色临时凭据的 Boto3 客户端访问 S3 存储桶,并且在此过程中出现 InvalidToken 错误。
“提供的令牌格式错误或无效”
S3 存储桶受到存储桶策略的保护,该策略强制客户端在访问存储桶之前承担特定角色。该角色是使用 sts 客户端和假设角色操作来承担的。
import boto3
import uuid
sts = boto3.client('sts',
aws_access_key_id=AWS_ACCESS_KEY,
aws_secret_access_key=AWS_SECRET_KEY)
assumed_role_object = sts.assume_role(RoleArn=ROLE_ARN, RoleSessionName=uuid.uuid1().__str__())
token = assumed_role_object.get("Credentials").get("SessionToken")
session = boto3.Session(aws_access_key_id=AWS_ACCESS_KEY,
aws_secret_access_key=AWS_SECRET_KEY,
aws_session_token=token,
region_name="us-east-1")
s3 = session.client("s3")
s3.list_objects(Bucket='my_bucket')
list_objects 操作给出以下错误:
An error occurred (InvalidToken) when calling the ListObjects operation: The provided token is malformed or otherwise invalid.
Traceback (most recent call last):
File "/usr/local/lib/python3.4/site-packages/botocore/client.py", line 357, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/usr/local/lib/python3.4/site-packages/botocore/client.py", line 661, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (InvalidToken) when calling the ListObjects operation: The provided token is malformed or otherwise invalid.
代码在 EMR 集群上执行的 jupyter notebook 上执行。
(在上面的代码示例中访问 kyes,角色名称和存储桶名称已替换为占位符)
解决方案
您正在向 Boto3 会话传递不正确的访问密钥。您必须从代入角色中获取临时凭证。
access_key = assumed_role_object['Credentials']['AccessKeyId']
secret_access_key = assumed_role_object['Credentials']['SecretAccessKey']
session_token = assumed_role_object['Credentials']['SessionToken']
session = boto3.Session(
aws_access_key_id=access_key,
aws_secret_access_key=secret_access_key,
aws_session_token=session_token,
region_name="us-east-1"
)
推荐阅读
- python - 为什么这段代码不把这些值放在电子表格中?
- ruby-on-rails - 将静态网站部署到 heroku 但错误:“错误:未找到 'composer.lock'!”
- netsuite - SuiteScript 2.0 在 Inventory Details 上设置 bin 编号 (binnumber) 引发 INVALID_FLD_VALUE
- python - 为什么我的断路器阈值会影响 MQTT 中的 QoS 1?
- python - 如何遍历导入的 excel 文档中的行并获取字符串值并使用它来命名最终图像输出
- python - Python 项目没有按我的预期工作
- ios - 选择 DatePicker 后,键盘不会关闭
- spring-boot - Spring Boot Admin:没有刷新配置的选项
- c++ - C++ 语法头文件错误
- javascript - 如何将 PDFJS.getDocument 中从 canvas.toBlob() 创建的 url 保存到数组中?