エンジニアのはしがき

プログラミングの日々の知見を書き連ねているブログです

AWS Glue(Python shell)をLambda代わりに使ってタイムアウトを伸ばす

f:id:tansantktk:20210221135248p:plain

AWS Lambdaは、サーバ自体のお守りが不要なのでさくっとバックエンドを構築したい場合はかなり便利です。 ただ難点を挙げるならば、タイムアウトが15分までしか伸ばせない点。 これは残念ながら仕様となっているのでどうしようもできません。

Lambda のクォータ - AWS Lambda

ただ、EC2で構築するとなるとサーバ管理が必要になり、現在の配置人員的にも保守コストがかかり過ぎる… ということで無理やりAWS GlueをLambda代わりにしました。

AWS Glueとは

aws.amazon.com

AWSの各サービスからのデータの抽出、変換、読込(ETL)に特化したサービス。 S3, RDS, EC2等のデータを抽出し、任意の変換処理をかけた後にその結果をCloudWatch等に流し込んだりということが出来るようです。 ただ私自身、ETLの用途で使用したことが無いので当記事ではETLの用途については割愛します。

今回やること

Glueジョブ(Python shell)をLambda代わりに使います。 シェルとしてpythonコードを実行できる環境が用意されますので、任意の処理をpythonコードで記述して実行が可能です。

Python shellのタイムアウトはデフォルトが2880分(48時間)とかなり長く、また制限無しで任意設定できるのでLambdaと比較すると長時間稼働させ続けられる点がメリットです。

注意点

Python shellではデフォルトの状態だと一部のpythonライブラリしかサポートされません。 詳細は公式の下記を参照下さい。

AWS Glue での Python シェルジョブの追加 - AWS Glue

Glueジョブを作ってみる

pythonコードを配置する為のS3バケットを作成する

f:id:tansantktk:20210206101858p:plain

分かりやすい名前を付けて、S3バケットを作成します。 今回はglue-python-shell-hogeというバケットを作りました。

ジョブの作成・設定

f:id:tansantktk:20210206101607p:plain

Glueの「ジョブ」画面から、「ジョブの追加」をクリックして作成画面に移動します。

f:id:tansantktk:20210206103638p:plain

f:id:tansantktk:20210206103112p:plain

各入力フォームに必要なパラメータを入力します。

項目 説明
名前 任意の名前を入力
IAM Glue用のIAMロールを指定。なければ別途新規作成が必要。
Type Python shellを指定
Pythonのバージョン 任意のバージョンを指定
このジョブ実行 ユーザーが作成する新しいスクリプトを指定
スクリプトファイル名 Glueジョブ実行時に最初に呼び出すpythonファイル名を指定
スクリプトが保存されているS3パス 前の手順で作成したS3バケットのパスを指定
ジョブのタイムアウト(分) 任意のタイムアウト設定を指定

f:id:tansantktk:20210206103505p:plain

接続の設定は不要なのでそのままジョブを保存します。

保存が完了すると、Glueのジョブ一覧に先ほど作成したHogeJobが表示されているはずです。

また、S3のglue-python-shell-hogeの中には中身は空のhoge_job.pyが作成されています。

pythonコードを書く

ローカル等任意の環境でhoge_job.pyに任意の処理を書きます。 とりあえず今回は単純にprint()するだけの処理を書いてみます。

hoge_job.py

print('hello, glue!')

コードが書けたらS3のglue-python-shell-hogeにアップロードします。 これでGlueジョブの準備はできました。

Glueジョブの実行

AWSコンソール上から実行する

f:id:tansantktk:20210206105359p:plain

ジョブ名の左となりのチェックボックスにチェックを入れた状態で、「ジョブの実行」を選択すると実行されます。 なお実行環境が立ち上がり、pythonコードが実行されるまでは体感で5~20秒程度かかりました。

実行結果の確認

f:id:tansantktk:20210206105720p:plain

ジョブを選択すると画面下部に実行結果が表示されます。

ログには標準出力を保持するログとジョブ実行中のエラーを保持するエラーログがあります。 それぞれCloudWatchに保管されており、ログまたはエラーログをクリックすれば、CloudWatchの画面で内容確認ができます。

f:id:tansantktk:20210206110017p:plain

今回はprint()で出力した結果がログとしてCloudWatchに出ています。

Glueジョブの呼び出し方いろいろ

GlueトリガーによるGlueジョブの実行

GlueトリガーはCloudWatch Eventsに近い機能を持っており、 一定期間毎にGlueジョブを実行させることが可能です。Cron式も指定できるので柔軟に使えそうです。

試したことは無いのですが、別のGlueジョブの実行結果を監視し、その結果が指定したものだった場合は別のGlueジョブを実行させるといったこともできるようです。

AWS SDKを使ったGlueジョブの実行

下記はpythonのSDKでの例ですが、SDKが使える環境なら外部からGlueジョブを実行させることも可能です。

Python での AWS Glue API の呼び出し - AWS Glue