L'utilisation de la classe AmazonS3Client fournie dans l'ancien SDK est traitée comme obsolète, et il est écrit dans la référence qu'AmazonS3ClientBuilder peut être utilisé, mais il semble qu'il y ait peu de documents japonais, je vais donc le laisser comme un rappel.
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 = "【clé d'accès】";
private static final String SECRET_KEY = "[Clef secrète]";
//--------------------------------------------------
//télécharger
//--------------------------------------------------
public void putObject(String bucketName, String objectKey, int objectSize, InputStream is) throws Exception {
//Génération de clients
AmazonS3 client = getClient(bucketName);
ObjectMetadata metadata = new ObjectMetadata();
//Définissez uniquement la taille au cas où (Exception si incohérente)
metadata.setContentLength(objectSize);
//télécharger
client.putObject(bucketName, objectKey, is, metadata);
}
//--------------------------------------------------
//Télécharger
//--------------------------------------------------
public S3ObjectInputStream getObject(String bucketName, String objectKey) throws Exception {
//Génération de clients
AmazonS3 client = getClient(bucketName);
//Télécharger
S3Object s3Object = client.getObject(bucketName, objectKey);
return s3Object.getObjectContent();
}
//--------------------------------------------------
//Suppression groupée
//--------------------------------------------------
public List<String> deleteObjects(String bucketName, List<String> objectKeys) throws Exception {
//Génération de clients
AmazonS3 client = getClient(bucketName);
List<KeyVersion> keys = new ArrayList<KeyVersion>();
objectKeys.forEach(obj -> keys.add(new KeyVersion(obj)));
//Supprimer le fichier
DeleteObjectsRequest request = new DeleteObjectsRequest(bucketName).withKeys(keys);
DeleteObjectsResult result = client.deleteObjects(request);
//Récupère la clé de l'objet supprimé
List<String> deleted = new ArrayList<String>();
result.getDeletedObjects().forEach(obj -> deleted.add(obj.getKey()));
return deleted;
}
//--------------------------------------------------
//Génération de clients
//--------------------------------------------------
private AmazonS3 getClient(String bucketName) throws Exception {
//Informations d'authentification
AWSCredentials credentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);
//Paramètres du client
ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setProtocol(Protocol.HTTPS); //protocole
clientConfig.setConnectionTimeout(10000); //Délai de connection dépassé(ms)
//Réglage du point final
EndpointConfiguration endpointConfiguration = new EndpointConfiguration(ENDPOINT_URL, REGION);
//Génération de clients
AmazonS3 client = AmazonS3ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.withClientConfiguration(clientConfig)
.withEndpointConfiguration(endpointConfiguration).build();
if(!client.doesBucketExist(bucketName)) {
//Exception s'il n'y a pas de seau
throw new Exception("Seau S3[" + bucketName + "]il n'y a pas");
}
return client;
}
}
Les objets à charger / télécharger sont passés via InputStream, mais il est recommandé de changer pour passer en tant que fichier ou tableau d'octets selon les besoins.
La classe TransferManager utilisée pour le téléchargement fractionné, etc. est également considérée comme obsolète, utilisez donc la classe TransferManagerBuilder à la place.
Dans la suppression en bloc, la valeur de clé de l'objet supprimé est renvoyée, mais même si l'objet à supprimer n'existe pas, il semble que la valeur de clé soit renvoyée comme si elle avait été supprimée. Vous pouvez supprimer jusqu'à 1 000 éléments en même temps. S'il dépasse cela, une erreur indiquant une erreur de clé sera renvoyée.
Puisqu'il s'agit d'un exemple de code, la clé d'accès / clé secrète est solidement écrite dans le code, mais si elle est exécutée sur EC2, utilisez le rôle IAM (décrit plus loin), et si elle est exécutée en dehors d'AWS, enregistrez-la dans DB, etc. C'est une bonne idée de pouvoir le remplacer régulièrement (dans les 90 jours).
Si vous souhaitez crypter les données à télécharger, veuillez vous référer à l'article suivant. ** Crypter les données téléchargées vers S3 à l'aide du kit AWS SDK pour Java / SSE-KMS **
Si vous souhaitez exécuter l'application sur EC2, veuillez vous référer à l'article suivant. ** Accès au compartiment S3 à l'aide du chiffrement SSE-KMS dans l'environnement de rôle IAM EC2 (AWS SDK pour Java) ** Si vous ne souhaitez pas chiffrer les données, vous n'avez pas besoin d'attacher le rôle IAM à la clé de chiffrement (CMK).
Recommended Posts