朝起きる技術

こんにちは。analysisチームの河野です。
皆さん、朝は得意でしょうか?私は子供の頃から苦手です。休みの日は14:00ぐらいまで寝たりしてます。
そんな感じで朝が苦手なので、遅刻をたまにしてしまいます。

目覚まし時計は大学生の頃に買ったのですが、強く叩きすぎたのか、音が出なくなってしまいました。
携帯はさすがにそんな乱暴に扱ったりしないのですが、アラームが鳴っているのか鳴っていなのか、よく分からないことが多々あります。たまに設定を変えて、戻さずにそのままになってたりすることがあるので、簡単に設定を変更できてしまうのが良くないのだと思います。

なので、簡単に設定の変更ができなく、かつ、起きたい時間の30分前から5分おきで通知してくれる仕組みを作りました。

作ったもの

これです。
先日、LINE Notifyなるものを知ったので、それと、AWS Lambdaを組み合わせて作りました。
ServerlessのTemplate で aws-clojurescript-gradleaws-clojure-gradleなるものがあったので、Clojureで作りたかったのですが、gralde-clojurenreplへつなぐ方法が分からなかったので、仕事で使い慣れているTypescriptを使いました。

仕組みは単純で、AWS Lambda から LINE Notifyへ、8:30から8:59まで5分おきに通知するだけのシンプルなアプリです。
ひとまず自分で使えれば良いので、かなり手抜きです。
CloudWatchのcronではGMTしか使えないようなので、時間を設定するときは注意が必要です。

解説

src/handler/wake-up.tsからnotify関数を実行しているだけです。notify関数は、headerとbodyに値を入れて、LINE Notify APIを実行しているだけなので、特に難しいことはしていないです。 ちなみにLINE Notify APIcurlで実行すると、こんな感じです。

$ curl -X POST -H 'Authorization: Bearer <API TOKEN>' -F 'message=<YOUR MESSAGE>' https://notify-api.line.me/api/notify

src/handler/wake-up.tsnotify関数です。

// src/handler/wake-up.ts

import { ScheduledHandler, ScheduledEvent, Context, Callback } from "aws-lambda";
import "source-map-support/register";
import { notify } from "../lib/util";

export const handler: ScheduledHandler = async (event: ScheduledEvent, context: Context, cb: Callback) => {
    try {
        await notify("起きなさい");
    } catch (err) {
        const result = err;
        console.log("Error: ", result);
    }
    cb(null, "send!!");
}
// src/lib/util.ts

import axios from "axios";
import * as querystring from "querystring";

export async function notify(message: string) {
    const url = "https://notify-api.line.me/api/notify"
    const token = process.env.TOKEN;

    const headers = {
        "Content-Type": "application/x-www-form-urlencoded",
        "Authorization": `Bearer ${token}`,
    };

    const params = querystring.stringify({
        message
    });

    axios.post(url, params, { headers })
}

API TOKENはserverless.yml環境変数で指定しています。
と言っても、dev環境しかないので、特に意味はありませんが。要は外部から指定できるようにしたかっただけなので、こうしています。
使う場合は、<API TOKEN>の部分に自分のAPI TOKENを記載してください。

# serverless.yml

service:
  name: scheduled-notify

# Add the serverless-webpack plugin
plugins:
  - serverless-webpack

provider:
  name: aws
  stage: dev
  region: ap-northeast-1
  runtime: nodejs8.10
  timeout: 60
  environment:
    TOKEN: <API TOKEN>

functions:
  wake-up:
    handler: src/handler/wake-up.handler
    events:
      - schedule: cron(30-59/5 23 ? * 1-5 *)

まとめ

これで毎朝ちゃんと起きられるようになりたいです。

コネクトムではServerlessなアプリケーションを一緒に作るエンジニアを募集しています。
https://open.talentio.com/1/c/connectom/requisitions/detail/6956