Yak shaving logs


My life is just yak shaving.

AWS Lambdaから毎分Railsにポーリングする

2017/04/14 #rails #aws #lambda

By Yusuke Takita


こんにちは。Takitaです。

Webアプリで管理者が指定した日時にユーザーに通知を飛ばすと機能を実装する必要がありました。
その機能を実現するにあたり、以下のような仕組みで実現しました。

  • Lambdaの関数を毎分実行
  • その関数内でRialsのcontrollerのindexにリクエストを送る
  • controller内でDB操作を含む必要な処理を行い、結果をjsonで返す

「指定した日時にユーザーに通知を飛ばす」くらいの用件であれば、
sidekiqやresqueといったgemを利用しなくても実現可能です。
(ActiveJobは指定した日時に指定したworkerを実行する機能は持っていないため、
上記のgemを利用するのが一般的かと思います。)

また、sidekiqやresqueといったgemを利用する場合は以下の対応も必要になるため、
今回のような場合ではメリット<コストになってしまいます。

  • 導入コスト
    • 特にサーバーでのセットアップ
    • 既存デプロイとの整合性を保つ
  • 保守コスト
    • sidekiq等のプロセス監視など

Lambdaから毎分Railsにポーリングする方法について手順をまとめます。

Railsの設定

  1. controllerと任意のアクションを作成
  2. ルーティングの設定

Lambdaの設定

lambdaの関数を作成

lambdaの関数を作成

ブランク関数を選択

ブランク関数を選択

トリガーの設定

  • CloudWatch イベント - スケジュール を選択
  • トリガーの有効化にチェックをつける

トリガーの設定

関数の名前とロールを選択

関数の名前とロールを選択
関数の名前とロールを選択

作成した関数のコードを修正してテスト

作成した関数のコードを修正してテスト

var http = require ('http');
const HOST = 'www.google.com';
const PATH = '/index.html';
const AUTH = '';

exports.handler = function(event, context) {
    http.get({ host: HOST, path: PATH}, function(res) {
        console.log("response code: " + res.statusCode);
        res.on("data", function(chunk) {
            console.log(`response body: ${chunk}`);
            context.done(null, `${chunk}`);
        });
    }).on('error', function(e) {
        context.done('error', e);
    });
};

テスト後に関数の下の画面に以下のように表示されれば成功

テスト後に関数の下の画面に以下のように表示されれば成功

Lambdaのコードを修正

それぞれの環境に合わせてHOSTとPATHを修正して期待通りの動作をしているか確認してください。

const HOST = 'example.com';
const PATH = '/notify';
このエントリーをはてなブックマークに追加

categories


最新記事


tags