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)のお客様事例はこちら