python - 使用 Python 将文件移入和移出 Amazon S3 存储桶键
问题描述
我无权访问根存储桶,但我可以访问存储桶中的密钥(KEY NAME)。
示例:我无法访问“BUCKET NAME”,但可以访问“BUCKET NAME/KEY NAME”
我一直在尝试在“KEY NAME”中移动文件。在下面的代码中,我设法开始工作的是 list_objects_v2。
upload_file
给我以下错误:
调用 PutObject 操作时发生错误 (AccessDenied):访问被拒绝
download_file
给我以下错误:
PermissionError:[WinError 5] 访问被拒绝:'C/Users/username/Desktop'
我对 AWS 环境非常陌生。我可以做些什么来完全获得我需要的访问权限?
import logging
import sys
import boto3
import boto
import boto.s3.connection
from botocore.exceptions import ClientError
from boto3.session import Session
def main():
arguments = len(sys.argv) - 1
if arguments < 1:
print("You must supply a folder name")
return
bucket_name = 'BUCKET NAME'
key_name = 'KEY NAME'
folder = sys.argv[1]
s3 = boto3.client('s3')
objects = s3.list_objects_v2(Bucket = bucket_name,
Prefix = key_name + '/' + folder + '/',
Delimiter = '/')
i = 1
#
# Print the bucket's objects within 'KEY NAME'
#
if objects is not None:
# List the object names
logging.info('Objects in {bucket_name}')
print("Length of Objects: " + str(len(objects)))
for obj in objects:
print("......\n")
print(i)
print("....\n")
print(obj)
print("..\n")
print(objects[obj])
i += 1
else:
# Didn't get any keys
logging.info('No objects in {bucket_name}')
#
# Test to see if we can isolate a folder within 'KEY NAME'
#
print("\n")
print("Common Prefixes" + str(objects['CommonPrefixes']) + "\n")
keys = objects['CommonPrefixes']
print ("Object 0" + str(keys[0]) + '\n')
s3 = boto3.resource('s3')
s3.meta.client.upload_file('C:/Users/username/Desktop/Test/Test.txt',
bucket_name,
key_name)
# s3.meta.client.download_file(bucket_name,
# key_name + '/' + folder + '/' + 'Test.txt',
# 'C:/Users/username/Desktop')
if __name__ == '__main__':
main()
解决方案
最重要的部分是确保您已获得足够的权限来上传/下载/列出前缀。
这是一个示例策略,它授予对前缀的访问权限special/
:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowUserToSeeBucketListInTheConsole",
"Action": [
"s3:ListAllMyBuckets",
"s3:GetBucketLocation"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::*"
]
},
{
"Sid": "AllowListingOfPrefix",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::my-bucket"
],
"Condition": {
"StringEquals": {
"s3:prefix": [
"special/"
],
"s3:delimiter": [
"/"
]
}
}
},
{
"Sid": "UploadDownload",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject"
],
"Resource": "arn:aws:s3:::my-bucket/special/*"
}
]
}
然后,您可以运行如下代码:
import boto3
s3_client = boto3.client('s3')
# Upload a file to S3
s3_client.upload_file('/tmp/hello.txt', 'my-bucket', 'special/hello.txt')
# Download an object
s3_client.download_file('my-bucket', 'special/hello.txt', '/tmp/hello2.txt')
# List objects using Client method
response = s3_client.list_objects_v2(Bucket='my-bucket',Delimiter='/',Prefix='special/')
for object in response['Contents']:
print(object['Key'], object['Size'])
# List objects using Resource method
s3_resource = boto3.resource('s3')
bucket = s3_resource.Bucket('my-bucket')
for object in bucket.objects.filter(Delimiter='/',Prefix='special/'):
print(object.key, object.size)
推荐阅读
- xml - XSLT - XML 到 CSV 将列转换为具有两种不同类型地址的行
- mysql - 此订阅限制在该区域配置 MySQL 服务器请选择其他区域提供服务,订阅限制问题类型
- excel - Excel VBA 删除公式并另存为 v2
- regex - 在 oracle 中查询以在 oracle 中的字符串中查找多个字符串模式(包含 5-50 个字符)
- unity3d - 如何在 Unity 中的多维数据集上添加一个带有 3 条条纹的简单标志
- r - 如何处理包含正斜杠(“/”)的变量名?
- ios - 如何跟踪用户收听特定播客的时间
- google-cloud-platform - 从同一模板启动多个 Dataflow 作业时,如何避免“IN_USED_ADDRESSES”错误?
- c++ - 如何将 tanh 函数作为参数传递给另一个函数?
- python - 有没有办法在 Tkinter 画布上获取对象的状态?