News
适用于 Kotlin 并支持协同程序的新 AWS SDK
Read this post in other languages:
适用于 Kotlin 的新 AWS SDK 已于 2021 年 12 月在 AWS re:Invent 上宣布。 您可以使用此 SDK 构建与 Amazon S3、Amazon EC2、DynamoDB 等协同工作的 Kotlin 应用程序。 SDK 目前处于预览阶段,预计很快会推出稳定版。
从头开始设计 SDK 是为了支持 Kotlin 语言及其最佳做法,为 Kotlin 开发者提供与 AWS 交互的熟悉和惯用体验。 SDK 利用 Kotlin 协同程序进行异步实现,并计划使其兼容 Kotlin 多平台项目。
要开始在 Kotlin 程序中使用新 SDK,您需要向项目添加相应的依赖项。 例如,如果要与 DynamoDB 通信,则需要 aws.sdk.kotlin:dynamodb
模块:
repositories {
mavenCentral()
}
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0")
// The following line adds a dependency on the dynamodb client.
// For demonstration purposes, we use 0.+ to get the latest version
implementation("aws.sdk.kotlin:dynamodb:0.+")
}
您可以在 AWS SDK 文档 中找到受支持模块的完整列表。
下载依赖项后,即可开始使用 API:
import kotlinx.coroutines.runBlocking
import aws.sdk.kotlin.services.dynamodb.DynamoDbClient
//sampleStart
fun main() = runBlocking {
val client = DynamoDbClient { region = "us-east-2" }
val resp = client.listTables { limit = 10 }
println("Current DynamoDB tables: ")
resp.tableNames?.forEach { println(it) }
client.close()
}
//sampleEnd
该程序只会检索表的列表,并将表名打印到标准输出中。 在上面的示例中,listTables
是一个挂起函数,因此代码被包装到 runBlocking
调用中。
我们来看一个稍微复杂一点的示例,演示如何将存储桶中的每个 S3 对象下载到本地临时目录(包含分页访问、并发流和字节流响应)。
import aws.sdk.kotlin.services.s3.S3Client
import aws.sdk.kotlin.services.s3.model.GetObjectRequest
import aws.sdk.kotlin.services.s3.model.ListObjectsV2Request
import aws.sdk.kotlin.services.s3.paginators.listObjectsV2Paginated
import aws.smithy.kotlin.runtime.content.writeToFile
import kotlinx.coroutines.flow.asFlow
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.flatMapConcat
import kotlinx.coroutines.flow.flowOf
import java.nio.file.Paths
import kotlin.io.path.createDirectories
//sampleStart
suspend fun downloadAllS3Objects(bucketName: String) {
val s3 = S3Client.fromEnvironment()
val listReq = ListObjectsV2Request {
bucket = bucketName
}
s3.listObjectsV2Paginated(listReq)
.flatMapConcat { it.contents?.asFlow() ?: flowOf() }
.filter { it.size > 0 }
.collect { obj ->
val getReq = GetObjectRequest {
bucket = bucketName
key = obj.key
}
s3.getObject(getReq) {
val path = Paths.get(System.getProperty("java.io.tmpdir"), obj.key)
path.parent.createDirectories()
it.body?.writeToFile(path)
}
}
}
//sampleEnd
在上面的示例中,您可以再次看到 SDK 中挂起函数的使用:getObject
和 writeToFile
函数都使用 suspend
关键字进行标记。
您可以在适用于 Kotlin 的新 AWS SDK 的官方文档中找到有关如何入门 的详细分步说明。 此外,您还可以找到许多有趣的示例 ,它们使用 Amazon DynamoDB、S3、Rekognition、Amazon Simple Notification Service 和 AWS Key Management Service 等一系列 AWS 服务来演示 API。
适用于 Kotlin 的新 AWS SDK 正在积极开发中,您可以在路线图 中查看计划的功能。 立即试用,并告诉我们您的想法!
英文博文原作者: