S3 Presigner zu aws-sdk-java-v2 hinzugefügt

TL;DR

--S3 Presigner zum AWS SDK für Java 2.0 hinzugefügt

Einführung

Dieser Artikel richtet sich an Backends, die AWS mit Java und Scala verwenden, sowie an alle Personen, die mit SRE-Vorgängen befasst sind.

Was ist eine mit S3 signierte URL?

S3 verfügt über einen Mechanismus zum Einschränken des Zugriffs auf ein Objekt, indem die URL signiert wird, die zum Herunterladen und Hochladen ausgegeben wird.

AWS SDK für Java 2.10.12 oder früher

Vor dem AWS SDK für Java 2.10.12 wurde AwsS3V4Signer zum Generieren von vordefinierten URLs verwendet. Unten ist der Beispielcode in Scala geschrieben.

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 der generierten signierten URL
// 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 für Java 2.10.12 oder höher

Aus dem AWS SDK für Java 2.10.12 wurde S3 Presigner hinzugefügt [^ 1]. Sie können Aws S3V4Signer weiterhin verwenden, es wird jedoch empfohlen, S3 Presigner zu verwenden. Der Grund dafür wird später erläutert, andererseits wird AwsS3V4Signer weiterhin für die interne Implementierung von S3Presigner verwendet.

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 der generierten signierten URL
// 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

Was hat sich verändert?

  1. virtual-hosted style Wenn Sie die generierten URLs vorher und nachher vergleichen, können Sie feststellen, dass die Positionen der Bucket-Namen unterschiedlich sind.
"https://s3.ap-northeast-1.amazonaws.com/bucket/key" //Bisherige: path style
"https://bucket.s3.ap-northeast-1.amazonaws.com/key" //Rückseite: virtual-hosted style

Siehe unten für die Unterschiede zwischen den beiden.

  1. Anfrage im Pfadformat
  2. Anfrage im virtuellen Hosting-Format
val request = SdkHttpFullRequest
  .builder()
  .encodedPath("key")
  .host("bucket.s3.ap-northeast-1.amazonaws.com")
  .method(SdkHttpMethod.GET)
  .protocol("https")
  .build()

Darüber hinaus kann AwsS3V4Signer auch eine vom virtuellen Host gehostete signierte URL generieren, indem SdkHttpFullRequest wie oben festgelegt wird. S3Presigner muss jedoch die Implementierungsmethode nicht kennen.

2. So legen Sie das Protokoll fest

In AwsS3V4Signer können Sie das Protokoll wie im Teil ".protocol (" https ")" angegeben angeben. S3Presigner verfügt jedoch nicht über eine Methode zum Angeben des Protokolls. Dies liegt daran, dass https standardmäßig intern angegeben wird. Es ist schwer vorstellbar, welche Szene verwendet werden soll, aber Sie können auch http auswählen, indem Sie den Endpunkt wie unten gezeigt überschreiben.

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

3. So legen Sie das Ablaufdatum fest

In AwsS3V4Signer konnten Sie ein zukünftiges Datum und eine zukünftige Uhrzeit angeben, die Sie als Ablaufdatum festlegen möchten. S3 Presigner verwendet jedoch eine Methode zum Festlegen des Gültigkeitszeitraums als Dauer.

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

//Rückseite
val presignRequest = GetObjectPresignRequest
  .builder()
  .signatureDuration(Duration.ofSeconds(300))

Zusammenfassung

[Amazon S3-Pfadstil wird veraltet sein - die Geschichte danach-](https://aws.amazon.com/jp/blogs/news/amazon-s3-path-deprecation-plan-the-rest-of-the- Geschichte /)

AWS hat angekündigt, den Pfadstil für Buckets, die nach dem 30. September 2020 erstellt wurden, nicht zu unterstützen. Daher kann gesagt werden, dass Änderungen am S3 Presigner frühzeitig behandelt werden müssen.

[^ 1]: Weitere Informationen zum Hinzufügen finden Sie hier [https://github.com/aws/aws-sdk-java-v2/issues/203).

Recommended Posts

S3 Presigner zu aws-sdk-java-v2 hinzugefügt
Speichern Sie das Twitter-Symbol in s3
[Hinweis] Von S3 herunterladen, auf S3 hochladen
Bild hochladen, um Heroku S3 nachzufüllen