# 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 の利用は、組織管理者への申請が必要です。

API の利用申請 (opens new window)

# ルーム 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: 送信先のルーム ID
  • ENVIRONMENT: 環境名(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 が公開されています。

API の利用申請 (opens new window)

# 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 にメッセージを送信する方法。

# 実装のポイント

  1. 外部モジュール不要: Node.js の標準モジュール(httpsquerystring)のみで実装可能
  2. 環境変数の活用: API トークンは環境変数に設定してセキュリティを確保
  3. CloudWatch Logs 対応: base64 デコードと gzip 解凍が必要

# 使用例

  • エラー通知の自動送信
  • デプロイ完了通知
  • 監視アラートの通知
  • その他の自動化タスク

関連情報: ChatWork API リファレンス (opens new window)

2022-08-20

同じタグを持つ記事をピックアップしました。