AWS SAM(Step Functions + Lambda)を利用して複数のウェブサイトのレスポンスチェックをした話


My Redmine

最近、家族と過ごす時間が増えて、生活の質が向上したのを感じます。世の中大変な状況ですが、個人的には悪いことばかりではないなと、前向きに捉えるようにしています。

さて、今回はAWS SAM(Step Functions + Lambda)を利用して複数のウェブサイトのレスポンスチェックするコードを書いたので、その紹介をしたいと思います。使用するコードはGitHubにアップしてありますのでそちらを利用します。

ソースコード

GitHub
https://github.com/yoshiokaCB/sf-map-sample

動作環境(前提条件)

  1. AWS CLIがインストール済であること
  2. AWS SAMがインストール済であること
  3. AWSアカウントの準備 (使用するユーザに AdministratorAccess 相当の権限をつけておいてください。)

使い方

ダウンロード

https://github.com/yoshiokaCB/sf-map-sample.git
cd sf-map-sample

バケット作成

今回はAWS SAM(CloudFormation)を実行して設定を行います。CloudFormationでStackを作成する際に、S3にファイルをアップロードして置くと便利ですので、アップロード用のバケットを作成します。

aws s3 mb s3://[bucket_name]

デプロイ

packageコマンドで必要ファイルのアップロードとtemplateファイルのコンバートをしたのちにデプロイを開始します。

sam package -t template.yaml --output-template-file packaged.yaml --s3-bucket [bucket_name]
sam deploy --t packaged.yaml --stack-name response-check --capabilities CAPABILITY_IAM

下記のように表示されたら、デプロイ完了です。

Successfully created/updated stack - response-check

実行

あとはAWSのコーンソールから Step Functions のステートマシンを選択肢して実行します。


サービス選択

サービスを選択します。


ステートマシン選択

ステートマシンを選択します。


実行開始

実行の開始をします。


jsonデータを渡す

実行時に渡すパラメーター(json)は以下のような内容になります。

{
  "siteList": [
    {"url": "https://hosting.redmine.jp/"},
    {"url": "https://redmine.jp/"}
  ]
}

実行中

実行中です。実行が終了するまでじっと待ちます。


全体の結果

全体の実行結果です。出力を変更したい場合は、functions/checke_response/app.rb のコードを変更してください。


個別の結果

個別に条件を指定して実行結果を確認することも可能です。


イベントの履歴

イベントごとに実行履歴を時系列に確認することもできます。

解説

今回の処理の要点をかいつまんで補足説明したいと思います。

template.yamlについて

CheckResponseStateMachine:
  Type: AWS::Serverless::StateMachine
  Properties:
    DefinitionUri: statemachine/check_response.json
    DefinitionSubstitutions:
      CheckResponseFunctionArn: !GetAtt CheckResponseFunction.Arn
    Policies:
      - LambdaInvokePolicy:
          FunctionName: !Ref CheckResponseFunction

AWS SAM がStep Functionsに対応したおかげでめちゃくちゃ簡単に書けるようになりました。以前は実行に使用するpolicyは別に定義する必要があったのでそれだけでもかなり楽になります。また、DefinitionUri のパラメータで、ステートマシンの設定値(json)を外部ファイルに分割できるようになったのも大きいです。

check_response.jsonについて

{
    "Comment": "A state machine that check website response.",
    "StartAt": "Check Response",
    "States": {
        "Check Response": {
            "Type": "Map",
            "ItemsPath": "$.siteList",
            "MaxConcurrency": 1,
            "Iterator": {
              "StartAt": "IteratorState",
              "States": {
                "IteratorState": {
                  "Type": "Task",
                  "Resource": "${CheckResponseFunctionArn}",
                  "End": true
                }
              }
            },
            "End": true
        }
    }
}

TypeにMapが追加されて、受け取った値を元に動的に並列処理が実行できるようになりました!これまでのparallelでも並列処理ができましたが、その場合、全ての処理を書いてやる必要があったので、この機能によってかなり処理の幅が広がったように思います。

発展

今回はレスポンスのチェックをしただけですが、レスポンスの値が期待する値でなかった場合は通知処理が必要です。AWS SNS などを組み合わせて通知すると良いと思います。

まとめ

以上、簡単でしたが、AWS SAM(Step Functions + Lambda)を利用して複数のウェブサイトのレスポンスチェックする処理について紹介させていただきました。サーバレスで色々なバッチ処理が簡単に実装できるので、運用を気にせず開発に集中できるのはすごく幸せになれそうです。

ご興味のある方は是非お試しください。


My Redmine

こちらの記事もオススメです!
AWSを利用したハンズオン講座で講師を務めました(資料あり)
AWSを利用したハンズオン講座で講師を務めました。当日は参加者全員が予定していた内容を全て体験することができ、大好評でした!
はじめてのスマートウォッチにシャオミ(Xiaomi)を試してみる
シャオミ(Xiaomi)のスマートウォッチを使ってみた感想。
Redmineのガントチャートはもっと良くなるはず
Redmineのガントチャートを改善するパッチを開発しました。さらなる改善には大掛かりな改修が必要かも。
新型コロナウイルス(SARS-CoV-2)による影響の2020年4月時点での記録
ファーエンドテクノロジーにおける新型コロナウイルスの影響や対応(テレワークなど)の記録。
チームで共通のフックスクリプト(Git hook)を使っています
Gitでバージョン管理されたスクリプトをフックスクリプトとして実行するために core.hooksPath の設定を利用しました。
ファーエンドテクノロジーからのお知らせ(2024/04/17更新)
入門Redmine 第6版 出版記念セミナー「Redmine 8年分の新機能ふりかえり」【2024/4/18開催】
入門Redmine 第6版(2024年3月23日発売)に掲載された新機能に関する内容を執筆者・監修者が紹介します。
My Redmine 初回ご契約で「入門Redmine 第6版」プレゼントのお知らせ
Redmineのクラウドサービス「My Redmine」を初めてご契約いただいたお客様にRedmine解説書「入門Redmine 第6版」を進呈いたします。
2024年度ブランドパートナーに島根県在住のモデル ユイさんを継続起用
ユイさん(モデルスタジオミューズ所属)をファーエンドテクノロジーの2024年度ブランドパートナーとして継続して起用します。
My Redmine スタンダードプランおよびAdminサポートデスクプランの料金改定のお知らせ【2024年4月ご利用分より】
2024年4月ご利用分より、My Redmine スタンダードプラン(民間企業・個人向け及び官公庁向け)とAdminサポートデスクプランの料金を改定いたします。
Redmineの最新情報をメールでお知らせする「Redmine News」配信中
新バージョンやセキュリティ修正のリリース情報、そのほか最新情報を迅速にお届け