我有两个 AWS-EC2 linux 实例。
一个用于 DB 和 doc 文件,另一个用于运行 java 应用程序的 tomcat。
我有一个场景,用户可以下载位于第二个实例上的文件。
我用谷歌搜索它,我有一些选项,如 NFS、FTP 等,我不确定哪一个在性能和安全性方面都好。
谢谢。
问问题
83 次
1 回答
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
文件存储实例上。(有关如何添加文件所有者用户的信息,请参阅AWS 文档添加用户,并确保文件所有者对要提供的文件具有读取权限。)
您可以使用Ant Scp 任务来简化 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 任务以将字节保留在内存中。
于 2015-02-24T21:53:40.393 回答