# AWS Lambda で Node.js を使って ChatWork にメッセージ送信する方法
AWS の SNS で取得した内容を Lambda 経由で ChatWork へ送信するプログラムを作成しました。Python で Lambda を作成して ChatWork に送信する記事はよくありますが、今回はNode.jsで実装しました。
外部のモジュールを使わず、受け取ったデータを ChatWork のフォーマットに合わせて送信しているだけなので、シンプルに実装できました。
# ChatWork の準備
ChatWork API を使用するには、以下の準備が必要です。
| 項目 | 説明 |
|---|---|
| API トークン | 組織管理者への申請が必要 |
| ルーム ID | ChatWork の URL から取得可能 |
# API トークンの取得
ChatWork API の利用は、組織管理者への申請が必要です。
# ルーム ID の取得
ルーム ID は、ChatWork の URL から取得できます。
https://www.chatwork.com/#!rid123456789
この場合、ルーム ID は123456789です。
準備完了
API 用のトークンとルーム ID が分かったら、実装の準備は完了です!
# Lambda Node.js で ChatWork 送信の実装
# 基本的な実装例
const https = require("https");
const querystring = require("querystring");
// 環境変数から取得
const token = process.env.CHATWORK_TOKEN;
const room_id = process.env.CHATWORK_ROOM_ID;
const env = process.env.ENVIRONMENT;
exports.handler = function (event, context) {
// メッセージの作成
const postMessage =
(env == "production" ? "[toall] " : "") +
`${env} エラー発生! [code]${JSON.stringify(event)}[/code]`;
// リクエストデータの準備
const post_data = querystring.stringify({ body: postMessage });
// リクエストオプション
const options = {
host: "api.chatwork.com",
path: `/v2/rooms/${room_id}/messages`,
headers: {
"X-ChatWorkToken": token,
"Content-Type": "application/x-www-form-urlencoded",
},
method: "POST",
};
// HTTPリクエストの送信
const post_req = https.request(options, function (res) {
res.setEncoding("utf8");
res.on("data", function (chunk) {
console.log("Response: " + chunk);
context.succeed();
});
res.on("error", function (e) {
console.log("Got error: " + e.message);
context.fail("FAILURE");
});
});
post_req.write(post_data);
post_req.end();
};
# 環境変数の設定
Lambda 関数の環境変数に以下を設定します。
CHATWORK_TOKEN: ChatWork API トークンCHATWORK_ROOM_ID: 送信先のルーム IDENVIRONMENT: 環境名(production、staging など)
セキュリティ
API トークンは環境変数に設定し、コードに直接書かないようにしてください。
# CloudWatch Logs から Lambda 経由で ChatWork 送信
CloudWatch Logs から Lambda 経由で ChatWork に送信する場合、CloudWatch が base64 で圧縮しているため、解凍処理が必要です。
# 実装例
const https = require("https");
const querystring = require("querystring");
const zlib = require("zlib");
const token = process.env.CHATWORK_TOKEN;
const room_id = process.env.CHATWORK_ROOM_ID;
exports.handler = function (event, context) {
console.log("Event.awslogs: ", event.awslogs);
// base64デコード
const payload = Buffer.from(event.awslogs.data, "base64");
// gzip解凍
const parsed = JSON.parse(zlib.gunzipSync(payload).toString("utf8"));
// 最新のログイベントを取得
const logEvent = parsed["logEvents"][parsed["logEvents"].length - 1];
// メッセージの作成
const postMessage = `エラー発生! [code]${JSON.stringify(logEvent)}[/code]`;
// リクエストデータの準備
const post_data = querystring.stringify({ body: postMessage });
// リクエストオプション
const options = {
host: "api.chatwork.com",
path: `/v2/rooms/${room_id}/messages`,
headers: {
"X-ChatWorkToken": token,
"Content-Type": "application/x-www-form-urlencoded",
},
method: "POST",
};
// HTTPリクエストの送信
const post_req = https.request(options, function (res) {
res.setEncoding("utf8");
res.on("data", function (chunk) {
console.log("Response: " + chunk);
context.succeed();
});
res.on("error", function (e) {
console.log("Got error: " + e.message);
context.fail("FAILURE");
});
});
post_req.write(post_data);
post_req.end();
};
ポイント
- CloudWatch Logs のデータは base64 エンコードされた gzip 圧縮データです
zlib.gunzipSync()で解凍してから JSON パースします- 最新のログイベントを取得して ChatWork に送信します
# ChatWork API について
ChatWork は社内コミュニケーションツールとして広く使われており、より良く活用するために開発者向けに API が公開されています。
# ChatWork API でできること一覧
| エンドポイント | 説明 |
|---|---|
me | 自分の情報を取得 |
my/status | 自分の状態を取得 |
my/tasks | 自分のタスク一覧を取得 |
contacts | コンタクト一覧を取得 |
rooms | チャット一覧を取得・チャットを作成 |
rooms/{room_id} | チャットの情報を取得・変更・退席/削除 |
rooms/{room_id}/members | チャットのメンバー一覧を取得・チャットのメンバーを変更 |
rooms/{room_id}/messages | チャットのメッセージ一覧を取得・チャットにメッセージを投稿 |
rooms/{room_id}/messages/read | チャットのメッセージを既読に |
rooms/{room_id}/messages/unread | チャットのメッセージを未読に |
rooms/{room_id}/messages/{message_id} | チャットのメッセージを取得・変更・削除 |
rooms/{room_id}/tasks | チャットのタスク一覧を取得・チャットにタスクを追加 |
rooms/{room_id}/tasks/{task_id} | チャットのタスクの情報を取得 |
rooms/{room_id}/tasks/{task_id}/status | チャットのタスクの状態を変更 |
rooms/{room_id}/files | チャットのファイル一覧を取得・チャットにファイルをアップロード |
rooms/{room_id}/files/{file_id} | チャットのファイルの情報を取得 |
rooms/{room_id}/link | チャットへの招待リンクを取得・作成・変更・削除 |
incoming_requests | コンタクト承認依頼一覧を取得 |
incoming_requests/{request_id} | コンタクト承認依頼を承認・コンタクト承認依頼を拒否 |
# 参考リンク
ChatWork エンドポイント一覧 (opens new window)
# 実装時の注意点
AWS Lambda で Node.js を使って ChatWork にメッセージを送信する方法。
# 実装のポイント
- 外部モジュール不要: Node.js の標準モジュール(
https、querystring)のみで実装可能 - 環境変数の活用: API トークンは環境変数に設定してセキュリティを確保
- CloudWatch Logs 対応: base64 デコードと gzip 解凍が必要
# 使用例
- エラー通知の自動送信
- デプロイ完了通知
- 監視アラートの通知
- その他の自動化タスク