S3 Presigner ajouté à aws-sdk-java-v2

TL;DR

--S3 Presigner ajouté à AWS SDK pour Java 2.0

introduction

Cet article est destiné aux backends utilisant AWS avec Java et Scala, et à toute personne engagée dans des opérations SRE.

Qu'est-ce qu'une URL signée S3?

S3 dispose d'un mécanisme pour restreindre l'accès à un objet en signant l'URL qu'il émet pour le télécharger et le télécharger.

AWS SDK for Java 2.10.12 ou version antérieure

Avant le kit AWS SDK pour Java 2.10.12, AwsS3V4Signer était utilisé pour générer des URL prédéfinies. Ci-dessous, l'exemple de code est écrit en scala.

before.scala


import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider
import software.amazon.awssdk.auth.signer.AwsS3V4Signer
import software.amazon.awssdk.auth.signer.params.Aws4PresignerParams
import software.amazon.awssdk.http.{SdkHttpFullRequest, SdkHttpMethod}

val request = SdkHttpFullRequest
  .builder()
  .encodedPath("bucket/key")
  .host("s3.ap-northeast-1.amazonaws.com")
  .method(SdkHttpMethod.GET)
  .protocol("https")
  .build()

val params = Aws4PresignerParams
  .builder()
  .expirationTime(Instant.now().plusSeconds(300)
  .awsCredentials(DefaultCredentialsProvider.create().resolveCredentials())
  .signingName("s3")
  .signingRegion("ap-northeast-1")
  .build()

AwsS3V4Signer.create().presign(request, params).getUri

//Format de l'URL signée générée
// https://s3.ap-northeast-1.amazonaws.com/bucket/key?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20200625T000000Z&X-Amz-SignedHeaders=host&X-Amz-Expires=300&X-Amz-Credential=XXX&X-Amz-Signature=YYY

AWS SDK for Java 2.10.12 ou version ultérieure

Depuis AWS SDK for Java 2.10.12, S3 Presigner a été ajouté [^ 1]. Vous pouvez continuer à utiliser Aws S3V4Signer, mais il est recommandé d'utiliser S3 Presigner. La raison en sera expliquée plus tard, mais d'un autre côté, AwsS3V4Signer est toujours utilisé pour l'implémentation interne de S3Presigner.

after.scala


import software.amazon.awssdk.regions.Region
import software.amazon.awssdk.services.s3.model.GetObjectRequest
import software.amazon.awssdk.services.s3.presigner.S3Presigner
import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest

val presigner: S3Presigner = S3Presigner
    .builder()
    .region("ap-northeast-1")
    .build()

val request = GetObjectRequest
  .builder()
  .bucket("bucket")
  .key("key")
  .build()

val presignRequest = GetObjectPresignRequest
  .builder()
  .signatureDuration(Duration.ofSeconds(300))
  .getObjectRequest(request)
  .build()

presigner.presignGetObject(presignRequest).url.toURI

//Format de l'URL signée générée
// https://bucket.s3.ap-northeast-1.amazonaws.com/key?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20200625T000000Z&X-Amz-SignedHeaders=host&X-Amz-Expires=300&X-Amz-Credential=XXX&X-Amz-Signature=YYY

Qu'est ce qui a changé?

  1. virtual-hosted style Si vous comparez les URL générées avant et après, vous pouvez voir que les positions des noms de compartiment sont différentes.
"https://s3.ap-northeast-1.amazonaws.com/bucket/key" //Avant: path style
"https://bucket.s3.ap-northeast-1.amazonaws.com/key" //arrière: virtual-hosted style

Voir ci-dessous pour les différences entre les deux.

  1. Demande au format chemin
  2. Demande au format d'hébergement virtuel
val request = SdkHttpFullRequest
  .builder()
  .encodedPath("key")
  .host("bucket.s3.ap-northeast-1.amazonaws.com")
  .method(SdkHttpMethod.GET)
  .protocol("https")
  .build()

En outre, AwsS3V4Signer peut également générer une URL signée de style hébergé virtuel en définissant SdkHttpFullRequest comme ci-dessus, mais S3Presigner n'a pas besoin de connaître la méthode d'implémentation.

2. Comment spécifier le protocole

Dans AwsS3V4Signer, vous pouvez spécifier le protocole comme indiqué dans la partie .protocol (" https "). Cependant, S3Presigner n'a pas de méthode pour spécifier le protocole. Cela est dû au fait que https est spécifié en interne par défaut. Il est difficile d'imaginer la scène à utiliser, mais vous pouvez également sélectionner http en écrasant le point de terminaison comme indiqué ci-dessous.

val presigner: S3Presigner = S3Presigner
    .builder()
    .region("ap-northeast-1")
    .endpointOverride(new URI("http://s3.ap-northeast-1.amazonaws.com"))
    .build()

3. Comment spécifier la date d'expiration

Dans AwsS3V4Signer, c'était un moyen de spécifier une date et une heure futures que vous souhaitez définir comme date d'expiration. Cependant, S3 Presigner utilise une méthode pour spécifier la période de validité comme Durée.

//Avant
val params = Aws4PresignerParams
  .builder()
  .expirationTime(Instant.now().plusSeconds(300)

//arrière
val presignRequest = GetObjectPresignRequest
  .builder()
  .signatureDuration(Duration.ofSeconds(300))

Résumé

[Le style de chemin d'Amazon S3 sera obsolète - l'histoire après cela-](https://aws.amazon.com/jp/blogs/news/amazon-s3-path-deprecation-plan-the-rest-of-the- récit /)

AWS a annoncé qu'il ne prendrait pas en charge le style de chemin pour les buckets créés après le 30 septembre 2020. Par conséquent, on peut dire que les modifications apportées à S3 Presigner doivent être traitées tôt.

[^ 1]: Pour savoir comment l'ajouter, cliquez ici [https://github.com/aws/aws-sdk-java-v2/issues/203)

Recommended Posts

S3 Presigner ajouté à aws-sdk-java-v2
Enregistrer l'icône Twitter sur s3
[Note] Télécharger depuis S3, télécharger vers S3
télécharger l'image pour refiler heroku S3