Wie habe ich mich gefreut, als ich die Nachricht ueber die allgemeine Verfuegbarkeit des AWS SDK fuer Kotlin las. Endlich - Zeit, Kotlin fuer meine Infrastructure-as-Code-Projekte zu verwenden.
https://aws.amazon.com/about-aws/whats-new/2023/11/aws-sdk-kotlin/
In diesem Tutorial folge ich Amazons Anleitung, wie man einen S3 Bucket erstellt, ein Objekt aus einem ByteStream in den S3 Bucket legt und dann alles mit dem AWS SDK fuer Kotlin aufraumt. Ich musste ein paar Aenderungen am Original-Tutorial vornehmen, damit es in meiner Entwicklungsumgebung funktioniert. Alles in allem war es unkompliziert.
Hier ist die allgemeine AWS SDK fuer Kotlin Seite: https://aws.amazon.com/sdk-for-kotlin/
Das Tutorial, dem ich gefolgt bin, ist hier: https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/get-started.html
Zuerst erstellst du ein Gradle-Projekt. Ich habe die Standardeinstellungen beibehalten.
% mkdir aws-cdk-kotlin
% cd aws-cdk-kotlin
% gradle init --type kotlin-application --dsl kotlin
Project name (default: aws-cdk-kotlin):
Source package (default: aws.cdk.kotlin):
Enter target version of Java (min. 7) (default: 21):
Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no]
> Task:init
To learn more about Gradle by exploring our Samples at https://docs.gradle.org/8.5/samples/sample_building_kotlin_applications.html
BUILD SUCCESSFUL in 5s
2 actionable tasks: 2 executed
%Als Naechstes fuege die AWS SDK Abhaengigkeit hinzu.
in build.gradle.kts
...
dependencies {
...
implementation("aws.sdk.kotlin:s3:1.0.0")
}Hier ist der Tutorial-Code, leicht an neuere Syntax angepasst:
import aws.sdk.kotlin.services.s3.S3Client
import aws.sdk.kotlin.services.s3.model.*
import aws.smithy.kotlin.runtime.content.ByteStream
import kotlinx.coroutines.runBlocking
import java.util.*
val REGION = "eu-central-1"
val BUCKET = "bucket-${UUID.randomUUID()}"
val KEY = "my-s3-bucket-key"
fun main(): Unit = runBlocking {
S3Client.fromEnvironment { region = REGION }.use { s3 ->
setupTutorial(s3)
println("Creating object $BUCKET/$KEY...")
val putObjectRequest = PutObjectRequest {
bucket = BUCKET
key = KEY
body = ByteStream.fromString("Testing with the Kotlin SDK")
}
s3.putObject(putObjectRequest)
println("Object $BUCKET/$KEY created successfully!")
cleanUp(s3)
}
}
suspend fun setupTutorial(s3: S3Client) {
println("Creating bucket $BUCKET...")
val createBucketRequest = CreateBucketRequest {
bucket = BUCKET
createBucketConfiguration {
locationConstraint = BucketLocationConstraint.fromValue(REGION)
}
}
s3.createBucket(createBucketRequest)
println("Bucket $BUCKET created successfully!")
}
suspend fun cleanUp(s3: S3Client) {
println("Deleting object $BUCKET/$KEY...")
val deleteObjectRequest = DeleteObjectRequest {
bucket = BUCKET
key = KEY
}
s3.deleteObject(deleteObjectRequest)
println("Object $BUCKET/$KEY deleted successfully!")
println("Deleting bucket $BUCKET...")
val deleteBucketRequest = DeleteBucketRequest {
bucket = BUCKET
}
s3.deleteBucket(deleteBucketRequest)
println("Bucket $BUCKET deleted successfully!")
}Lass meinen Freund ChatGPT erklaeren, was der Code tut:
- Imports: Der Code importiert notwendige Klassen aus dem AWS SDK fuer Kotlin, einschliesslich S3-Client-Klassen und Modelle. Er importiert auch ByteStream fuer die Handhabung von Datenströmen und runBlocking fuer Coroutine-Unterstuetzung.
- Konstanten:
- REGION: Gibt die AWS-Region an (z.B. “eu-central-1”).
- BUCKET: Ein eindeutiger Bucket-Name wird mit UUID.randomUUID() generiert.
- KEY: Definiert den Schluesselnamen fuer das in S3 zu speichernde Objekt.
- Main-Funktion:
- Initialisiert einen S3-Client mit der angegebenen Region.
- Ruft setupTutorial auf, um einen neuen S3-Bucket zu erstellen.
- Erstellt ein Textobjekt im Bucket mit dem angegebenen Schluessel.
- Raeumt auf, indem das erstellte Objekt und der Bucket geloescht werden.
- setupTutorial-Funktion:
- Erstellt einen S3-Bucket in der angegebenen Region.
- Verwendet CreateBucketRequest, um den Bucket zu konfigurieren und zu erstellen.
- cleanUp-Funktion:
- Loescht das zuvor erstellte Objekt und den Bucket.
- Verwendet DeleteObjectRequest und DeleteBucketRequest zum Loeschen.
- Coroutine-Verwendung: Der runBlocking-Coroutine-Builder wird verwendet, um Suspend-Funktionen (setupTutorial und cleanUp) in main auszufuehren. AWS SDK-Aufrufe sind Suspend-Funktionen und erfordern einen Coroutine-Kontext.
Danke, ChatGPT.
Schliesslich fuehrte ich den Code aus und erhielt die erwartete Ausgabe:
Creating bucket bucket-bad30829-1f4f-432a-acf3-fccafac14ecf...
Bucket bucket-bad30829-1f4f-432a-acf3-fccafac14ecf created successfully!
Creating object bucket-bad30829-1f4f-432a-acf3-fccafac14ecf/my-s3-bucket-key...
Object bucket-bad30829-1f4f-432a-acf3-fccafac14ecf/my-s3-bucket-key created successfully!
Deleting object bucket-bad30829-1f4f-432a-acf3-fccafac14ecf/my-s3-bucket-key...
Object bucket-bad30829-1f4f-432a-acf3-fccafac14ecf/my-s3-bucket-key deleted successfully!
Deleting bucket bucket-bad30829-1f4f-432a-acf3-fccafac14ecf...
Bucket bucket-bad30829-1f4f-432a-acf3-fccafac14ecf deleted successfully!Das war einfach!
Vielen Dank fuers Lesen!