Also versuche ich einen Java SFTP Server zu erstellen, der als Frontend für Apache S3 Buckets fungiert. Sie verbinden sich über SFTP und verwalten S3-Dateien in Buckets wie Dateien auf dem SFTP-Server.Warum funktioniert s3fs nicht wie ein normales Dateisystem mit Apache MINA SSHD?
Ich habe Apache MINA (v1.2.0) als SFTP-Server verwendet, der funktioniert mit einem SftpSubsystemFactory
und Standard FileSystemFactory
(Bereitstellung des lokalen Dateisystems).
Ich habe Amazon-S3-FileSystem-NIO2 (v1.3.0) als FileSystem
, gewählt, der die Apache AWS SDK verwendet und scheint sich die beste Option, da zu sein
public class S3FileSystemFactory implements FileSystemFactory {
private URI uri = URI.create("localhost");
public S3FileSystemFactory(URI uri){
this.uri = uri;
}
public FileSystem createFileSystem(Session session) throws IOException {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
FileSystem s3FileSystem = FileSystems.newFileSystem(uri, new HashMap<String, Object>(), classLoader);
return s3FileSystem;
}
}
Ich gründe gerade dies als FileSystemFactory
für MINA
SshServer sshd = SshServer.setUpDefaultServer();
sshd.setKeyPairProvider(buildHostKeyProviderFromFile(hostKeyType));
sshd.setPasswordAuthenticator(createPasswordAuthenticator());
sshd.setPublickeyAuthenticator(AcceptAllPublickeyAuthenticator.INSTANCE);
sshd.setSubsystemFactories(createSubsystemFactories());
sshd.setFileSystemFactory(createFileSystemFactory());
URI uri = URI.create("s3:///s3.amazonaws.com/my_bucket");
FileSystemFactory s3FileSystemFactory = new S3FileSystemFactory(uri);
sshd.setFileSystemFactory(s3FileSystemFactory);
Ich kann mit diesem Server mit FileZilla/Command Line verbinden, aber es verbindet sich automatisch mit dem ImageTransfer
Bucket (nicht my_bucket
). Ich kann zu anderen Buckets navigieren, sogar zu Unter-Buckets, aber ich kann den Inhalt nicht anzeigen, alles sieht nur wie ein leeres Verzeichnis aus.
Dies kann über die FileSystem
I'm using erfolgen, wie ich Verzeichnisinhalte, wie so auflisten
Path p = s3FileSystem.getPath("/my_bucket");
String contents = "";
try (DirectoryStream<Path> stream = Files.newDirectoryStream(p, "*")) {
for (Path file : stream) {
contents += "\n \t - " + file.getFileName();
}
} catch (IOException | DirectoryIteratorException x) {}
Ich habe durch die s3fs, MINA und AWS-Code suchen (wie die Dokumentation ist sehr begrenzt), aber kann die Quelle dieses Problems nicht genau bestimmen. Kann jemand Licht auf das werfen, was ich falsch mache?
Logging
Mit Protokollierung für alle Bibliotheken eingeschaltet, bekomme ich nur eine Frage, die ich
"HEAD
application/x-www-form-urlencoded; charset=utf-8
Fri, 20 May 2016 09:58:07 GMT
/MYURL/."
2016-05-20 10:58:07.240 DEBUG 13323 --- [system-thread-1] c.a.http.impl.client.SdkHttpClient : Stale connection check
2016-05-20 10:58:07.243 DEBUG 13323 --- [system-thread-1] c.a.http.impl.client.SdkHttpClient : Attempt 1 to execute request
2016-05-20 10:58:07.434 DEBUG 13323 --- [system-thread-1] c.a.http.impl.client.SdkHttpClient : Connection can be kept alive indefinitely
2016-05-20 10:58:07.435 DEBUG 13323 --- [system-thread-1] com.amazonaws.request : Received error response: com.amazonaws.services.s3.model.AmazonS3Exception: Not Found (Service: null; Status Code: 404; Error Code: 404 Not Found; Request ID: MYREQID), S3 Extended Request ID: MYEXTREQID