TL;DR
--S3 Presigner zum AWS SDK für Java 2.0 hinzugefügt
Dieser Artikel richtet sich an Backends, die AWS mit Java und Scala verwenden, sowie an alle Personen, die mit SRE-Vorgängen befasst sind.
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.
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
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
"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.
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.
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()
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))
[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).