AWS Lambda 関数を cron のように定期実行
[履歴] [最終更新] (2017/10/08 04:12:34)

概要

こちらのページで使い方を把握した AWS Lambda のトリガーに CloudWatch の定期実行イベントを設定することで、cron のように Lambda 関数を定期実行できます。利用例として、ここでは SQS にメッセージを一つだけ登録する処理を Lambda 関数で定期実行してみます。複数のインスタンスで動作する何らかのアプリケーションがバッチ処理を行う際、SQS からメッセージを取得できたインスタンス以外では処理をスキップするように実装することで、重複実行を回避しつつバッチ処理アプリケーションを冗長化できます。

Lambda 関数がメッセージを登録する SQS の作成

Create New Queue をクリックします。

Uploaded Image

Queue Name を設定します。SQS におけるメッセージは、取得された後 Default Visibility Timeout の間だけ他のクライアントから参照できなくなります。その間にメッセージを取得したクライアントは SQS からメッセージを削除する必要があります。

Uploaded Image

Lambda 関数が利用する IAM ロールの作成

Create Role をクリックします。

Uploaded Image

Lambda 権限が付与されたロールを作成します。

Uploaded Image

AmazonSQSFullAccess を追加します。

Uploaded Image

ロール名を設定します。

Uploaded Image

Lambda 関数の登録

Create a function をクリックします。

Uploaded Image

Blueprints は利用せずに Author from scratch をクリックします。

Uploaded Image

Lambda 関数名および先程作成した IAM ロールを設定します。

Uploaded Image

関数を以下のように編集して Save します。

'use strict';

const AWS = require('aws-sdk');
const sqs = new AWS.SQS();

const QUEUE_URL = 'https://sqs.ap-northeast-1.amazonaws.com/123412341234/my-queue-20171007';

exports.handler = function(event, context, callback) {
  var params = {
    MessageBody: 'test test',
    QueueUrl: QUEUE_URL
  };
  // SQS にメッセージを送信します。
  // http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SQS.html#sendMessage-property
  sqs.sendMessage(params, function(err, data) {
    if (err) {
      console.log(err);
    }
    else {
      console.log(data);
    }
  });
};

Test を実行すると SQS にメッセージが一つ追加されます。

Uploaded Image

CloudWatch イベントの登録

Create rule をクリックします。

Uploaded Image

一分毎に Lambda 関数を実行するように設定します。ここで直接 SQS にメッセージを追加することもできますが、Lambda 関数を介することで SQS が空でない場合など処理の分岐が柔軟に行えます。

Uploaded Image

関連ページ
    概要 AWS Lambda はイベントドリブンな「関数」を登録できるサービスです。例えば S3 に画像がアップロードされたときにサムネイル用のサイズに加工する処理が記述された関数を登録できます。基本的な使い方をまとめます。 事前準備 関数の登録はブラウザで AWS コンソールにログインして行うこともできますが、本ページでは
    概要 こちらのページで基本的な使い方を把握した AWS Lambda は API Gateway のバックエンドとして設定することができます。Slack API から実行するためのエンドポイントを API Gateway で用意することによって、Hubot 等を用いない Serverless な Slack 連携が可能になります。AWS コンソールを利用した具体的な設定およびサンプルコードを示し
    概要 こちらのページで使い方を把握した AWS Glue をこちらのページで使い方を把握した AWS Lambda から起動するようにすると、大規模データの ETL 処理を Job 引数やエラー時のハンドリングを含めて柔軟に行うことができます。Glue と Lambda で利用する言語はどちらも Python であるとして、簡単な連携方法について記載します。