- クラウド技術
AWSでプログラムを定期実行する方法
- Python
- #AWS
目次
はじめに
【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc. 詳細はこちらから>
プログラムを定期的に実行したいけどサーバもないし、PCを24時間起動しておきたくない! というときに便利なAWSのサービスの組み合わせを紹介します。
今回はS3上のテキストファイルに定期的に値を出力する処理を作成していきます。
環境
AWS:Lambda
AWS:Amazon EventBridge
AWS:S3
言語:Python 3.9
Lambdaの準備
まずはプログラムを実行するためのLambdaを用意していきます。 下記を設定後、「関数の作成」をクリックすると関数が作成されます。
Amazon EventBridgeでスケジュールを作成
Lambdaを定期実行できるようにスケジュールを作成していきます。
※スケジュールは作成後でも変更可能です。
スケジュールの対象としてLambdaで作成した関数を指定します。
これ以降の設定は今回はデフォルトのままで作成しています。
書き込み先のファイルをS3に用意
バケットを作成し、書き込みに使用するファイルをローカルからアップロードしていきます。
Lambdaの関数からS3上のファイルへ書き込むためのポリシーを設定
ポリシーを設定することで読み取り書き込み等の許可を与えることができます。
Lambdaの「設定」→「アクセス権限」→ロール名をクリック
(ここでは「ScheduleBatTest-role-dv78p6d2」)
デフォルトでCloudWatch logsの許可ポリシーが設定されている為、
「編集」からS3へのアクセス権限を追加していきます。
既存のポリシー内にS3のポリシーを追記します。
・追記するポリシー
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*", "s3:Put*", "s3-object-lambda:Get*", "s3-object-lambda:List*", "s3-object-lambda:Put*" ], "Resource": "arn:aws:s3:::bucketschduletest/*" } <span data-ccp-props="{"134245417":false,"335551550":6,"335551620":6,"335559737":105}"> </span> |
Lambdaへプログラムを記入していく
これで設定が完了したので、S3のファイルへ書き込むプログラムを作成していきます。
・lambda_function.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import json import datetime # aws import boto3 # aws用 BUCKET = 'bucketschduletest' # バケット名を指定 KEY = 'SchduleTest.txt' # 出力先ファイル名 def lambda_handler(event, context): # TODO implement #aws 前準備 s3_client = boto3.client('s3') # ファイル読み取り response = s3_client.get_object(Bucket=BUCKET, Key=KEY) body = response['Body'].read() # 日付取得 dt_now = datetime.datetime.now() val = body.decode('utf-8') + '\n' + dt_now.strftime('%Y/%m/%d %H:%M:%S') + '_Test' print(val) # 書き出し s3_client.put_object(Body = val, Bucket = BUCKET, Key = KEY |
※注意事項
・「Deploy」ボタンを押下しないと修正したプログラムは反映されません。
・Lambdaでdatetimeを使用するとUTCが設定されているため、日本時間が表示されません。
日本時間を設定する場合は下記画像のように環境変数を設定してください。
定期実行
これでスケジュールされたバッチを動作させることができます。
・定期実行後のSchduleTest.txt
(20分間で5分おきに実行するよう、スケジュールを設定しています)
1 2 3 4 |
2024/03/18 18:40:35_Test 2024/03/18 18:45:33_Test 2024/03/18 18:50:33_Test 2024/03/18 18:55:33_Test |
さいごに
多少設定が必要ですが、シンプルな構成でバッチ実行することができるようなりました。
また、Amazon EventBridgeはスケジュール以外にも他のAWSと連携してイベントを起こすことも可能なので、サービス内容を理解して使い分けていきましょう。
【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>