AWS Lambdaで為替レート情報をSlackに流す

この記事は[今年もやるよ！AWS Lambda縛り Advent Calendar 2015 - Qiita](http://qiita.com/advent-calendar/2015/lambda)の22日目です。

ご存知の通り、AWSへの料金支払いはドル建てです。当然、円が下がれば支払い金額は上がってしまいます。AWSヘビーユーザーにとって円/ドルのレートは気になる情報のはずなので、会社のSlackに流すようにしてみました。

# Incoming Webhookの設定

最初にSlackでIncoming Webhookの設定をします。

<img width="910" alt="Integrations___cloudpack_Slack.png" src="https://qiita-image-store.s3.amazonaws.com/0/78376/30f77255-1100-c272-b96b-e59dcbd1b43e.png">

<img width="1006" alt="Incoming_WebHooks___cloudpack_Slack.png" src="https://qiita-image-store.s3.amazonaws.com/0/78376/fb2848fa-46a4-2e46-80e0-4608d0b4078d.png">

投稿先のChannelは何でもいいですが、テスト等で他のメンバーの迷惑にならないように適当なChannelを作ってしまうのが吉かもしれません。

<img width="1005" alt="Incoming_WebHooks___cloudpack_Slack_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/78376/9af29c14-277d-f55b-f0c7-80e3972e0e66.png">

`Webhook URL`を後で使うので控えておきます。

# Lambda Functionの作成

Lambda Functionの機能は非常に単純で、外部APIから取得した為替レートをWebhookでSlackに投げるだけです。

為替情報を取得できるAPIは様々あるようですが、今回は[クジラさんのAPI](http://api.aoikujira.com/kawase/)を使わせていただきました。更新頻度がゆっくり目ですが、この用途には充分です。もっと頻繁に為替情報を取得したい人は[Xurrency](http://xurrency.com/)とかを使うと良いと思います。

SlackのWebhookでは、投稿されたメッセージのアイコンをEmojiで指定できます。今回は :moneybag: にしました。  :money_with_wings: とか :dollar: とか :yen: でもいいかもですね。

最終的なLambda Functionは以下のようになりました。 

```handler.js
var URL   = require("url");
var http  = require("http");
var https = require("https");
​
var apiUrl     = URL.parse("http://api.aoikujira.com/kawase/json/usd");
var webhookUrl = URL.parse("<ここにSlackで作成したWebhook URL>");
​
var apiOptions = {
  hostname: apiUrl.hostname,
  path:     apiUrl.path,
  port:     80,
  method:   "GET",
​
  headers: {
    "Content-Type": "application/json"
  }
};
​
var webhookOptions = {
  hostname: webhookUrl.hostname,
  path:     webhookUrl.path,
  port:     443,
  method:   "POST",
​
  headers: {
    "Content-Type": "application/json"
  }
};
​
exports.handler = function(event, context) {
  http.get(apiOptions, function(res) {
    var content = "";
    res.setEncoding("utf8");
​
    res.on("data", function(chunk) {
      content += chunk;
    });
​
    res.on("end", function(res) {
      var data = JSON.parse(content);
      var text = "1 USD == " + data.JPY + " JPY"
​
      var payload = JSON.stringify({
        channel:    "#notify-jpy",
        username:   "JPY <-> USD",
        icon_emoji: ":moneybag:",
        text:       text
      });
​
      console.log(payload);
​
      var req = https.request(webhookOptions, function(res) {
        res.setEncoding("utf8");
​
        res.on("data", function(chunk) {
          console.log(chunk);
          context.succeed();
        });
      }).on("error", function(e) {
        console.log("error: " + e.message);
      });
​
      req.write(payload);
      req.end();
    });
  }).on("error", function(e) {
    console.log("error: " + e.message);
  });
};
```

# Scheduled Eventの設定

[AWS Lambda - Scheduled EventのCron書式 - Qiita](http://qiita.com/pyr_revs/items/abd29d9472f4cba9032c) を参考に、適当なEvent Sourceを追加します。

<img width="847" alt="AWS_Lambda 2.png" src="https://qiita-image-store.s3.amazonaws.com/0/78376/2d93a454-b55a-8f41-2cca-f758640f7acb.png">

ここでは「4時間ごと、00分」にしました。

<img width="1002" alt="AWS_Lambda.png" src="https://qiita-image-store.s3.amazonaws.com/0/78376/11de31eb-75a6-02a0-d105-4a30e7d32935.png">

# できあがり

Webhookを設定したChannelに、4時間ごとにドル円レートが流れるようになりました！

<img width="806" alt="Slack.png" src="https://qiita-image-store.s3.amazonaws.com/0/78376/8192f718-d44b-d953-02d3-86c92055af9b.png">