Azure Job Scheduler + AWS Lambdaで夢のサーバレス定期ジョブを実現する
GoAzureがやっていたので、フラフラとAzureのWebサイトを見ていたりしました。
で、Azureのサービスの中に、AWSには無いJob Scheduler
のサービスがあって、
これずっと欲しかったやつや!
ってなったので、ちょっと調べてました。
余談ですが、Jobの発行元の可用性担保と実行保証って面倒くさいんですよね。二重発行させる訳にもいかないですし、そのためだけにHA組む?みたいな所もあり…
発行されたJobを実行する所ではSQSとかELBとか挟めばどうとでもなるんですけど…
そんな訳で、フルマネージドなJob Scheduler
はとても魅力的なわけです。
で、まず思ったのが「ここからLambdaキックできたらサーバレス定期ジョブでアツいなー」ってことです。
Job Scheduler
ができることは大別して以下の2つです。
- 同じAzureの
Storage Queue
へのメッセージキューイング - HTTP(S)リクエスト
この内、2のHTTPリクエストがGET
,POST
,PUT
メソッドに対応しています。
どれも、動的にリクエストの内容は組み立てられないのでLambda:InvokeAsync
APIをコールするのは無理です。
ただ、一個だけ(?)Lambda
を静的なリクエストで起動する方法があります。
S3 event notifications(S3更新通知)です。
認証付きのSOAP API(SDKから呼ぶやつ)ではなく、REST APIのPUT
なら単純な静的リクエストから更新ができます。
手順など
まず、PUT
するS3バケットを作成し、以下のようなバケットポリシーを適用します。
S3 Bucket
とLamda Function
のリージョンが同じになるよう注意しましょう。
{ "Version": "2008-10-17", "Id": "PolicyLambdaScheduler", "Statement": [ { "Sid": "StmtLambdaScheduler", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::lambda-scheduler-sample/<random-strings>/*", "Condition": { "IpAddress": { "aws:SourceIp": "0.0.0.0/0" } } } ] }
許可するのは、万が一のイタズラを考えて十分に長いランダム文字列を含んだパス等にすると良いかと思います。
次に、Lambda Functionを登録します。
lambchop
というgemが手元のスクリプトをサクッと上げれて、実行結果のログをtailするように見られて素敵なので、使わせていただいてます。
lambchop 0.0.2: Invoke AWS Lambda function from local as normally script - so what
こんな感じで適当です。
#!/usr/bin/env lambchop /* function_name: lambda-scheduler runtime: nodejs mode: event description: 'Lambda scheduled job publish from Azure Job Scheduler' timeout: 3 memory_size: 128 role: arn:aws:iam::<your-account-number>:role/lambda_exec_role handler: lambda-scheduler.handler */ console.log('Loading event'); var aws = require('aws-sdk'); var s3 = new aws.S3({apiVersion: '2006-03-01'}); require('date-utils'); exports.handler = function(event, context) { var d = new Date(); console.log('Received event:'); console.log(JSON.stringify(event, null, ' ')); console.log('DateTime:',d.toFormat("YYYY-MM-DD HH24:MI:SS")); console.log('Invoked from Azure Job Scheduler!!'); };
登録したLambda FunctionをS3 event notificationsで起動するよう設定します。
Lambdaのメニューを開きます。
変更します。
そして、Azure Job Schedulerのジョブを作成します
Job Scheduler
を選択します。
先ほどS3のバケットポリシーで許可したURLを入力して作成します。
とりあえず、2分毎で。
※無料トライアル枠の無い方は1時間より大きい周期でないと有料です。
暫く、lambchop
の出力を眺めると…
2分毎に起動してる!!
夢のサーバレス定期ジョブや!!
Azure良いかも
良さそうなサービスがけっこうあって、ちょっとAWSを使い始めた頃のワクワクが蘇った感じがしてて良いかもです。
AWSはもちろん素晴らしいし、これからも使っていきますが、色んなクラウドの良いサービスはガンガン使って、組み合わせて良いものが作れるように精進していきたいと思います。