【问题标题】:Tagging s3 in AWS在 AWS 中标记 s3
【发布时间】:2019-07-14 05:41:00
【问题描述】:

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

【问题讨论】:

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


【解决方案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'
            }
        ]
    }
)

【讨论】:

  • 我唯一的问题是可以使用 boto3.resource 还是 TagSet 必须使用 boto3.client
  • Resources represent an object-oriented interface to Amazon Web Services (AWS). They provide a higher-level abstraction than the raw, low-level calls made by service clients. boto3.amazonaws.com/v1/documentation/api/latest/guide/…
猜你喜欢
  • 1970-01-01
  • 2012-09-25
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 2015-01-16
  • 1970-01-01
相关资源
最近更新 更多