この記事は今年もやるよ!AWS Lambda縛り Advent Calendar 2015 - Qiitaの22日目です。
ご存知の通り、AWSへの料金支払いはドル建てです。当然、円が下がれば支払い金額は上がってしまいます。AWSヘビーユーザーにとって円/ドルのレートは気になる情報のはずなので、会社のSlackに流すようにしてみました。
Incoming Webhookの設定
最初にSlackでIncoming Webhookの設定をします。
![Integrations___cloudpack_Slack.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F78376%2F30f77255-1100-c272-b96b-e59dcbd1b43e.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=74eddfec22e1e1e71c0005227f7e3e85)
![Incoming_WebHooks___cloudpack_Slack.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F78376%2Ffb2848fa-46a4-2e46-80e0-4608d0b4078d.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=a4b03f3d787116332e7dc76b5ab4b776)
投稿先のChannelは何でもいいですが、テスト等で他のメンバーの迷惑にならないように適当なChannelを作ってしまうのが吉かもしれません。
![Incoming_WebHooks___cloudpack_Slack_1.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F78376%2F9af29c14-277d-f55b-f0c7-80e3972e0e66.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=9d2fe8a46b1e8de66f7b1d8d197eedfa)
Webhook URL
を後で使うので控えておきます。
Lambda Functionの作成
Lambda Functionの機能は非常に単純で、外部APIから取得した為替レートをWebhookでSlackに投げるだけです。
為替情報を取得できるAPIは様々あるようですが、今回はクジラさんのAPIを使わせていただきました。更新頻度がゆっくり目ですが、この用途には充分です。もっと頻繁に為替情報を取得したい人はXurrencyとかを使うと良いと思います。
SlackのWebhookでは、投稿されたメッセージのアイコンをEmojiで指定できます。今回は にしました。
とか
とか
でもいいかもですね。
最終的なLambda Functionは以下のようになりました。
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 を参考に、適当なEvent Sourceを追加します。
![AWS_Lambda 2.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F78376%2F2d93a454-b55a-8f41-2cca-f758640f7acb.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=600b7ca0981263a84fa9833d256a8bb8)
ここでは「4時間ごと、00分」にしました。
![AWS_Lambda.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F78376%2F11de31eb-75a6-02a0-d105-4a30e7d32935.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=2060005b8465109cc2a93c0473cb9673)
できあがり
Webhookを設定したChannelに、4時間ごとにドル円レートが流れるようになりました!
![Slack.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F78376%2F8192f718-d44b-d953-02d3-86c92055af9b.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d327497f787c26c03ac8c199dd6d4457)