AWS Step Functionsの活用方法のご紹介

AWS Step Functionsはアマゾン ウェブ サービス(AWS)が提供するワークフローサービスです。200以上あるAWSのサービスを組み合わせることができる他に、AWS Lambdaを呼び出すことも可能なため、独自の処理を記述した複雑なワークフローも実現可能です。

主な活用用途として、抽出、変換、ロード (ETL) プロセスの自動化や、機械学習用のデータ準備、マイクロサービスのオーケストレーションなどが公式サイト上で挙げられています。

AWS Step Functionsの構築イメージを掴むため、「休みの日にEC2インスタンスが起動していると通知する仕組み」をAWS Step Functionsを使って構築してみたいと思います。

実現したいこと

今回実現したいことをフローチャートにしました。このようなフローをAWS Step Functionsで構築してみたいと思います。

AWS構成

AWS Step Functionsを定期実行し、実現します。

構築手順

Amazon Simple Notification Service (Amazon SNS)

メール通知を行うAmazon SNSを作成します。

トピックの作成

aws sns create-topic --name "check-ec2-topic"

サブスクリプションの作成

aws sns subscribe \
    --topic-arn "arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:check-ec2-topic" \
    --protocol email \
    --notification-endpoint "xxxxx@xxxxx"

「AWS Notification - Subscription Confirmation」という件名のメールが届くので、[Confirm subscription]をクリックします。

AWS Systems Manager Change Calengar

AWS Systems ManagerにはChange Calendarという機能があり、登録したカレンダーの状態をOPENかCLOSEDで取得できます。

カレンダーを作成

CLIから登録することはできないようなので、AWS Systems Managerのマネージメントコンソールを使用します。左メニューの[カレンダーの変更]をクリックし画面遷移し、[カレンダーを作成]をクリックします。 カレンダー名を入力します。カレンダータイプは[デフォルトで開く]を選択し、カレンダーを作成します。

作成すると、このようなカレンダーの画面が表示されます。

土日の予定の登録

休みの情報を[イベントを作成]から登録します。 繰り返しの予定も登録できるようになっています。

登録すると、カレンダー上でも確認ができます。

祝日の登録

祝日情報を全て手で入力するのは大変です。Change Calendarでは、iCal形式のデータの取り込みができるので、祝日情報は他所から持ってきましょう。 Googleカレンダーの祝日情報はここから入手可能です。

Googleカレンダーの祝日を取り込む際の注意なのですが、タイムゾーンがUTCになってしまうので、入手したiCalファイルからX-WR-TIMEZONE:UTCの記述を削除します。Change Calendarで新しいカレンダーを作成し、iCalからインポートします。iCalファイルにタイムゾーン情報がない場合は、ファイル選択後、画面でタイムゾーンの指定ができます。

将来の祝日情報はiCalファイル中には存在していないので、定期的に取り込みを行って上書きをする必要があるようです。

Change Calendarの使い方

指定した時間がOPENなのかCLOSEDなのか状態を取得できます。

2022/1/29(土)9:00の場合
aws ssm get-calendar-state --calendar-names "Holiday" "JapaneseHolidays" --at-time "2022-01-29T09:00:00+09:00"
{
    "State": "CLOSED",
    "AtTime": "2022-01-29T00:00:00Z",
    "NextTransitionTime": "2022-01-29T14:59:59Z"
}

CLOSEDが返ってきます。期待通りです。 カレンダーは複数指定ができるので、土日か祝日の場合はCLOSED、それ以外の日はOPENが返却されます。

AWS Step Functions

次はAWS Step Functionsの設定です。 まずはステートマシンを新規作成します。作成方法を選択は[ワークフローを視覚的に設計]を、タイプは[Express]を選択して作成します。

GUIでワークフローを作成できます。完成するとこのような形になります。

一つ一つのフローの内容を見ていきます。

GetCalendarState

Change Calendarを呼び出したいので、左の項目からGetCalendarStateを探し出し、真ん中に持ってきます。 右側のAPI パラメータに以下のJSONを記述します。要はCLIの引数と同じ内容です。

{
  "CalendarNames": [
    "JapaneseHolidays",
    "Holiday"
  ]
}

at-timeのパラメータがない場合は、現在時刻でのOPENかCLOUSEDかの状態を取得できます。

ChoiceCalendar

左のアクションにあるChoiceを追加します。これは、いわゆるIF文です。 右のChoice Rulesのところで、 $.State is equals to String context CLOSED となるように設定を行います。

$はChoiceへのインプットを指しており、一つ前のGetCalendarStateの出力です。

DescribeInstances

左からDescribeInstances(たくさん見つかりますが、EC2のもの)を追加します。

APIパラメータはこのようになります。

{
  "Filters": [
    {
      "Name": "instance-state-name",
      "Values": [
        "running"
      ]
    }
  ]
}

CLIで表現すると以下のとおりです。(CLIは[]の省略が可能ですが、JSONでは厳密に記述する必要があります。)

aws ec2 describe-instances --filters "Name=instance-state-name,Values=[running]"

DescribeInstancesの結果のJSONから、インスタンスIDだけが必要なので、出力を変換します。右側の出力タブのResultSelector を使用して結果を変換します。 ここにJSONを記述します。

{
  "Instances.$": "$..InstanceId"
}

JSONのValue側に$を使いたい時は、Key側を「Key名+.$」と記述します。 そして「$..InstanceId」はJsonPathという書式で「ルート配下のInstanceIdすべて」という意味になります。

ChoiceCount

Choiceを追加します。「起動中のインスタンスが存在したら」を実現したいので、「InstanceIdの数 > 0」のようなことをしたいのですが、どうもできないようです。 なので、条件は[$.Instances[0]]が[is present](存在したら)になりました。

SNS Publish

SNS Publishを追加します。今までのものと異なり、統合タイプが選択でき、OptimizedとAWS SDKがあります。「昔はAWS Step Functionsで対応しているサービスが少なかったけど、AWS SDKタイプが増えていろんなサービスとつながるようになりました。」ということのようです。

「AWS Step Functions が AWS SDK 統合で 200 を超える AWS のサービスのサポートを追加」

Amazon SNSの場合はOptimizedがあり、設定が少し楽です。Topicに前の手順で作成したAmazon SNSのトピック名を入力します。 メッセージは、この内容がメールで送信されるので、少しだけわかりやすく変換しました。

これでAWS Step Functionsは完成です。

Amazon EventBridge

Amazon EventBridgeで定期的にAWS Step Functionsを実行する設定を行います。

名前と説明

項目名設定内容
名前check-ec2-events

パターンを定義

設定内容
スケジュール
Cron式
0 0 * * ? *

これで毎日AM9:00(日本時間)にAWS Step Functionsが実行されます。

動作結果

お知らせメールが届くことを確認しました。

まとめ

今回は「休みの日にEC2インスタンスが起動していると通知する仕組み」を題材に、AWS Step Functionsの構築方法を紹介しました。「ローコードのビジュアルワークフローサービス」という位置づけのサービスではありますが、プログラム知識やAWSのCLIに対する理解が必須であると感じました。

当社では、今回紹介したAWS Step FunctionsをはじめとするAWSのサービスを活用したシステム構築を支援しています。クラウド移行やIoTなど、様々な利用シーンでお客様にご活用いただいています。

実際のお客様の利用シーンはこちらをご参照下さい。
富士ソフト アマゾン ウェブ サービス(AWS)のお客様事例はこちら


森田 和明森田 和明(Kazuaki Morita)

エリア事業本部
西日本支社 インテグレーション&ソリューション部
ITアーキテクトグループ
主任 / フェロー

この記事を読んだ人はこちらの記事も読んでいます。