繁体   English   中英

创建lambda函数以将S3中的文件元数据存储到Mysql数据库吗?

[英]Creating a lambda function to store metadata of file in S3 to the Mysql database?

我是AWS的新手,目前正在尝试了解Lambda函数,并在将文件上传到S3存储桶时触发它。 我为此编写了一个处理程序类:

public class Hello implements RequestHandler<Employee, String> {
    public String handleRequest(Employee input, Context context) {
        context.getLogger().log("helloWorld");
        return "Hello World " ;
    }
}

这只是基本知识,当我将文件上传到S3存储桶时,我可以在CloudWatch的日志中看到“ helloworld”。

但是现在我要记录文件的元数据(文件名,createdTime等)。

我在AWS Lambda页面中浏览了一个示例模板示例,在其中可以看到使用Nodejs,我们将event作为参数,并且可以使用此字段提取名称和其他字段。

const aws = require('aws-sdk');
const s3 = new aws.S3({ apiVersion: '2006-03-01' });
exports.handler = (event, context, callback) => {
    const bucket = event.Records[0].s3.bucket.name;
    ...

}

但是作为Java开发人员,我尝试使用S3EventNotification作为参数:

public class Hello implements RequestHandler<S3EventNotification, String> {
    public String handleRequest(S3EventNotification input, Context context) {
        context.getLogger().log(input.getRecords().get(0).getEventSource());
        return "Hello World " ;
    }
}

但我得到以下错误:

An error occurred during JSON parsing: java.lang.RuntimeException
java.lang.RuntimeException: An error occurred during JSON parsing
Caused by: lambdainternal.util.ReflectUtil$ReflectException: java.lang.NoSuchMethodException: com.amazonaws.services.s3.event.S3EventNotification$S3ObjectEntity.<init>(java.lang.String, java.lang.Long, java.lang.String, java.lang.String)
Caused by: java.lang.NoSuchMethodException: com.amazonaws.services.s3.event.S3EventNotification$S3ObjectEntity.<init>(java.lang.String, java.lang.Long, java.lang.String, java.lang.String)

如何在Java中实现同一目标? 谢谢。

尝试以下几种方法:

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.S3Event;

public class Hello implements RequestHandler<S3Event, Void> {
    @Override
    public Void handleRequest(S3Event s3event, Context context) {
        try {
            S3EventNotificationRecord record = s3event.getRecords().get(0);

            String bkt = record.getS3().getBucket().getName();
            String key = record.getS3().getObject().getKey().replace('+', ' ');
            key = URLDecoder.decode(key, "UTF-8");
       } catch (Exception e) {
           // do something
       }
       return null;
    }
}

这是我在pom.xml中使用的相应依赖项:

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-s3</artifactId>
    <version>1.11.228</version>
</dependency>
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-lambda-java-core</artifactId>
    <version>1.1.0</version>
</dependency>
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-lambda-java-events</artifactId>
    <version>2.0.1</version>
</dependency>

这是我的pom.xml的构建规范(这将导致从属类被拉入构建的JAR中):

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <createDependencyReducedPom>false</createDependencyReducedPom>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

不幸的是,这些都不是那么简单,但这就是Java和Maven为您服务的。 Node.js或Python中的AWS Lambda编程比Java中的编程简单得多(也更有趣),因此,如果没有强烈的要求使用Java编写,则最好不要使用Java。

还要注意,如果要异步调用Lambda,则输出类型应该是Void而不是String(请参阅docs )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM