Как добавить теги в S3 Bucket, не удаляя существующие теги с помощью boto3? - PullRequest
0 голосов
/ 04 октября 2018

Я использую эту функцию:

s3 = boto3.resource('s3')
bucket_tagging = s3.BucketTagging(bucket)
Set_Tag = bucket_tagging.put(Tagging={'TagSet':[{'Key':'Owner', 'Value': owner}]})

Она удаляет существующие теги, и я вижу только один тег.

Ответы [ 3 ]

0 голосов
/ 23 мая 2019

Я столкнулся с той же проблемой и решил ее своим собственным методом:

import boto3

def set_object_keys(bucket, key, update=True, **new_tags):
    """
    Add/Update/Overwrite tags to AWS S3 Object

    :param bucket_key: Name of the S3 Bucket
    :param update: If True: appends new tags else overwrites all tags with **kwargs
    :param new_tags: A dictionary of key:value pairs 
    :return: True if successful 
    """

    #  I prefer to have this var outside of the method. Added for completeness
    client = boto3.client('s3')   

    old_tags = {}

    if update:
        old = client.get_object_tagging(
            Bucket=bucket,
            Key=key,
        )

        old_tags = {i['Key']: i['Value'] for i in old['TagSet']}

    new_tags = {**old_tags, **new_tags}

    response = client.put_object_tagging(
        Bucket=bucket,
        Key=key,
        Tagging={
            'TagSet': [{'Key': str(k), 'Value': str(v)} for k, v in new_tags.items()]
        }
    )

    return response['ResponseMetadata']['HTTPStatusCode'] == 200

И вы добавите свои теги в вызов функции:

set_object_keys(....., name="My Name", colour="purple")

Это добавит новые тегии обновить существующие

0 голосов
/ 07 августа 2019

================ Пометка уровня корзины ================

import boto3

session = boto3.session.Session (profile_name = 'default') client = session.client ('s3', 'ap-southeast-2')

def set_bucket_tags (bucket, update = True, ** new_tags): old_tags = {}

if update:
    try:
        old = client.get_bucket_tagging(Bucket=bucket)
        old_tags = {i['Key']: i['Value'] for i in old['TagSet']}
    except Exception as e:
        print(e)
        print("There was no tag")

new_tags = {**old_tags, **new_tags}

response = client.put_bucket_tagging(
    Bucket=bucket,
    Tagging={
        'TagSet': [{'Key': str(k), 'Value': str(v)} for k, v in new_tags.items()]
    }
)

print(response)

Вы можете пометить столько, сколько хотите [столько, сколько принято AWS]

set_bucket_tags ("selim.online", True, key1 =«значение1», ключ2 = «значение2», ключ3 = «значение3»)

0 голосов
/ 04 октября 2018

Я бы использовал следующее

s3 = boto3.resource('s3')
bucket_tagging = s3.BucketTagging('bucket_name')
tags = bucket_tagging.tag_set
tags.append({'Key':'Owner', 'Value': owner})
Set_Tag = bucket_tagging.put(Tagging={'TagSet':tags})

. Он получает существующие теги, добавляет новый и затем помещает их все обратно.

...