如果存储桶上的现有标签包含“ aws:”前缀,如何使用Boto3将新标签添加到AWS S3存储桶?

时间:2018-10-10 08:55:45

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

我正在使用下面的boto3代码将新标签添加到S3存储桶中,而不会删除现有标签。

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

这将获取现有标签,添加一个新标签,然后将它们全部放回。

但是,如果我的存储桶包含“ aws:”作为前缀,则会出现以下错误: '调用CreateTags操作时发生错误(InvalidParameterValue):参数密钥的值(aws:cloudformation:stack-name)无效。以'aws:'开头的标记键仅供内部使用。'

在这种情况下,如何使用boto3添加新标签而不删除现有标签?

1 个答案:

答案 0 :(得分:0)

我发现,虽然不能使用以“ aws:”开头的键添加新标签,但可以将现有标签以及新标签放回原处,没有例外。 这是我使用的测试代码;替换存储桶名称,并根据需要添加区域:

#!/usr/bin/env python3
import boto3

tag_data = [{'Key':'Owner', 'Value': "my owner tag here"}]
bucket_name = "mybucket"
print (f"Updating tags in bucket: {bucket_name}")

s3 = boto3.resource('s3')
try:
    bucket_tagging = s3.BucketTagging( bucket_name)
    tags = bucket_tagging.tag_set
    for tag in tags:
        # Avoid error by not adding duplicate keys from current tag list.
        key_test = tag.get("Key")
        Found=False
        for new_tag in tag_data:
            if new_tag.get("Key") == key_test:
               found=True
        if not found:
            tag_data.append(tag)
except Exception as error:
    print ("Error getting tags: ", error)

print ("Setting new tag set to: ", tag_data)

response = bucket_tagging.put(
    Tagging={
        'TagSet': tag_data
    }
)
if response is not None and response['ResponseMetadata']['HTTPStatusCode'] == 204:
    print ("success")
else:
    print (f"Warning, unable to update tags for bucket: {bucket_name}")