通过在AWS中的其他实例上运行的tomcat访问一个实例的文件

时间:2015-02-17 10:43:57

标签: linux amazon-web-services amazon-ec2 web-deployment aws-ec2

我有两个AWS-EC2 linux实例 一个用于DB和doc文件,另一个用于运行java应用程序的tomcat 我有一个场景,用户可以下载文件,即位于第二个实例上的文件 我谷歌为它,我有一些选项,如NFS,FTP等,我不确定哪一个在性能和安全性方面都很好。
谢谢。

1 个答案:

答案 0 :(得分:0)

使用已有服务的一种方法是SCP。

首先,生成密钥对:

$ ssh-keygen -b 4096 -C "tomcat-servlet-key"

将私钥保存在Tomcat实例上/path/to/my-key,并将/path/to/my-key.pub的内容复制到文件存储实例上的/home/fileowner/.ssh/authorized_keys。 (有关如何添加 fileowner 用户的信息,请参阅AWS docs on adding users,并确保 fileowner 对要提供的文件具有读取权限。)

您可以使用Ant Scp task在servlet代码中使事情变得更容易:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.optional.ssh.Scp;
import com.google.common.io.Files;

public class ScpServlet extends HttpServlet {

    private static final String SERVER_2_USER = "fileowner";
    private static final String SERVER_2_PRIVATE_IP = "10.0.0.xyz";
    private static final String PRIVATE_KEY_FILE = "/path/to/my-key";

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        Scp scp = new Scp();
        scp.setProject(new Project());
        scp.setRemoteFile(SERVER_2_USER + '@' + SERVER_2_PRIVATE_IP + ":/tmp/hello.txt");
        File outfile = File.createTempFile("hello", ".txt");
        try {
            scp.setLocalTofile(outfile.getAbsolutePath());
            scp.setKeyfile(PRIVATE_KEY_FILE);
            scp.setHost(SERVER_2_PRIVATE_IP);
            scp.setUsername(SERVER_2_USER);
            scp.setTrust(true);
            scp.execute();
            response.setContentType("text/plain");
            try (OutputStream out = response.getOutputStream()) {
                Files.asByteSource(outfile).copyTo(out);
            }
        } finally {
            outfile.delete();
        }
    }

}

您可以锁定安全组中的文件存储实例,该安全组仅允许从VPC中的其他实例进行访问。

此解决方案有一个不必要的中间步骤,即将文件复制到Tomcat实例上的磁盘以从那里提供服务,但您可以扩展Scp任务以将字节保留在内存中。