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