TL;DR
--S3 Presigner ajouté à AWS SDK pour Java 2.0
Cet article est destiné aux backends utilisant AWS avec Java et Scala, et à toute personne engagée dans des opérations SRE.
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.
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
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
"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.
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.
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()
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))
[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)