Как вы можете добавить конфигурацию уведомления AWS S3 - PullRequest
0 голосов
/ 19 июня 2019

Попытка добавить новое уведомление в корзину.Не смог найти ни одного примера в интернете.

Мне нужно, чтобы события ObjectCreated отправлялись в SQS.Мне нужно решить, в какую очередь событие отправляется по префиксу.Таким образом, каждое уведомление будет иметь разные очереди и префиксы для одного и того же сегмента.

Проблема в том, что я не могу добавить новое уведомление.Я просто перезаписываю предыдущее уведомление, настроенное в корзине.

Это код, который у меня есть:

    bucket_notifications_configuration = {
        'QueueConfigurations': [{
            'Events': ['s3:ObjectCreated:*'],
            'Id': f"Notif_{queue_name}",
            'QueueArn': queue.attributes['QueueArn'] ,
            "Filter": {
                "Key": {
                    "FilterRules": [
                        {
                        "Name": "sufix",
                        "Value": f"{prefix}"
                        }
                    ]
                }
            }               
        }]
    }
    qpolicy = {
        "Version": "2012-10-17",
        "Id": f"{queue_arn}/SQSDefaultPolicy",
        "Statement": [{
            "Sid": f"allow bucket {bucket} to notify queue {queue_name}",
            "Effect": "Allow",
            "Principal": {"AWS": "*"},
            "Action": "SQS:SendMessage",
            "Resource": queue_arn,
            "Condition": {
                "ArnLike": {
                    "aws:SourceArn": f"arn:aws:s3:*:*:{bucket}"
                }
            }
        }]
    }

    queue_attrs = queue.attributes
    queue_attrs = {"Policy": json.dumps(qpolicy), }


    queue.set_attributes(Attributes=queue_attrs)
    logger.debug(f"queue ready with attributes: {queue.attributes}")        

    previous_notif = client.get_bucket_notification_configuration(Bucket=bucket)
    previous_notif.pop('ResponseMetadata')

    try:
        print("apendado")
        previous_notif['QueueConfigurations'].append(bucket_notifications_configuration['QueueConfigurations'][0])            
        print(f"apendado {previous_notif} ")
    except KeyError:
        previous_notif['QueueConfigurations'] = bucket_notifications_configuration['QueueConfigurations'][0]
        print("cread")

    client.put_bucket_notification_configuration(
        Bucket=bucket,
        NotificationConfiguration=bucket_notifications_configuration)

Я удостоверяюсь, что идентификатор уведомления отличается от любого другого, также я делаюуверен, что префикс отличается.

Этот код заменяет предыдущее уведомление новым, вместо добавления нового.

1 Ответ

0 голосов
/ 20 июня 2019

Мне удалось заставить его работать с кодом ниже.

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

import boto3

s3_client = boto3.client('s3', region_name = 'ap-southeast-2')

queue_name = 'queue2'
queue_arn = 'arn:aws:sqs:ap-southeast-2:123456789012:queue2'
bucket = 'my-bucket'
prefix = 'folder2/'

# Get the current notification configurations
response = s3_client.get_bucket_notification_configuration(Bucket=bucket)
configurations = response['QueueConfigurations']

# New configuration to add
new_configuration = { 
        'Id': f"Notif_{queue_name}",
        'QueueArn': queue_arn,
        'Events': [
            's3:ObjectCreated:*',
        ],
        'Filter': {
            'Key': {
                'FilterRules': [
                    {
                        'Name': 'prefix',
                        'Value': prefix
                    },
                ]
            }
        }
    }
configurations.append(new_configuration)

# Save combined configurations
response = s3_client.put_bucket_notification_configuration(
    Bucket = bucket,
    NotificationConfiguration = {'QueueConfigurations' : configurations}
)
...