このライブラリは、AWS CDK Javaのラッパーライブラリです。
AWS CDKの各モジュールに対してヘルパー関数・ライブラリ群が自動生成され、Kotlin DSLでインフラ設定が書けるようになります。
Circle CIにより毎日、日本標準時で午後2時にCDKのアップデートのチェックが行われ、アップデートがあった場合はコード生成・デプロイが行われます。
Gradle Kotlin DSL
repositories {
mavenCentral()
maven("https://cdk.lemm.io/maven")
}
dependencies {
implementation("io.lemm.cdk.kotlin", cdk_module, "$cdk_version-$dsl_version")
}
AWS-CDK-Kotlin-DSLの各モジュールは、AWS CDK Javaの各モジュールに1:1で対応しています。
"$moduleName"の部分に適宜必要なモジュール名を補完してください。
アップロード済みバージョンの一覧は core/maven-metadata.xml か、(古いバージョンの場合)ここを確認してください。
完全な例は example
プロジェクトにあります。
以下の内容は、AWS CDKのチュートリアルの様に、S3 Bucketを追加してみます。
CDKそのもののセットアップの解説は省略します。
Appを作成し、その下にStackを作成、その後synthするという流れはJavaと同じです。
fun main() {
App().apply {
exampleStack()
synth()
}
}
exampleStack()
は以下の様に定義します。
import io.lemm.cdk.kotlin.core.*
fun App.exampleStack() = Stack("example-stack") {
// 必要があればStackの設定をここで行います。
// 無ければ省略可能です。
// 詳細な説明は省略します。
}.apply {
// 以後、ここにResourceの設定を足していきます。
}
以下のように記述することでS3 Bucketを追加できます。
import io.lemm.cdk.kotlin.services.s3.*
Bucket("MyFirstBucket") {
versioned = true
encryption = BucketEncryption.S3_MANAGED
}
CDK Kotlin DSLのスコープ内では、nullableなListとMapに対して+演算子及び+=演算子が利用可能です。
以下はその利用例です。
Bucket("MyFirstBucket") {
versioned = true
encryption = BucketEncryption.S3_MANAGED
metrics += BucketMetrics {
id = "example"
tagFilters += "a" to "b"
}
}
この'+'演算子は、元のList/Mapがnullの時は新しいList/Mapを作って返すという処理を行う拡張関数です。
そのため、これを使うとIntelliJで警告が出るため、以下のアノテーションをファイルに追加しておくことを推奨します。
@file:Suppress("SuspiciousCollectionReassignment")
AWS CDKは元はTypeScriptで記述されており、Jsiiというライブラリにより自動生成されたコードを通してJVMからTypeScriptのAPIにアクセスしています。
そのため、TypeScriptに存在していてもJava/Kotlinでは存在しない言語機能が使われている場合、コードが複雑になる場合があります。
CDKではいくつかのプロパティにUnion型
というJava/Kotlinに無い機能が使われています。
これを表現するため、AWS-CDK-Kotlin-DSLではsealed classを用いています。
そのため、元となるクラスとsealed classへの変換処理が必要になります。
ここでは、CfnBucket
クラスを例に該当プロパティの利用方法を見ていきましょう。
CfnBucket("MyCfnBucket") {
bucketName = "cfn-bucket"
}
CfnBucket
のobjectLockEnabled
というプロパティを例にとってみましょう。
objectLockEnabled
プロパティは、元はBoolean
とIResolvable
を取りうるUnion型です。
このプロパティにtrue
を代入する事を考えます。
もっとも安直な方法はコンストラクターを直接呼び出すことです。
objectLockEnabled = CfnBucketPropsBuilderScope.ObjectLockEnabled.Boolean(true)
ただし、これは非常に冗長です。
これよりも非常に単純で古典的な方法があります。
objectLockEnabled = true.toObjectLockEnabled()
最後に、コードは非常に短くなるものの、文脈によってはわかりにくい方法を紹介します。
objectLockEnabled /= true
各関数はDSLのスコープ内でのみ利用可能な拡張関数として実装されているため、衝突等の可能性が無く安全です。