2018/10 AWS Lambdaを使った雑務への取り組み

大阪事務所でのAWS Lambdaを使った雑務への取り組みを紹介します。

AWS構成

Lambda

サーバレスの代名詞として有名になったLambda。 できることはMVCで言う所のC(Controller)の部分だけを実装し機能させます。 ルーティング機能や永続化の機能はないため、後述のAWS機能とつなぎ合わせて利用します。 言い方を変えればLambdaだけでは何もできません。

利用できる言語は、JavaScript、Python、Java、C#、Goと多彩です。 JavaScriptでの利用が一番多いようで、困ったときに調べるのが楽なので本件でもJavaScriptを利用しています。

// index.js

const https = require ('https');
const aws = require('aws-sdk');
const dynamo = new aws.DynamoDB.DocumentClient();

// Time zone.
process.env.TZ = 'Asia/Tokyo';

// entry point.
exports.handler = (event, context, callback) => {

    // https使って外部APIからデータを取得したり...
    // Slackへメッセージを投げたり...
    // DynamoDBとのデータやり取りしたり...

    // 処理成功
    context.succeed('complete.');
};

このようにindex.jsに用意した関数がコールされるので、あとは実現したいコードを実装していくだけなのでシンプルですね。

API Gateway

Lambdaは特定のIPアドレスを持たないので、AWSの外から直接Lambdaを呼び出す(GET, POST等)ことはできません。 AWSの外からのGETやPOSTをAPI Gateway受け止め、その要求をLambdaに渡し、Lambdaが処理を行います。 API Gatewayにコーディング作業はありません。AWS管理画面からポチポチクリックして設定する作業になります。

DynamoDB

Lambda内にDBサーバを立てたり、ファイルにデータを残すことはできません。 DynamoDBはNoSQLデータベースで、読み込み書き込みが早くLambdaとの相性も良く、無料枠もあります。 そこで、本件では大したデータ量を扱わないのでDynamoDBを使います。 DynamoDBもコーディング作業はありません。AWS管理画面からポチポチクリックして設定する作業になります。 さらに、AWS管理画面からWorkbenchやpgAdminのように実際のDBの中身を見たり変更もできます。

CloudWatch

1日に1回、月に1回と定期的に処理をしたいのでcronとしてCloudWatchを利用します。 設定した日時になるとCloudWatchがLambda処理させます。 CloudWatchもAWS管理画面からポチポチクリックして設定する作業になります。

雑務リマインダ

リマインダ機能として、CloudWatch(cron) → Lambda & DynamoDB → Slackという流れで通知させています。

電車遅延

朝・定時前にLambda内で、鉄道遅延情報のjsonから遅延情報を取得して該当路線に遅延があればSlackへ遅延情報を通知します。いざ帰ろうと駅についたら大幅に遅延していて愕然(仕事の披露も相まって)とすることはなくなりました。

掃除、水やり

大阪事務所では簡単な掃除と観葉植物への水やりを輪番制で回しています。 しかし、誰が当番か管理するのも手間だし、毎回誰かに言われるとモチベーションも下がります。 そこで、DynamoDBに当番テーブルを作成し、Lambda内でDynamoDB当番データを更新しつつSlackへ通知して回しています。

月末締め

忙しくて月末であることをすっかり忘れることあったり、メンバーに呼びかけるのも手間なので、月末にSlackへ通知するようにしました。

消耗品

事務所ではたまに消耗品が底をつきるので購入しなければなりません。 この消耗品が底をつくタイミングに規則性はなくランダムなので、購入しない月もあれば、何度も購入しなければならない月もあります。 しかし、都度購入していると、割り込み作業として発生し本業に集中できません。

そこで、そろそろ欲しい消耗品が出てきたら、Slack → API Gateway → Lambda → DynamoDBにためます。 そして、月末になるとLambdaでDynamoDBに溜まった物品リストを取り出してSlackへ通知します。 これで月に1度だけの購入作業をすればよく、本業に集中できるようになりました。

結果

作成して1年以上立ちますが、サーバレスなのでほぼノーメンテナンスで安定して動き続けています。 大変便利です。 その上で、頑張ったり気をつけなくても雑務が回って楽できるのは嬉しい限りです。