Search code examples
pythonamazon-web-servicesamazon-s3

Tagging s3 in AWS


I am trying to create some s3 buckets and Objects using boto3 then add some tags ( object tagging). I then want to use IAM to control access on these objects using these tags. I am unable to find the right syntax. I am using create_buckets.py ( to create buckets and objects) and then list_objects.py to list them.

Really appreciate if someone can help me with the syntax to add multiple tags to objects and buckets.

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)

Solution

  • You can not define tag during uploading object. Here is what I got when I tried to set tag during upload.

    enter image description here

    does not appear to be a valid way to specify a tag.

    But there is way around,

    Upload the object and then set the tag once the object is uploaded. Here is complete working example

    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