定期的に見るWebページがあるのだが、その都度ブラウザを開いて見るのは面倒である。そこで定期的にそれらのページをチェックし、前回と差分があった時にメールで通知する仕組みをLambdaで作る。
なお、AWS主催の「 AWS Dev Day Online Japan「120分で学ぶ、サーバーレスのはじめ方 for Developers」」のハンズオンが非常に参考になった。Amazon EventBridge、Step Functionsは、このハンズオンのおかげで実装できた。感謝したい。

目次
今回構築するシステム構成
以下を構築していく。ざっくり説明すると、いわゆる「Crontab」をAmazon EventBridgeで実装し、定期的に処理を呼び出す。その呼び先となるのがStep Functionsである。そのStep Functionsでは、Lambdaを一つずつ実行していく(並行して実行することも可能)。1つ目のLambdaでは、スクレイピングを実施→結果をDynamoDBに保存し、2つ目のLambdaでは、DynamoDBでUpdateFlagが立っていると判定→Simple Notification Service(SNS)を使ってメール通知、というものである。

画期的な技術 Step Functions
このStep Function、何がすごいかというと、Lambdaの処理の順序を自由に変更できるというところである。

つまり、あらかじめ一つのLambdaに処理を全て記述するのではなく、何らかの条件で、Lambdaの呼び出しを分岐させたりすることが可能のため、各関数に一つのタスクに専念させるなど、処理の再利用や品質の向上に寄与しやすくなる。プログラム開発において処理の分岐は避けられないが、分岐が多いと可読性が落ちるデメリットがある。それをこのような形でビジュアルに確認することができるため、処理の見通しがよくなり、開発の心的負担を減らすことができる。
今後、分岐処理は全てStep Functionsに任せるとどうなるのか?調べたい。
Lambdaのベースとなる知識を得たハンズオン
ちなみに、今回構築のベースとなった知識は以下のハンズオンで得た。
■AWS Hands-on for Beginners | AWS
https://pages.awscloud.com/event_JAPAN_Hands-on-for-Beginners-Serverless-2019_LP.html

しかし・・残念ながら、2019年11月時点のハンズオンのためAWSの画面が古く、最新の画面ならもっとスムーズに進むのに・・と残念に思う場面も。ただ、やはり手を動かしながらのほうが理解が進むため、貴重な情報であることに変わりはない。そのため、2021年9月30日に行われた「 AWS Dev Day Online Japan「120分で学ぶ、サーバーレスのはじめ方 for Developers」」のハンズオンは、今の画面の最新の状態で実施いただいたので非常に参考になった。
CloudTrail を設定
サーバーレスのデメリットは、何か問題が発生した時にトラブルシュートが難しいことである。そのため、CloudTrailでの設定をしておくことにより、ログから不具合発生時のトラブルシュートを行うことが可能となる。
メニューの「認証」から「認証の作成」ボタンをクリック。

「認証名」を入力する。

「ログファイルの SSE-KMS 暗号化」のチェックボックスを外す。

「次へ」ボタンをクリック。

「データイベント」にチェックボックスをつける。

「次へ」ボタンをクリック。

「認証の作成」ボタンをクリック。

これで、CloudTrailの設定は完了。
空のLambdaを作成
Lambdaから、「関数の作成」ボタンをクリック。

「一から作成」で、関数名「scraping-function」を入力。

「ランタイム」に「Python 3.9」を選択。「関数の作成」ボタンをクリック。

同様に、2つ目のLambda、「notify-scraping-function」も中身空っぽで作成しておく。
Step Functionsを作成
「ステートマシン」メニューから、「ステートマシンの作成」ボタンをクリック。

ステップ1.作成方法を選択
作成方法は「ワークフローを視覚的に設計」、タイプは「標準」で「次へ」ボタンクリック。

ステップ2.ワークフローを設計
左の「Invoke」をドラッグ&ドロップ。

もう一つ「Invoke」をドラッグ&ドロップ。

それぞれのアイコンをクリックし、「状態名」を「Scraping Lambda Invoke」「Notify Lambda Invoke」とそれぞれ入力し、「APIパラメータ」の「Function name」に、「scraping-function」「notify-scraping-function」をそれぞれ選択して紐つける。

ステップ3.生成されたコードを確認
「次へ」ボタンをクリック。

ステップ4.ステートマシン設定を指定
ステートマシン名に「ScrapingMachine」を入力。

「ステートマシンの作成」ボタンをクリック。

これでStep Functionsが作成完了。
※途中でLambda関数を増やす時の注意点
あることが原因で処理の実行に失敗し続け、はまった点を記載しておく。


発生したエラーは以下のエラーである。
エラー:Lambda.AWSLambdaException
原因:User: arn:aws:sts::317057939332:assumed-role/StepFunctions-PutScrapingMachine-role-ef9f0e3d/YJBGVADPsNmsYUlHeEMfxikIzRUjtBXy is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:ap-northeast-1:317057939332:function:scraping-function:$LATEST because no identity-based policy allows the lambda:InvokeFunction action (Service: AWSLambda; Status Code: 403; Error Code: AccessDeniedException; Request ID: 09db9b50-37a4-45d9-af5c-f57a6d7a1c56; Proxy: null)
Lambdaに「ポリシーにアタッチ」しても直らず・・・。
しばらく試行錯誤してわかったことは、Step Functionsに対して権限を追加で付与していなかったためだった。Step Functionsは初期に設定したLambda関数を自動で許可するが、途中で関数の追加を行った場合、許可する関数を手動で追加してあげないといけない、ということ。
Step Functionsの「IAM ロール ARN」のリンクをクリックし・・・

「LambdaInvokeScopedAccessPolicy-5d436629-4dfa-4019-9076-329c90f57514」をクリックすると・・・

”Resource”に関数の許可がされていなかったため、「ポリシーの編集」で対象のLambda関数を追加することで動作するようになった。

次回は、Amazon EventBridgeの構築を行う。