首页 > 解决方案 > 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,角色名称和存储桶名称已替换为占位符)

标签: pythonamazon-web-servicesamazon-s3boto3

解决方案


您正在向 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"
)

推荐阅读