Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.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
如何使用Lambda&x2B从S3收集文件并将其发送到外部SFTP;JAVA_Java_Amazon Web Services_Amazon S3_Aws Lambda_Sftp - Fatal编程技术网

如何使用Lambda&x2B从S3收集文件并将其发送到外部SFTP;JAVA

如何使用Lambda&x2B从S3收集文件并将其发送到外部SFTP;JAVA,java,amazon-web-services,amazon-s3,aws-lambda,sftp,Java,Amazon Web Services,Amazon S3,Aws Lambda,Sftp,我有每天都会放在S3存储桶中的文件,我需要创建一个lambda函数来将该文件转发到外部SFTP。(使用java) 我的问题是,我不知道如何从lambda中建立与S3的连接,以收集文件(最终编辑它,例如重命名),然后转发到SFTP。如果我们需要调用另一个Lambda函数,是否可以像我们这样调用它。或者我必须像在AWS环境之外一样连接 如果您有一些建议,或者一些简单的实现示例,甚至接近于此,那就太好了 首先需要向Lambda函数发送新的对象事件 在Lambda函数中,您将从事件对象中拉出S3对象路径

我有每天都会放在S3存储桶中的文件,我需要创建一个lambda函数来将该文件转发到外部SFTP。(使用java)

我的问题是,我不知道如何从lambda中建立与S3的连接,以收集文件(最终编辑它,例如重命名),然后转发到SFTP。如果我们需要调用另一个Lambda函数,是否可以像我们这样调用它。或者我必须像在AWS环境之外一样连接

如果您有一些建议,或者一些简单的实现示例,甚至接近于此,那就太好了

首先需要向Lambda函数发送新的对象事件


在Lambda函数中,您将从事件对象中拉出S3对象路径。然后需要使用将文件从S3下载到Lambda函数的
/tmp
文件夹。然后让函数对
/tmp
文件夹中的文件执行所需的任何编辑。最后,使用a将文件从
/tmp
文件夹发送到SFTP服务器。

下面是从S3获取文件并将其保存到SFTP的完整示例

我添加了以下库以使此Java模块正常工作:

  • import com.amazonaws.regions.regions;
    导入com.amazonaws.services.lambda.runtime.Context;
    导入com.amazonaws.services.lambda.runtime.LambdaLogger;
    导入com.amazonaws.services.lambda.runtime.RequestStreamHandler;
    导入com.amazonaws.services.s3.AmazonS3;
    导入com.amazonaws.services.s3.AmazonS3ClientBuilder;
    导入com.amazonaws.services.s3.model.s3对象;
    导入com.google.gson.gson;
    导入com.google.gson.GsonBuilder;
    导入net.schmizz.sshj.SSHClient;
    导入net.schmizz.sshj.sftp.SFTPClient;
    导入net.schmizz.sshj.xfer.FileSystemFile;
    导入java.io.*;
    导入java.nio.charset.StandardCharset;
    导入java.nio.file.Files;
    导入java.nio.file.StandardCopyOption;
    公共类S3ToSFTPTest实现RequestStreamHandler{
    私人兰博格记录器;
    @凌驾
    公共void handleRequest(InputStream输入、OutputStream输出、上下文上下文)引发IOException{
    logger=context.getLogger();
    AmazonS3 s3Client=AmazonS3ClientBuilder.standard().withRegion(Regions.US_EAST_1.build();
    //s3客户端
    if(s3Client==null){
    log(“S3客户端为空-无法继续!”);
    sendResponse(上下文,新的S3ToSFTPTestResponse(false),输出);
    返回;
    }
    字符串bucketName=“===S3 BUCKET NAME===”;
    //s3存储桶-确保它存在
    如果(!s3Client.doesBucketExistV2(bucketName)){
    log(“S3存储桶不存在-无法继续!”);
    sendResponse(上下文,新的S3ToSFTPTestResponse(false),输出);
    返回;
    }
    String fileName=“===S3文件名===”;
    File localFile=null;
    试一试{
    localFile=File.createTempFile(文件名“”);
    //获取对象
    S3Object S3Object=s3Client.getObject(bucketName,文件名);
    //从对象获取流
    InputStream InputStream=s3Object.getObjectContent();
    //将对象流写入临时文件
    copy(inputStream、localFile.toPath()、StandardCopyOption.REPLACE_EXISTING);
    }捕获(例外e){
    logger.log(“未能从S3获取文件:+e.toString());
    }
    if(localFile==null){
    sendResponse(上下文,新的S3ToSFTPTestResponse(false),输出);
    返回;
    }
    //现在,您将文件存储在本地
    //根据需要修改它
    // .....
    //最后,将文件发送到SFTP
    布尔fileSaved=saveFilesToSFTP(上下文,localFile);
    log(“fileSaved:+fileSaved”);
    sendResponse(上下文,新的S3ToSFTPTestResponse(true),输出);
    }
    公共布尔存储文件到FTP(上下文、文件…文件){
    //这仅用于测试-在实际应用中,我建议
    //不要将这些信息存储在代码中。
    //您应该使用诸如机密管理器或参数存储之类的服务
    最后一个字符串sftpHostname=“===sftpHostname==”;
    最后一个字符串sftpUsername=“===SFTP用户名===”;
    最后一个字符串SFTPASSWORD=“===SFTP密码===”;
    字符串remoteFolderPath=“/root/S3Files/”;
    试一试{
    SSHClient ssh=新的SSHClient();
    addHostKeyVerifier((主机名1,端口,密钥)->true);
    ssh.connect(sftpHostname);
    logger.log(“SSHClient Connected!”);
    试一试{
    ssh.authPassword(sftpUsername、sftpPassword);
    logger.log(“SSHClient Authenticated!”);
    try(SFTPClient sftp=ssh.newSFTPClient()){
    用于(文件:文件){
    put(新文件系统文件,remoteFolderPath);
    }
    }捕获(例外e){
    logger.log(“未能获取SFTPClient:+e.toString());
    返回false;
    }
    }最后{
    ssh.disconnect();
    }
    }捕获(例外e){
    logger.log(“SFTP连接失败:+e.toString());
    返回false;
    }
    返回true;
    }
    public void sendResponse(上下文上下文、S3ToSFTPTestResponse响应、OutputStream输出){
    Gson Gson=new GsonBuilder().setPrettyPrinting().create();
    字符串responsest=gson.toJson(响应);
    logger.log(“响应:\n”+responsest);
    试一试{
    OutputStreamWriter writer=新的OutputStreamWriter(输出,StandardCharsets.UTF_8);
    作者:write(responsest);
    作家。