LoginSignup
15
3

More than 3 years have passed since last update.

AWS CDKでStepFunctionsを構築しました。

Last updated at Posted at 2019-12-07

この記事は ハンズラボ Advent Calendar 2019 7日目の記事です。

お疲れさまです。@naokiurです。
今年も担当させて頂きます。

最近は業務でAWSリソースを構築する際に、
CloudFormationやServerlessで、
コード化することを心がけています。
(用法用量と守り、目的を忘れないようにしつつ…)

おかげでYAML形式ファイルを書くことはだんだん慣れてきました。

そんな中、
AWS CDKというものの存在を知り、
しかもAWS CDKで、Javaと .NET 用が一般利用が可能に!!

個人的にJavaも好きな自分、
せっかくなので、AWS CDKをJavaで試しました。

Overview

自分もおすすめされたのですが、
AWSが公開しているCDK Workshopが、
CDK何もしらなかった自分にとってすごく良かったです!

環境

  • MacBook Pro (Retina 13-inch、Early 2015)
  • macOS Mojave 10.14.6
  • Java 1.8.0_191
  • IntelliJ IDEA CE 2019.2.4

やったこと

最近業務でStepFunctionsを作成したので、
StepFunctionsの構築を、AWS CDKで実施しました。

内容

cdkコマンドインストール

npm install -g aws-cdk

プロジェクトテンプレート作成

以下コマンドで、Java用のプロジェクトテンプレートを生成することができます。

cdk init --a {プロジェクト名} --language java

スクリーンショット 2019-12-07 16.35.36.png

Mavenプロジェクトです。
個人的にちょっとなつかしいです。
ここでは、 プロジェクト名 = sampleとしました。

AppとStack

プロジェクトテンプレートを生成すると、
SampleAppSampleStackが生成されました。

Stackは名前の通り、
これがCloudFormationの1Stackになるのだ、
と認識しております。

デフォルトでは、
SQSとSNSを作成するStackになっているようです。

スクリーンショット 2019-12-07 16.52.06.png

pom.xml

coreとは別に、
AWSサービスごとに依存関係を記載しています。
使用するAWSサービスが増えた場合、依存関係を追加する必要があるようです。

スクリーンショット 2019-12-07 16.52.54.png

StepFunctionsの構築

デフォルトのSQSとSNSは削除し、
LambdaとStepFunctionsをStackに追加します。

依存関係の追加

LambdaとStepFunctionsのライブラリをpom.xmlに追加します。

pom.xml
<dependency>
    <groupId>software.amazon.awscdk</groupId>
    <artifactId>lambda</artifactId>
    <version>1.18.0</version>
</dependency>
<dependency>
    <groupId>software.amazon.awscdk</groupId>
    <artifactId>stepfunctions</artifactId>
    <version>1.18.0</version>
</dependency>
<dependency>
    <groupId>software.amazon.awscdk</groupId>
    <artifactId>stepfunctions-tasks</artifactId>
    <version>1.18.0</version>
</dependency>

StepFunctionsに関しては、
stepfunctionsだけでなく、
stepfunctions-tasksを追加する必要があります。

Stackにリソースの追加

LambdaとStepFunctionsのリソースを追加します。
{Resource}.Builder.hoge().fuga().build()という形で、
リソースを生成することができることが多いようにお見受けしました。

個人的な好みですが、なんとなく記述が揃っていて見やすい気がします。

SampleStack.java
public class SampleStack extends Stack {
    public SampleStack(final Construct parent, final String id) {
        this(parent, id, null);
    }

    public SampleStack(final Construct parent, final String id, final StackProps props) {
        super(parent, id, props);

        final Function hello = Function.Builder.create(this, "HelloHandler")
                .runtime(Runtime.PYTHON_3_6)
                .code(Code.fromAsset("lambda"))
                .handler("hello.lambda_handler")
                .build();

        final Function world = Function.Builder.create(this, "WorldHandler")
                .runtime(Runtime.PYTHON_3_6)
                .code(Code.fromAsset("lambda"))
                .handler("world.lambda_handler")
                .build();

        final Task helloTask = Task.Builder.create(this, "HelloTask")
                .task(InvokeFunction.Builder.create(hello).build())
                .build();

        final Task worldTask = Task.Builder.create(this, "WorldTask")
                .task(InvokeFunction.Builder.create(world).build())
                .build();

        final StateMachine machine = StateMachine.Builder.create(this, "SampleStateMachine")
                .definition(helloTask.next(worldTask))
                .build();
    }
}

Lambdaファイルの格納

Lambda上で実際に動かすメソッドは、
srcディレクトリと同列のディレクトリ配下に格納する必要があるようです。

実際にLambda上で動かすメソッドは、Javaでなくても問題ないので、
ここではPythonファイルを準備しました。

スクリーンショット 2019-12-07 17.42.58.png

デプロイ

実行してなかったので、まず以下コマンドを実行します。

cdk bootstrap

デプロイ用のS3バケットを作成するStackを作成してくれます。

デプロイのために、
以下コマンドを実行します。

mvn package
cdk deploy

以上によって、
CloudFormation上にStackを作成できました。

スクリーンショット 2019-12-07 17.53.17.png

リソース

無事にStepFunctionsが作成され、
実行することができました!

スクリーンショット 2019-12-07 17.53.17.png
スクリーンショット 2019-12-07 17.53.36.png

感想

  • 当然のことながら、各AWSリソースを構成するために必要なものは決まっていて、それがどのJavaクラスに当てはまるのか、というのを変換しつつ書く必要があるな、と感じました。
    • とはいえ、わかりやすい命名になっている(※個人の感想です)ので、そこまで手間ではないかなあ
    • InvokeFunctionがどこにあるかわからなくて少しだけ迷いました
    • (TypeScriptですが)サンプルをちゃんと読めば迷わなかったはず…
  • deployしたときにエラーが起きて、修正して、デプロイして、またエラー…ということは、 全くなかったです
    • 簡単な構成だからかもですが…
    • 書き間違いだったら、 コンパイルエラーにしてくれる感じ
  • 補完ってすばらしい!!!

ハンズラボ Advent Calendar 2019
8日目は、 @watarukura さんです!

参考にさせて頂きました

15
3
1

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
15
3