我正在尝试使用boto3创建一些s3存储桶和对象,然后添加一些标签(对象标签)。然后,我想使用IAM使用这些标签控制对这些对象的访问。我找不到正确的语法。 我正在使用create_buckets.py(创建存储桶和对象),然后使用list_objects.py列出它们。
如果有人可以帮助我在对象和存储桶中添加多个标签的语法,请多谢。
create_buckets.py
import boto3
from random import randint
import json
session = boto3.session.Session()
s3 = boto3.resource('s3')
state=["Alabama","Alaska","Arizona","Arkansas","California","Colorado","Connecticut"]
for x in state:
bucket_name = x.lower() + '-season-' + str(randint(0, 10000))
s3.create_bucket(Bucket=bucket_name)
for bucket in s3.buckets.all():
print(bucket.name)
s3.Object(bucket.name,'hello.txt').put(Body=open('/tmp/hello.txt','rb'))
copy_source={ 'Bucket':bucket.name,'Key':'hello123.txt'}
list_objects.py
import boto3
s3 = boto3.resource('s3')
for bucket in s3.buckets.all():
print(bucket.name)
for obj in bucket.objects.all():
print(' ' + obj.key)
答案 0 :(得分:1)
在上传对象期间无法定义标签。这是我在上传过程中尝试设置标签时得到的。
does not appear to be a valid way to specify a tag.
但是还有办法,
上传对象,然后在上传对象后设置标签。这是完整的工作示例
import logging
import boto3
from botocore.exceptions import ClientError
client = boto3.client('s3')
def upload_file(file_name, bucket, object_name=None):
"""Upload a file to an S3 bucket
: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
# Upload the file
s3_client = boto3.client('s3')
try:
response = s3_client.upload_file(file_name, bucket, object_name)
except ClientError as e:
logging.error(e)
return False
return True
s3 = boto3.client('s3')
with open("./test.txt", "rb") as f:
s3.upload_fileobj(f, "config-bucket-name", "test.txt",
ExtraArgs={
'Metadata': {'mykey': 'myvalue'}
})
# set tag once object upload to s3
response = client.put_object_tagging(
Bucket='config-bucket-name',
Key='test.txt',
Tagging={
'TagSet': [
{
'Key': 'ENV',
'Value': 'Prod'
},
{
'Key': 'type',
'Value': 'txt'
}
]
}
)