動機

  • Notionのダッシュボードにワークログを作った
    • これを毎晩デイリーページに転機して、ダッシュボードからはクリーンアップする処理を定期実行したい
    • AWS幼稚園児・GCP高校生くらいのスキル感なので、AWSで構築してみる

料金体型

Lambda

こいつがタダで結構使えることは知ってるが、一応確認しておく

今回想定しているのは大体10秒くらいで終わる処理なので、全然余裕で収まる

AWS Lambda の無料利用枠には、1 か月あたり 100 万件の無料リクエストと、1 か月あたり 40 万 GB-s のコンピューティングタイムが含まれており、x86 および Graviton2 プロセッサの両方を搭載した機能を利用できます。

Lambda の無料利用枠は、Provisioned Concurrency が有効になっている関数には適用されません

料金 - AWS Lambda |AWS

EventBridge

なんかいっぱいあってわからんけど、たぶんスケジューラーってやつかな

であればこれも余裕でタダだ

スケジューラー

無料利用枠: 無料利用枠の場合、EventBridge Scheduler を無料でご利用いただけます。月間 14,000,000 回の呼び出しを無料で行うことができます。いくつかのアプリケーションは、この無料利用枠内で運用できる場合があります。

料金 - Amazon EventBridge | AWS

料金ついでにNotionのAPIキーに関してはParameter Storeを使わずLambdaの環境変数に入れておけば十分かな。

外部から叩かれる用途ではないし、KMSで暗号化されるみたいだし。

https://blog.flatt.tech/entry/lambda_secret_security

Lambdaを建設

  • とりあえずおててでLambdaを作る。

  • CI/CDに関してはあとで考えたいので、とりあえず手元でzipにしてアップロードする。

     zip -r source.zip notion-create-daily-report
  • 設定>環境変数で環境変数を追加する

  • おもむろに実行してみるとエラー。

    2024-01-27T07:11:19.298Z	undefined	ERROR	Uncaught Exception 	
    {
        "errorType": "Runtime.ImportModuleError",
        "errorMessage": "Error: Cannot find module 'index'\nRequire stack:\n- /var/runtime/index.mjs",
        "stack": [
            "Runtime.ImportModuleError: Error: Cannot find module 'index'",
            "Require stack:",
            "- /var/runtime/index.mjs",
            "    at _loadUserApp (file:///var/runtime/index.mjs:1087:17)",
            "    at async UserFunction.js.module.exports.load (file:///var/runtime/index.mjs:1119:21)",
            "    at async start (file:///var/runtime/index.mjs:1282:23)",
            "    at async file:///var/runtime/index.mjs:1288:1"
        ]
    }
    • ディレクトリをzipしてたので階層が深くなっていたのが原因。
  • 修正するも、またエラー。

    "errorMessage": "2024-01-27T07:28:30.070Z 540d8c70-d7ef-438e-9a60-bb2843ffbea5 Task timed out after 3.02 seconds"
    • デフォルトのタイムアウトが3秒らしく、10秒くらいに伸ばしてみると成功した。
  • ケチケチするために、CloudWatch Logsの保持期間を1週間にしておく。

    スクリーンショット 2024-01-27 16.44.01.png

スケジューラの設定

  • EventBridge>スケジュールで設定していく

    スクリーンショット 2024-01-27 15.56.25.png

    • フレックスタイムウインドウの使い道が謎

      フレックスタイムウィンドウ

      フレックスタイムウィンドウを選択した場合、スケジューラは指定した時間枠内でスケジュールを呼び出します。例えば、15 分を選択した場合、スケジュールはスケジュールの開始時刻から 15 分以内に実行されます。

  • 再試行は無効化した。落ちても人が死ぬバッチじゃないし、気付かずに無料枠食い尽くすのを避けたい。

  • ウィザードに従って進めたらできあがった

スクリーンショット 2024-01-27 16.07.14.png

  • 出来上がったはいいが、即時実行みたいなコマンドがなかったのでスケジュールをいじってすぐ実行するように変更したら、そのままLambdaが実行された。

感想

  • Lambdaはともかく、EventBridge Scheduleは簡単に設定できてよかった。
  • GithubActionsで定期実行でもいいけど、あっちはあくまでCI/CDだからバッチ的な用途は想定外だよね
  • おててでzipデプロイは流石に体験が最悪なので、次回はGithubActionsでのlambdaデプロイの設定をするぞ