Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找S3 Bucket并添加触发器以调用lambda_Java_Amazon Web Services_Amazon S3_Aws Lambda_Aws Cdk - Fatal编程技术网

Java 查找S3 Bucket并添加触发器以调用lambda

Java 查找S3 Bucket并添加触发器以调用lambda,java,amazon-web-services,amazon-s3,aws-lambda,aws-cdk,Java,Amazon Web Services,Amazon S3,Aws Lambda,Aws Cdk,我正在使用新的AWSCDK(云开发工具包)在Java的AWS上构建基础设施 我要做的是:查找一个s3 bucket并添加一个调用lambda函数的触发器 我所做的: 查找s3存储桶: IBucket bucket = Bucket.fromBucketName(scope, bucketId, bucketName); 将新事件源添加到现有lambda: IEventSource eventSource = getObjectCreationEvent(); lambda.addEvent

我正在使用新的AWSCDK(云开发工具包)在Java的AWS上构建基础设施

我要做的是:查找一个s3 bucket并添加一个调用lambda函数的触发器

我所做的:

  • 查找s3存储桶:

    IBucket bucket = Bucket.fromBucketName(scope, bucketId, bucketName);
    
  • 将新事件源添加到现有lambda:

    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);
            }
        });
    }
    
    private S3EventSource getObjectCreationEvent(){
    返回新的S3EventSource(bucket,新的S3EventSourceProps(){
    @凌驾
    公共列表getEvents(){
    返回集合.singletonList(EventType.OBJECT\u已创建);
    }
    });
    }
    
问题是什么:


S3EventSource
构造函数中
bucket
参数的类型是
bucket
,但是每个查找方法(例如
bucket.fromBucketName()
)都返回
IBucket
,而不是
bucket
,因此存在签名不匹配。如果我将
IBucket
转换为
Bucket
,我会从git问题跟踪器中获得一个
ClassCastException

由于当前CloudFormation的限制以及我们在CDK中实现bucket通知的方式,无法在导入的bucket上添加bucket通知。这就是事件源使用s3.Bucket而不是s3.IBucket的原因

您可以使用onPutObject:

但进一步阅读,这似乎也不再有效

目前的答案似乎是:


设置是不可能的。

您必须使用CDK吗?您可以从堆栈中获取bucket。这不是您正在寻找的解决方案,但作为一种解决方案,您可以将s3Bucket+触发器创建为一个基础设施项目。不过,请确保事先创建了lambda。
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);