首页 > 解决方案 > 使用 Boto 自动上传到 AWS S3 存储桶 Yields Expired Token Error

问题描述

对 AWS 非常陌生。我正在尝试使用 python 和 Boto3 将文件目录上传到 AWS

我已经使用终端设置了从控制台提供的各种令牌,然后可以使用 AWS 命令​​行使用以下命令成功地将文件传输到我的存储桶:

> aws s3 cp C://dog.jpg s3://mybucketname/dog.jpg

现在我想自动化一大堆文件,所以我在 python 3.7 中运行以下代码

import boto3
from botocore.exceptions import ClientError

os.environ['AWS_ACCESS_KEY_ID'] = "provided access key id"
os.environ['AWS_SECRET_ACCESS_KEY'] = "provided secret access key"
os.environ['AWS_SESSION_TOKEN'] = "provided session token"

#create the client
s3 = boto3.client(
's3',
region_name = 'ca-central-1',
aws_access_key_id=os.environ.get('AWS_ACCESS_KEY_ID'),
aws_secret_access_key=os.environ.get('AWS_SECRET_ACCESS_KEY'),
aws_session_token=os.environ.get('AWS_SESSION_TOKEN'),
)

def upload_file(s3_client, file_name, bucket, object_name=None):
    """Upload a file to an S3 bucket
    :param s3_client: client to upload with
    :param file_name: File to upload
    :param bucket: Bucket to upload to
    :param object_name: S3 object name. If not specified then file_name is used
    :return: True if file was uploaded, else False
    """

    # If S3 object_name was not specified, use file_name
    if object_name is None:
        object_name = file_name

    #try the upload
    try:
        response = s3_client.upload_file(file_name, bucket, object_name)
    except ClientError as e:
        logging.error(e)
        return False
    return True

upload_file(s3,'c:\\dog.jpg','mys3bucket','doggy.jpg')

我收到以下错误

调用 PutObject 操作时出错 (ExpiredToken):提供的令牌已过期。

我使用了与之前完全相同的密钥/凭据。我错过了什么?

谢谢。

标签: pythonamazon-web-servicesamazon-s3

解决方案


AWS_SESSION_TOKEN- 仅当您使用临时凭证时才需要。

你能确定你使用的是临时凭证吗?就像您正在担任一个角色或者您正在做一个网络身份联合。

如果没有,请将其从您的代码中删除

s3 = boto3.client(
  's3',
  region_name = 'ca-central-1',
  aws_access_key_id=os.environ.get('AWS_ACCESS_KEY_ID'),
  aws_secret_access_key=os.environ.get('AWS_SECRET_ACCESS_KEY')
)

推荐阅读