Help us understand the problem. What is going on with this article?

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

この記事は ハンズラボ 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 さんです!

参考にさせて頂きました

naokiur
Java -> メール屋さん -> Python & JavaScript。 投稿内容は、個人の意見です。
https://note.mu/naokiur
hands-lab
ハンズラボは小売業特化型ITソリューション企業です。数十万に及ぶ膨大な商品マスタを扱ってきた豊富なノウハウで、お客様の現場に最適なシステムを提案・開発します。 エンジニア募集中
https://www.hands-lab.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした