Skip to content

Annexe F - Fichiers sur AWS

AWS propose un SDK pour permettre l'interaction avec les différents services qu'ils proposent à partir d'une application Java.

Le SDK peut être ajouté dans son entièreté comme dépendance, mais il est relativement "pesant". On peut donc importer seulement les parties qui sont nécessaires à l'application. Pour la manipulation des fichiers dans les ressources S3, on aura besoin d'ajouter 2 dpendances.

<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>s3</artifactId>
    <version>2.39.2</version>
</dependency>

<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>auth</artifactId>
    <version>2.39.2</version>
</dependency>

Créer un client S3

Instance S3

À partir de ce point, j'assume que vous avez déjà un Bucket S3 de créé et configuré sur AWS. Les instructions de connexion sont données pour le contexte de l'atelier pour étudiant. Dans un contexte réel il sera possible de générer des utilisateurs IAM pour se connecter au stockage S3.

Pour interagir avec un Bucket S3 il faudra créer le client dans l'application. Dans le cadre de l'atelier pour étudiant, nous créerons cette connexion avec les identifiants de session. Ces informations sont disponibles sur la page où vous lancez l'atelier.

  • À droite vous trouverez un lien d'information AWS Details
  • Une fois ouvert, vliquer sur Show pour exposer les informations.

AWS session

Dans le service qui s'occupe des opérations de lecture et écriture, on crée le client pour interagir avec le stockage.

String awsAccessKey = "";
String awsSecretAccessKey = "";
String awsSessionToken = "";
String bucket = "nom-du-bucket";

AwsSessionCredentials credentials = AwsSessionCredentials.create(awsAccessKey, awsSecretAccessKey, awsSessionToken);

S3Client s3Client = S3Client.builder()
        .credentialsProvider(StaticCredentialsProvider.create(credentials))
        .region(Region.US_EAST_1)
        .build();

La valeur des variables awsAccessKey, awsSecretAccessKey et awsSessionToken sont toutes récupérées des informations de la session.

Propriétés de configuration

Pour une meilleure gestion des informations de la session AWS, vous pouvez extraire ces informations dans des propriétés de configuration. Voir la gestion des clés de chiffrement pour les JWT comme exemple.

Effectuer des actions vers un Bucket S3

Client synchrone

Notez que pour ces exemples j'utilise un client synchrone, mais il existe également un client asynchrone pour interagir avec les services S3. Si votre application doit gérer des fichiers volumineux, considérez les méthodes asynchrones.

Téléverser un fichier

public String uploadFileToBucket(InputStream stream, Long size) {
    String key = UUID.randomUUID().toString();
    PutObjectResponse response =  s3.putObject(req -> req
            .bucket(bucket)
            .key(key),
            RequestBody.fromInputStream(stream, size)
    );

    return key;
}
public FileMetaData uploadToS3(MultipartFile file) throws IOException {
    try {
        validateFile(file);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }

    String key;
    try(InputStream inputStream = file.getInputStream()) {
        key = service.uploadFileToBucket(inputStream, file.getSize());
    }

    FileMetaData fileMetaData = FileMetaData
            .builder()
            .nomOriginal(file.getOriginalFilename())
            .nomStocke(key)                
            .build();

    return repository.save(fileMetaData);

}
  • Notez que comme pour la gestion de fichiers en local, je valide le fichier avant le téléverser.
  • Dans un Bucket S3, l'attribut key représente le chemin d'accès vers le fichier.
  • Pour organiser les fichiers en dossiers et sous dossiers on peut utiliser un nom de clé avec des /
    • String key = "dossier/" + UUID.randomUUID().toString();

Récupérer un fichier

public byte[] getFileResourceFromS3(String key) throws IOException {
    GetObjectRequest request = GetObjectRequest.builder()
            .bucket(bucket)
            .key(key)
            .build();

    ResponseBytes<GetObjectResponse> objectBytes =
            s3.getObjectAsBytes(request);

    return objectBytes.asByteArray();
}
public byte[] getFileS3(Long fileId) throws IOException {
    FileMetaData metadata = repository.getById(fileId);
    return service.getFileResourceFromS3(metadata.getNomStocke());
}

public FileMetaData getFileMetadata(Long fileId) throws IOException {
    return repository.findById(fileId).orElse(null);
}

Références

Documentation du SDK AWS pour Java

Documentation de S3 du SDK