Chatwork のチャットに対してメールで送信した内容を投稿する仕組みを作成する
はじめに
弊社ではメインのコミュニケーションツールとして Chatwork を利用しています。 Slack も利用されていますが、Slack には以下のように「メールを送信することでそのメールの内容を特定のチャンネル/DMに対して投稿する」機能がデフォルトで提供されています。
この機能が Chatwork にないかを調べたのですが、Chatwork のヘルプでは以下の通り案内されており、2つの選択肢があることが分かります。
- 自前で Chatwork API を実行するプログラムを作ってメールを受け取ってメッセージを投稿する
- Zapier と連携してGmailでメール受信した内容をチャットに投稿するようにする
Zapier はコードレスのウェブアプリケーション統合ツールです。今回のように「Gmailでメールを受信したら」「その内容をChatworkに投稿する」などの条件を設定して、既存の複数のサービスを連携することができます。 無償版を利用することもできますが、多くの制約があるため、本格的に利用するのであれば有償版のサービスを利用することになるでしょう。
しかし、上記のページにも記載がある通り、2. の方法には(有償版Gmailのみご利用可能です)という制限があります。 そのため、有償版Gmailを利用していない場合は 1. の方法を採用するしかありません。
弊社では1.の方法を採用した開発を行い、サービス運用上発生するメールを受信した場合にその内容を Chatwork 上の専用監視チャットに投稿して関係者全員が確認できるような仕組みを構築しています。 この仕組みを利用することで以下のようなメリットが得られます。
- 普段利用しているコミュニケーションツールに投稿することで、メールを送信している個人に依存するのではなく、チーム全体に素早く情報を伝達できます
- 運用で利用するメールアドレス管理の手間を減らします(個別のメールアドレスを設定している場合、例えば開発チームから離れてしまったような場合でも監視設定を再変更しない限りメールが飛び続けてしまいます。 これはメーリングリストを利用する場合でも同様です)
本記事では、こちらの仕組みの実現に利用したアーキテクチャについてを説明します。
本課題解決のためのアーキテクチャ
弊社では以下のように AWS のサービスを組み合わせたサーバーレスのアプローチでこの問題を解決しています。
まず準備段階として、Amazon SES でメールを受信できるように設定します。 現在(2023年9月以降)は東京リージョンでメールの受信が可能になっていますが、長らく日本のリージョンではメールの受信は不可でしたので、オレゴンリージョンを利用して構築しました。 構築時に、メールを受信するための MX レコードを設定しており、今回はここに Route 53 を利用しています (1)。
Amazon SES ではメールを受け取った後にどのようなアクションを行うかを設定できます。 ここでは S3 に送信されたメールの本文を保存するようにしています (2)。
S3 に新しいデータが保存された場合、S3 の put イベントが発火します。 このイベントに対して AWS Lambda を稼働させることができます。 保存されたメールの内容はエンコードされたままですので、閲覧しやすいようにタイトルと本文をデコードしてこれを DynamoDB に保存しています。 保存した内容はウェブベースのシステムで閲覧できるようになっており、メールを受信したこととそのメールの概要、メールの本文を閲覧するための URL を生成して、Chatwork API を呼び出し、メール受信の投稿を行います (3, 4, 5)。
実際の利用者は Chatwork の投稿に記載されているリンクから、メールの本文を確認します。 メール自体が長い文面の場合があるため、そのすべてを投稿するのでは無く、このようにウェブ画面経由で閲覧を行うという方法を取っています。 なお、CloudFront + Functions (もしくは Lambda@Edge) をかませることで、このレイヤーでBasic認証を実施しています (6)。
今回、AWS Lambda 用のプログラムを記載するために AWS Chalice という Python 製のライブラリを利用しています。 こちらで1つのプログラムの中に「S3バケットのputイベントに対応するための関数」と「HTTPアクセスに対応する結果を返すための関数」を両方記載しデプロイすると、それぞれの Lambda 関数が実行するような設定を行ってくれます。
https://aws.github.io/chalice/
補足ですが、S3 や DynamoDB にはかなり大量のデータを格納することができますが、保持容量に比例した金銭が発生しますので S3 Lifecycle ルールおよび DynamoDB の TTL 機能によって古いデータは削除するように設定しています。
おわりに
AWSには様々なサービスがありますので、これらをうまく組み合わせることで身近な業務上の問題を解決・改善できる一例として今回の例を紹介しました。
システムをSaaS・サーバーレスで構築することによって、安定した信頼性の高い運用ができていると同時に、インフラ維持費用もほとんど発生していません。 AWS には様々な SaaS サービスがありますので、ユースケースに併せてこれらを活用することも考えていくと良いでしょう。