LoginSignup
4
1

More than 5 years have passed since last update.

AWS CDKをKotlinで試した

Last updated at Posted at 2018-09-06

AWS CDKの0.19に対応し修正しました

AWS CDK(AWS Cloud Development Kit)をKotlinで試しました。
公式ドキュメントのGetting StartedのJavaを参考に実装していきます。

awscdkのバージョン: 0.19.0
kotlinのバージョン: 1.3.11
gradleのバージョン: 5.0
OS: Mac

試したソースは tiibun/awscdk-kotlin に置いてあります。

cdkインストール

cdkコマンドラインツール(以下、cdk cli)をインストールします。
(kotlinで実装するのでコマンドラインツールは必要ないのではないかと思いましたが、deployするにはcdk cliが必要なようです。)

npm install -g aws-cdk
cdk --version

build.gradle.kts

Javaの1.8を指定していたのでkotlinのオプションに1.8を指定します。
また、dependenciesにawscdk/cdkを追加します。
下記は一部のみ載せます。

build.gradle.kts
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

tasks.withType<KotlinCompile>().all {
    kotlinOptions.jvmTarget = "1.8"
}

dependencies {
    implementation(kotlin("stdlib-jdk8"))
    implementation("software.amazon.awscdk:cdk:0.19.0") // 追加
}

変わったパッケージ名ですね。

Appのサブクラスを作成

software.amazon.awscdk.Appを継承したクラスを作成します。

src/main/kotlin/samples/HelloAwsCdk.kt
package samples

import software.amazon.awscdk.App

fun main(args: Array<String>) {
    val app = App()
    app.run()
}

cdk.jsonとapp.shを作成

JavaScriptはcdk.jsonだけで良さそうですが、Kotlin(Java)は一手間必要です。
ここは一部手順を公式ドキュメントと変えています。

build.gradle.ktsにapplicationを追加

build.gradle.kts
plugins {
    application
}

application {
    mainClassName = "samples.HelloAwsCdkKt"
}

main()はktファイルのトップレベルに書いたのでsamples.HelloAwsCdkKtとKtが付いてます。

app.shでgradlew runを指定します。第1引数にappを指定しています。
TERMの設定はgradleのインジケーターを出力しないようにするためです。

app.sh
#!/bin/bash

TERM=dumb
exec ./gradlew run --args "app $@"

cdk.jsonを作成します。cdk.jsonはcdk cliのオプションを設定したファイルになります。

cdk.json
{
    "app": "/bin/bash ./app.sh"
}

cdk実行

AWS credentialsを設定して(割愛)、cdk cliを実行します。

cdk ls -l

Appの中身は空なので[]と出力されます。

S3 Bucketを追加

いよいよAppの中身を追加します。公式ドキュメントの通り、S3バケットを追加します。
まずはStack(CloudFormationのスタック)を作成し、コンストラクタでバケットのインスタンスを生成します。
BucketのプロパティはBuilderパターンを使用しています。

src/main/kotlin/samples/MyStack.kt
package samples

import software.amazon.awscdk.App
import software.amazon.awscdk.Stack
import software.amazon.awscdk.services.s3.Bucket
import software.amazon.awscdk.services.s3.BucketProps

class MyStack(parent: App, name: String) : Stack(parent, name) {
    init {
        Bucket(this, "MyFirstBucket", BucketProps.builder()
                .withVersioned(true)
                .build())
    }
}

main関数では上記Stackを生成します。

src/main/kotlin/samples/HelloAwsCdk.kt
fun main(args: Array<String>) {
    val app = App()
    MyStack(app, "hello-cdk")
    app.run()
}

cdk再度実行

cdk ls -l

とすると今度はスタック名とenvironment情報(1234はアカウント)が出ます。

-
    name: hello-cdk
    environment:
        name: 1234/ap-northeast-1
        account: '1234'
        region: ap-northeast-1


[]と表示される場合はAWSの認証がうまくいっていない可能性があります。
cdk ls -l -vとすると出力が詳細に表示されます。
(私は最初regionの設定がなくて[]になりました。)
また、--profileオプションでcredentialsのprofileを指定できます。
私はAssume Roleで多要素認証を指定していたためうまくいきませんでしたが、
assume-roleを使ってできました。

CloudFormationテンプレート

次にCloudFormationテンプレートを表示します。

cdk synth hello-cdk

S3バケットの設定(バージョンあり)とCDKMetadataが表示されます。

Resources:
    MyFirstBucketB8884501:
        Type: 'AWS::S3::Bucket'
        Properties:
            VersioningConfiguration:
                Status: Enabled
    CDKMetadata:
        Type: 'AWS::CDK::Metadata'
        Properties:
            Modules: '@aws-cdk/aws-iam=0.8.2,@aws-cdk/aws-kms=0.8.2,@aws-cdk/aws-s3=0.8.2,@aws-cdk/aws-s3-notifications=0.8.2,@aws-cdk/cdk=0.8.2,@aws-cdk/cx-api=0.8.2,js-base64=2.4.5'

deploy

deployします。

cdk deploy

AWS上でCloudFormationスタックが作成されます。

削除する場合はdestroyします。

cdk destroy

まとめ

CloudFormationテンプレートを操作するにはPython製のtroposphereやGo製のGoFormationがありましたが、JavaScriptやJavaでも記述できるようになりました。しかもデプロイまでできます。
再利用がうまくできるといいですね。

おまけ

awscdkのコードを見てもTypeScriptだけでJavaのコードは出てきません。
どうやってるのかと調べたらawslabs/jsiiというツールが使われているようです。
TypeScriptのクラス定義からJavaのコードを作っています。
なんか凄そうです。

4
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1