AWS Lambdaは、サーバ自体のお守りが不要なのでさくっとバックエンドを構築したい場合はかなり便利です。 ただ難点を挙げるならば、タイムアウトが15分までしか伸ばせない点。 これは残念ながら仕様となっているのでどうしようもできません。
ただ、EC2で構築するとなるとサーバ管理が必要になり、現在の配置人員的にも保守コストがかかり過ぎる… ということで無理やりAWS GlueをLambda代わりにしました。
AWS Glueとは
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バケットを作成する
分かりやすい名前を付けて、S3バケットを作成します。
今回はglue-python-shell-hoge
というバケットを作りました。
ジョブの作成・設定
Glueの「ジョブ」画面から、「ジョブの追加」をクリックして作成画面に移動します。
各入力フォームに必要なパラメータを入力します。
項目 | 説明 |
---|---|
名前 | 任意の名前を入力 |
IAM | Glue用のIAMロールを指定。なければ別途新規作成が必要。 |
Type | Python shellを指定 |
Pythonのバージョン | 任意のバージョンを指定 |
このジョブ実行 | ユーザーが作成する新しいスクリプトを指定 |
スクリプトファイル名 | Glueジョブ実行時に最初に呼び出すpythonファイル名を指定 |
スクリプトが保存されているS3パス | 前の手順で作成したS3バケットのパスを指定 |
ジョブのタイムアウト(分) | 任意のタイムアウト設定を指定 |
接続の設定は不要なのでそのままジョブを保存します。
保存が完了すると、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コンソール上から実行する
ジョブ名の左となりのチェックボックスにチェックを入れた状態で、「ジョブの実行」を選択すると実行されます。 なお実行環境が立ち上がり、pythonコードが実行されるまでは体感で5~20秒程度かかりました。
実行結果の確認
ジョブを選択すると画面下部に実行結果が表示されます。
ログには標準出力を保持するログとジョブ実行中のエラーを保持するエラーログがあります。 それぞれCloudWatchに保管されており、ログまたはエラーログをクリックすれば、CloudWatchの画面で内容確認ができます。
今回はprint()
で出力した結果がログとしてCloudWatchに出ています。
Glueジョブの呼び出し方いろいろ
GlueトリガーによるGlueジョブの実行
GlueトリガーはCloudWatch Eventsに近い機能を持っており、 一定期間毎にGlueジョブを実行させることが可能です。Cron式も指定できるので柔軟に使えそうです。
試したことは無いのですが、別のGlueジョブの実行結果を監視し、その結果が指定したものだった場合は別のGlueジョブを実行させるといったこともできるようです。
AWS SDKを使ったGlueジョブの実行
下記はpythonのSDKでの例ですが、SDKが使える環境なら外部からGlueジョブを実行させることも可能です。