Lookup S3 Bucket и добавить триггер, чтобы вызвать лямбду - PullRequest
2 голосов
/ 18 февраля 2020

Я использую новый AWS CDK (Cloud Development Toolkit) для построения инфраструктуры на AWS в Java.

Что мне нужно сделать: поиск ведро s3 и добавление триггера, который вызывает лямбда-функцию.

Что я сделал:

  • Поиск ведра s3:

    IBucket bucket = Bucket.fromBucketName(scope, bucketId, bucketName);
    
  • Добавить новый источник событий к существующей лямбде:

    IEventSource eventSource = getObjectCreationEvent();
    lambda.addEventSource(eventSource);
    
  • Где getObjectCreationEvent():

    private S3EventSource getObjectCreationEvent() {
        return new S3EventSource(bucket, new S3EventSourceProps() {
            @Override
            public List<EventType> getEvents() {
                return Collections.singletonList(EventType.OBJECT_CREATED);
            }
        });
    }
    

В чем проблема:

Тип параметра bucket в конструкторе S3EventSource равен Bucket, но каждый метод поиска (например, Bucket.fromBucketName()) возвращает IBucket, а не Bucket, поэтому существует несоответствие подписи. Если я разыграю IBucket до Bucket, у меня будет ClassCastException.

1 Ответ

3 голосов
/ 24 февраля 2020

Из системы отслеживания проблем git https://github.com/aws/aws-cdk/issues/2004#issuecomment -479923251

Из-за текущих ограничений с CloudFormation и способа, которым мы реализовали уведомления корзины в CDK, это невозможно добавить уведомления корзины на импортированную корзину. Вот почему источник событий использует s3.Bucket вместо s3.IBucket.

Вы можете использовать onPutObject:

const bucket = s3.Bucket.import(this, 'B', {
  bucketName: 'my-bucket'
});

const fn = new lambda.Function(this, 'F', {
  code: lambda.Code.inline('boom'),
  runtime: lambda.Runtime.NodeJS810,
  handler: 'index.handler'
});

bucket.onPutObject('put-object', fn);

Но, читая далее, это не похоже на работать больше тоже.

Кажется, что в настоящее время ответ таков:

Невозможно настроить.

...