hatenob

プログラムって分からないことだらけ

AWS CDKのJava版がGAになったようなので触ってみる

タイトルの通りです。

aws.amazon.com

CloudFormationでJSONYAMLで書けばよいんですが、プログラム言語で書くことで条件分岐やループが使えるのと、IDEのサポートが受けられるあたりがメリットなんだと思います。
それだけならわざわざJavaで書かなくてもTypeScriptとかでよいような気がしますが、Javaで育ったのでJavaのほうが慣れているとか、周辺の環境的な事情や制約によってJavaのほうが嬉しい人も一定数いるんだと思います。僕みたいに。

何をするでもないのですが、とりあえずS3バケットを1つ作るコードを書いてみました。
書いただけでデプロイまではやってません。

ひな形を作ります。

> cdk init ap-cdk --language java

appかsample-appかを選びますが、空のプロジェクトならappでよいようです。
これでMavenプロジェクトが自動生成されます。

あとは生成されたクラスにS3バケットを作成するコードを書きます。

public class ApCdkStack extends Stack {
    public ApCdkStack(final Construct scope, final String id) {
        this(scope, id, null);
    }

    public ApCdkStack(final Construct scope, final String id, final StackProps props) {
        super(scope, id, props);

        Bucket.Builder.create(this, "ap-cdk-bucket").bucketName("ap-cdk-bucket-1").publicReadAccess(false)
                .versioned(true).build();
    }
}

作成したBucketオブジェクトを特に変数に入れるわけでもなく作りっぱなしみたいな感じですがこれでOKのようです。
中身は見ていませんが、Constructの変数にオブジェクトの参照を追加していってる感じなんでしょうかね。

とりあえずこれでsynthesizeしてみるとCloudFormation Templateの形式で出力されました。

> cdk synth
Resources:
  apcdkbucket04A81C10:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: ap-cdk-bucket-1
      VersioningConfiguration:
        Status: Enabled
    UpdateReplacePolicy: Retain
    DeletionPolicy: Retain
    Metadata:
      aws:cdk:path: ap-cdk/ap-cdk-bucket/Resource
  CDKMetadata:
    Type: AWS::CDK::Metadata
    Properties:
      Modules: aws-cdk=1.18.0,@aws-cdk/aws-events=1.18.0,@aws-cdk/aws-iam=1.18.0,@aws-cdk/aws-kms=1.18.0,@aws-cdk/aws-s3=1.18.0,@aws-cdk/core=1.18.0,@aws-cdk/cx-api=1.18.0,@aws-cdk/region-info=1.18.0,jsii-runtime=Java/11.0.5
    Condition: CDKMetadataAvailable
Conditions:
....

あとはこれをdeployすればよいみたいです。

ところで気になったのが、この場合のテストコードは何をテストするんだろうか?そもそもいるのだろうか?
宣言的に記述しているので、JSON/YAMLと同じく、ただ書いていくだけなら特にいらないんだろうなと思います。
まぁ、名称や設定が意図した通りになっているかをテストしてもよいんでしょうけど、労力に比して品質への寄与は少ないように思います。
条件分岐やループなんかを入れたときにはテストを書く、くらいでよいのかなと思います。