Die Verwendung der im alten SDK bereitgestellten AmazonS3Client-Klasse wird als veraltet behandelt, und es wird in der Referenz geschrieben, dass AmazonS3ClientBuilder verwendet werden kann, aber es scheint, dass es nur wenige japanische Dokumente gibt. Ich werde es daher als Erinnerung belassen.
S3Access.java
package s3test;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.Protocol;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder.EndpointConfiguration;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.DeleteObjectsRequest;
import com.amazonaws.services.s3.model.DeleteObjectsRequest.KeyVersion;
import com.amazonaws.services.s3.model.DeleteObjectsResult;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectInputStream;
public class S3Access {
private static final String ENDPOINT_URL = "https://s3-ap-northeast-1.amazonaws.com";
private static final String REGION = "ap-northeast-1";
private static final String ACCESS_KEY = "【Zugangsschlüssel】";
private static final String SECRET_KEY = "[Geheimer Schlüssel]";
//--------------------------------------------------
//hochladen
//--------------------------------------------------
public void putObject(String bucketName, String objectKey, int objectSize, InputStream is) throws Exception {
//Client-Generierung
AmazonS3 client = getClient(bucketName);
ObjectMetadata metadata = new ObjectMetadata();
//Stellen Sie nur die Größe für alle Fälle ein (Ausnahme, wenn inkonsistent)
metadata.setContentLength(objectSize);
//hochladen
client.putObject(bucketName, objectKey, is, metadata);
}
//--------------------------------------------------
//herunterladen
//--------------------------------------------------
public S3ObjectInputStream getObject(String bucketName, String objectKey) throws Exception {
//Client-Generierung
AmazonS3 client = getClient(bucketName);
//herunterladen
S3Object s3Object = client.getObject(bucketName, objectKey);
return s3Object.getObjectContent();
}
//--------------------------------------------------
//Massenlöschung
//--------------------------------------------------
public List<String> deleteObjects(String bucketName, List<String> objectKeys) throws Exception {
//Client-Generierung
AmazonS3 client = getClient(bucketName);
List<KeyVersion> keys = new ArrayList<KeyVersion>();
objectKeys.forEach(obj -> keys.add(new KeyVersion(obj)));
//Datei löschen
DeleteObjectsRequest request = new DeleteObjectsRequest(bucketName).withKeys(keys);
DeleteObjectsResult result = client.deleteObjects(request);
//Holen Sie sich den Schlüssel des gelöschten Objekts
List<String> deleted = new ArrayList<String>();
result.getDeletedObjects().forEach(obj -> deleted.add(obj.getKey()));
return deleted;
}
//--------------------------------------------------
//Client-Generierung
//--------------------------------------------------
private AmazonS3 getClient(String bucketName) throws Exception {
//Authentifizierungsinformationen
AWSCredentials credentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);
//Client-Einstellungen
ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setProtocol(Protocol.HTTPS); //Protokoll
clientConfig.setConnectionTimeout(10000); //Verbindungszeitüberschreitung(ms)
//Endpunkteinstellung
EndpointConfiguration endpointConfiguration = new EndpointConfiguration(ENDPOINT_URL, REGION);
//Client-Generierung
AmazonS3 client = AmazonS3ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.withClientConfiguration(clientConfig)
.withEndpointConfiguration(endpointConfiguration).build();
if(!client.doesBucketExist(bucketName)) {
//Ausnahme, wenn kein Eimer vorhanden ist
throw new Exception("S3 Eimer[" + bucketName + "]da ist nicht");
}
return client;
}
}
Objekte, die hochgeladen / heruntergeladen werden sollen, werden über InputStream übergeben. Es wird jedoch empfohlen, sie so zu ändern, dass sie bei Bedarf als Datei oder Byte-Array übergeben werden.
Die TransferManager-Klasse, die für den geteilten Upload usw. verwendet wird, wird ebenfalls als veraltet behandelt. Verwenden Sie stattdessen die TransferManagerBuilder-Klasse.
Beim Massenlöschen wird der Schlüsselwert des gelöschten Objekts zurückgegeben. Selbst wenn das zu löschende Objekt nicht vorhanden ist, scheint der Schlüsselwert so zurückgegeben zu werden, als ob er gelöscht worden wäre. Sie können bis zu 1.000 Elemente gleichzeitig löschen. Wenn dies überschritten wird, wird ein Fehler zurückgegeben, der auf einen Schlüsselfehler hinweist.
Da es sich um einen Beispielcode handelt, ist der Zugriffsschlüssel / der geheime Schlüssel fest im Code geschrieben. Wenn er jedoch auf EC2 ausgeführt wird, verwenden Sie die IAM-Rolle (später beschrieben). Wenn er außerhalb von AWS ausgeführt wird, speichern Sie ihn in DB usw. Es ist eine gute Idee, es regelmäßig (innerhalb von 90 Tagen) ersetzen zu können.
Wenn Sie die hochzuladenden Daten verschlüsseln möchten, lesen Sie bitte den folgenden Artikel. ** In S3 mit AWS SDK für Java / SSE-KMS hochgeladene Daten verschlüsseln **
Wenn Sie die Anwendung auf EC2 ausführen möchten, lesen Sie bitte den folgenden Artikel. ** Zugriff auf S3-Bucket mithilfe der SSE-KMS-Verschlüsselung in der EC2-IAM-Rollenumgebung (AWS SDK für Java) ** Wenn Sie die Daten nicht verschlüsseln möchten, müssen Sie die IAM-Rolle nicht an den Verschlüsselungsschlüssel (CMK) anhängen.
Recommended Posts