サーバレスアーキテクチャの構築にStep Functionsという選択

毎月投稿10月分滑り込みギリギリの僕です。みなさまお元気でしょうか。

これまでクラウドインフラエンジニアあるいはSREエンジニアとして複数のサーバレスアーキテクチャの設計構築運用を行ってきましたが、お恥ずかしながら一度もAWS Step Functionsを触ることはありませんでした。

今後今まで以上に複雑なサーバレスアプリケーションの開発に携わることもあると思いますので、今のうちに予習しておこうと思いついでに記事にしちゃいたいと思います。

Step Functionsとは

AWS Step Functions(以下、Step Functions)は、分散アプリケーションやマイクロサービスのワークフローを視覚的に構築・実行できるサービスです。

AWS LambdaやAWS SNSなど200以上のAWSサービスをGUIで組み合わせて構築できるのは革命的です。なんで今まで触ってこなかったんだろう…。

そこまで複雑ではないアプリケーションはぶっちゃけLambda一本で付随サービスを絡めた処理まで出来ちゃうのが現実ではあります。

しかし、大量の処理が複雑に絡み合うようなアプリケーションを構築する場合にはStep Functionsはとても便利そうです。

準備

早速Step Functionsを試していきたいのですが、Step Functionsはあくまで既に存在しているサービスの組み合わせを担うサービスなので、まずは材料となるサービスを用意します。

今回用意したLambdaのコードは以下です。実行するとPayloadとして名前と年齢を返す非常にシンプルなものです。デプロイはご自由にどうぞ。(Lambrollオススメ!)

package main

import (
	"github.com/aws/aws-lambda-go/lambda"
)

type Response struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func HandleRequest() (Response, error) {
	return Response{
		Name: "John Dow",
		Age:  20,
	}, nil
}

func main() {
	lambda.Start(HandleRequest)
}

もう一つの材料はSNSです。今回はTerraformで作成しますが、用意できればなんでもいいでしょう。

下記Terraformを利用する場合はplan, apply実行時にメールアドレスを入力して下さい。作成後の承認メール対応も忘れずに!

resource "aws_sns_topic" "cost_reporter" {
  name = "step-function-test-topic"
}

resource "aws_sns_topic_subscription" "cost_reporter" {
  topic_arn = aws_sns_topic.cost_reporter.arn
  protocol  = "email"
  endpoint  = var.sns_email_adress
}

variable "sns_email_adress" {}

それぞれAWS上に作成出来ましたら早速Step Functionsを利用してみます。

実際に使ってみる

それでは利用してみましょう。コンソール画面でStep Functionsのページに移動します。ステートマシンの作成をクリックして早速構築開始です。

今回は以下のようなフローを作成してみました。簡単な年齢認証のようなものです。

Step Functionsのなんとも便利なのはそれぞれの実行結果(出力)を次のフローに伝播できる点だと思います。

例えば今回のフローの場合、Lambdaを実行することをで得た出力(Payload)をSNSに渡すようにしています。Choice Ruleは以下の通りです。

名前が入っていなかったり、年齢が20以下だと登録が失敗するようなメッセージをメールで送るようになっています。

これらのワークフローをGUI上で資格的に構築することができました!ぜひ実際に実行してEmailが送信されることを確認してみて下さい!また、コードを修正して別ルールに引っ掛かるかなど確認していただければと思います。

もちろんこれくらいの処理ならぶっちゃけLambda関数に全部書いちゃった方が早いです。ですが、実際に触ってみて使う価値があるなぁと思うポイントがあったので紹介します。

Step Funcitonsを利用するメリット

Step Funcitonsを利用するメリットはまずなんとしてもアーキテクチャのワークフローが視覚化されていることです。

昨今のサーバレスアーキテクチャの構築ではAWS SAMやAWS CDKなどIaCを利用されることが多いと思います。別途アーキテクチャ図があるなら問題ないのですが、そうでない場合はエンジニアはコードリーディングで構成を読み解く必要があります。リーディング力で理解度に差が出てしまうのが困ったポイントといえるでしょうか。

Step Functionsで構築されたアーキテクチャではステートマシンがそのままアーキテクチャ図になるのでインプットのハードルが下がります。

また、Lambda関数を並行して実行したい場合や一度に複数のサービスを対象に一気に処理したい場合など大規模かつ複雑なアーキテクチャを構築する必要がある場合、Step Functinosはかなり効力を発揮しそうです。

一応デメリットも述べておくとIaCに比べて冪等性が少し心許ない気がします。一応構成をJsonでコード管理できるのですが、資格的に構築できるというメリットがなくなってしまうのが難点ですね…。

大人数での運用を想定している場合は管理やCI/CDにおいて工夫が必要そうだと思いました。

まとめ

今回はStep Functionsを使ってみました。

こんなに本格的な構築を視覚的にできるようになるなんていい時代になりましたね!

IaCの波が大きくやってきてもはや追い越していく勢いですが、ぜひもう一つの選択肢としてStep Functionsを持っておきたいなと思います。

最後まで読んでいただきありがとうございました!

AWS

Posted by CY