【AWS】LambdaでPythonを簡単に定期実行してみた

【AWS】LambdaでPythonを簡単に定期実行してみた プログラミング

今回はPythonで作成したツールをAWS上で定期実行を行う仕組みを作りたいと思います。通常であれば、作成したPythonファイルを手動実行する必要がありますが、手動実行しなくても、決まりきった時間になるとシステムが自動で実行してくれる設定を行いたいと思います。

定期自動実行する方法として、WindowsPCであればタスクスケジューラを使うやり方がありますが、常にPCの電源をONにしておく必要があるのでハードルが高いです。また、いちからレンタルサーバーを立てて作るのも大変なのでサーバーレスのクラウドファンクションを使用した設定を行いと思います

全体の流れ

LambdaEventBridgeCloudWatchLogsを使用して、Pythonファイルの定期実行と実行結果を確認していきたいと思います。

  1. Lambda関数を作成
  2. Pythonファイルを作成する
  3. Lambda関数にPythonファイルをアップロードする
  4. テストする
  5. EventBridgeのスケジューラを設定
  6. CloudWatchLogsで実行結果の確認

Lambdaとは

サーバーレスでプログラムを実行できるマネージドサービスです。サーバーを意識せず利用でき構築やメンテナンスは不要となり、小規模なアプリケーションには向いていますが、タイムアウト(3秒、最大900秒)や同時リクエスト(100、最大100まで)などの制約もあるため、アクセス数や実行時間の長い大規模なアプリケーションには不向きです。
APIGWやEventBridgeを利用することでAPIからの呼び出しやイベント・定期実行も可能となります。

EventBridgeとは

様々なアプリケーションやサービス間でイベントを統合し、自動化するため懸け橋となるサービスです。イベント駆動型アーキテクチャの構築に使用され、イベントをリアルタイムで受信し、関連する処理につなげることができます。
今回はスケジューラを使用することで決まりきった時間になるとLamba関数を実行することができるようになります。

料金

LambdaとEventBridgeは無料利用枠が設定されているので、以下の範囲内の利用で料金は発生せず、サービスを構築できると思います。

  • Lambda:リクエスト回数とプログラムの実行時間により課金。月100万リクエスト・40GBのコンピューティングリソース使用まで無料
  • EventBridge:10ルールまで無料

詳細手順

1. Lamba関数

・Lambdaのコンソールへ行き、Lambda関数を作成

・ランタイムでpython3.12を指定
・IAMロールは基本的なもので新規作成(cloudwatchへログを提供するロールになります。)
AWSサービスにアクセスする場合は、それに応じたIAMロールを付与する

2. Pythonファイル作成

今回は定期実行のテストのためとてもシンプルなコードです。requestsを使用して、Webページ情報を取得しログ出力する処理になります。

import requests

def lambda_handler(event, context):
    response=requests.get("https://www.python.org/")
    print(f"イベントログ:{event}")
    text=response.text[:200]
    print(f"ページ情報:{text}")
    return {
        "status":"OK"
    }

3. Lambda関数にPythonファイルをアップロードする

・Lambda側にpythonファイルをアップロードすることができます。その際にファイルをzip化する必要があります。
・ファイル名は「lambda_function.py」で「lambda_handler(event,context)」の関数内に処理を記述します。(上記のファイルの通り)
※eventは、Lambda関数実行時の呼び出しの原因となったイベント情報(S3のアップロード時など)が含まれており、contextでは実行環境に関する情報が含まれています。
※もしファイル名や関数名を変更する場合は、Lambda側のコンソールのハンドラで「ファイル名.関数名」を実行するようにデフォルトから変更設定する必要がある

・関数>コードの画面より、アップロード元を選択しZipファイルをアップロードします。

・コード画面に作成したPythonコードが表示されます。ただこれだけでは実行でエラーが発生してしまうので、外部ライブラリの呼び出し設定を追加する必要があります。

外部ライブラリの呼び出し方法

Lambda上からはPythonの標準ライブラリしか呼び出しできませんので、requestsなどの外部ライブラリを利用する場合は、別途呼び出しの設定をする必要があります。

ざっと調べた感じいくつか外部ライブラリを呼び出す方法がありました。

  1. 外部ライブラリを含めたZipをアップロード
  2. LambdaレイヤーでARNを指定

①の場合だと、ライブラリをローカルにインストールして依存関係を考慮してzip化する必要があるので、面倒だと思ったので②で実施してみました。

①の解説は以下の記事でを参考にしています。

LambdaにPythonの外部モジュールをzipで読み込ませる方法
AWS公式ガイド

②の場合は、既存で用意されているARNをレイヤーに設定するだけなので、かなりシンプルで簡単に設定できます。
・以下にアクセスし、deployments>pythonランタイム>csvに対象のライブラリのARNが記載されています。
GITHUB ARN一覧
・確認したARNをレイヤーに設定します。Lambda間で共通するコンポーネントをレイヤーとして定義し、それぞれの関数から参照することができる(5つまで)

4. テストする

・アップロードしたファイルをテストしてみます。テストをクリックします。

・基本的にはデフォルトのままでテストを作成します。

・問題なくファイルの実行ができます。

5. CloudWatchのEventBridgeを設定

トリガーの追加をクリックします。

・EventBridgeを選択し、定期実行の日時の設定を行います。記述形式はCron式(分 時 日 月 曜日 コマンド)で記述しています。時刻はUTCで設定する必要があるので、設定したい時刻から9時間引いた時刻で日本時間が設定できます

Cron式の記述については以下に詳細が記載されています。
AWS公式ガイド

今回は、18:40に定期実行する設定にしています。

6. CloudWatchLogsで実行結果の確認

CloudWatchのコンソールでロググループを開き、対象のLamba関数をクリックしてログストリームの画面に行きます。18:40に実行ログが出力されています。

まとめ

今回はPythonファイルの定期実行を行うために、AWSのLambdaとEventBridgeを使用する方法を解説しました。LambdaもEventBridgeもどちらも操作少なく簡単に設定できる、かつ利用料も安価なため、簡易的な小規模のアプリケーションであれば気軽に導入できるんじゃないかと思います。

次回以降の記事でPythonで作成したアプリをLambdaを使って動かす解説を行いたいと思います。

タイトルとURLをコピーしました