在AWS中标记s3

时间:2019-07-13 02:59:29

标签: python amazon-web-services amazon-s3

我正在尝试使用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)

1 个答案:

答案 0 :(得分:1)

在上传对象期间无法定义标签。这是我在上传过程中尝试设置标签时得到的。

enter image description here

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'
            }
        ]
    }
)

enter image description here