Настройка событий уровня S3 Bucket с помощью AWS CloudFormation - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь заставить AWS CloudFormation создать шаблон, который позволит мне прикрепить событие к существующему S3 Bucket, которое будет запускать лямбда-функцию всякий раз, когда новый файл помещается в определенный каталог в этом контейнере. Я использую следующий YAML в качестве основы для шаблона CloudFormation, но не могу заставить его работать.

---
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  SETRULE:
    Type: AWS::S3::Bucket
      Properties:
        BucketName: bucket-name
        NotificationConfiguration:
          LambdaConfigurations: 
            - Event: s3:ObjectCreated:Put
              Filter: 
                S3Key:
                  Rules:
                    - Name: prefix
                      Value: directory/in/bucket
              Function: arn:aws:lambda:us-east-1:XXXXXXXXXX:function:lambda-function-trigger
              Input: '{ CONFIGS_INPUT }'

Я пытался переписать этот шаблон различными способами, но безуспешно.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

Вы можете написать собственный ресурс для этого, на самом деле это то, что я закончил на работе для той же проблемы. На самом простом уровне определите лямбду, которая принимает конфигурацию уведомлений о путах и ​​затем просто вызывает API уведомлений о путах с данными, которые были переданы ему.

Если вы хотите иметь возможность управлять различными уведомлениями в разныхШаблоны облачной информации, то это немного сложнее. Ваш пользовательский лямбда-ресурс должен будет прочитать существующие уведомления от S3, а затем обновить их, основываясь на том, какие данные были переданы ему из CF.

0 голосов
/ 07 ноября 2019

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

Если вы не хотите воссоздавать свою инфраструктуру, может быть проще использовать какой-нибудь скрипт, который подпишет лямбда-функцию для каждого из блоков. Пока у вас есть список сегментов и лямбда-функция, вы готовы к работе.

Вот скрипт на Python3. Предполагая, что у нас есть:

  1. 2 корзины, называемые test-bucket-jkg2 и test-bucket-x1gf
  2. лямбда-функция с arn: arn: aws: lambda: us-east-1: 605189564693: function: my_func

Есть 2 шага, чтобы сделать эту работу. Во-первых, вам нужно добавить функциональную политику, которая позволит службе s3 выполнять эту функцию. Во-вторых, вы будете циклически перебирать корзины, подписывая лямбда-функции на каждую из них.

import boto3

s3_client = boto3.client("s3") 
lambda_client = boto3.client('lambda')

buckets = ["test-bucket-jkg2", "test-bucket-x1gf"]
lambda_function_arn = "arn:aws:lambda:us-east-1:605189564693:function:my_func"

# create a function policy that will permit s3 service to 
# execute this lambda function

# note that you should specify SourceAccount and SourceArn to limit who (which account/bucket) can
# execute this function - you will need to loop through the buckets to achieve 
# this, at least you should specify SourceAccount
try:
    response = lambda_client.add_permission(
        FunctionName=lambda_function_arn,
        StatementId="allow s3 to execute this function",
        Action='lambda:InvokeFunction',
        Principal='s3.amazonaws.com'
        # SourceAccount="your account",
        # SourceArn="bucket's arn"
    )
    print(response)
except Exception as e:
    print(e)

# loop through all buckets and subscribe lambda function 
# to each one of them
for bucket in buckets:
    print("putting config to bucket: ", bucket)
    try:
        response = s3_client.put_bucket_notification_configuration(
            Bucket=bucket,
            NotificationConfiguration={
                'LambdaFunctionConfigurations': [
                    {
                        'LambdaFunctionArn': lambda_function_arn,
                        'Events': [
                            's3:ObjectCreated:*'
                        ]
                    }
                ]
            }
        )
        print(response)
    except Exception as e:
        print(e)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...