PR

Amazon SESとAWS Lambdaでサーバーレスメール転送システムを構築

Amazon SESとAWS Lambdaでサーバーレスメール転送システムを構築 AWS
Amazon SESとAWS Lambdaでサーバーレスメール転送システムを構築

どんな取り組みか

この記事では、メーリングリスト(ML)を旧アドレスから新アドレスへ移行する際に起こり得る「万が一」の事態に備え、Amazon SESとAWS Lambda、Amazon S3を組み合わせたサーバーレスなメール転送システムを構築した事例について解説します。特定のML宛に届いたメールを、運用負荷を増やさずに自動的に新MLへ転送することを目指しました。

使われた技術スタック

  • Amazon SES (Simple Email Service)
  • AWS Lambda
  • Amazon S3 (Simple Storage Service)

実装のポイント

ドメイン認証と受信設定

まず、旧ドメインをAmazon SESで認証済みとして登録しました。これにより、SESがそのドメイン宛のメールを受信できるようになります。具体的には、SESコンソールの「Verified identities」からドメインを登録し、DKIM認証に必要なCNAMEレコードと、メール受信に必要なMXレコードをDNSに追加しました。東京リージョン(ap-northeast-1)でのMXレコードの値は「10 inbound-smtp.ap-northeast-1.amazonaws.com」です。

Receipt ruleの設定

SESコンソールで「Email receiving」の「Receipt rule sets」を作成し、以下の2つのアクションを順番に設定しました。

  • S3アクション: 受信したメールを指定したS3バケットに保存します。
  • Lambdaアクション: 後述するLambda関数を呼び出します。

SESの受信ルールでは、スパムやマルウェアと判定されたメールに対するアクションを直接分岐させることはできません。そのため、これらの判定結果に基づいた転送スキップ処理はLambda関数内で実装する必要があります。

S3バケットの準備

受信メールの保存先としてS3バケットを作成し、SESからの書き込みを許可するバケットポリシーを設定しました。

Lambda関数の実装

Lambda関数の主な役割は以下の4点です。

  1. SESイベントに含まれるmessageIdを使用して、S3からメール原文(MIME形式)を取得します。
  2. スパム・ウイルス判定結果を確認し、問題がある場合は転送をスキップします。
  3. メールをパースして件名、本文、送信元アドレスを取得します。
  4. 件名と本文を加工し、添付ファイルを含めたMIME構造を維持したままSESで新MLへ送信します。

SESのReceipt ruleからLambdaを呼び出した場合、Lambdaに渡されるイベントにはメール本文や添付ファイルは含まれず、ヘッダー情報とmessageIdのみが渡されます。メール本文や添付ファイルを含む原文を取得するには、S3に保存されたデータをmessageIdをキーとして取得する必要があります。

SESからLambdaに渡されるイベントの構造例は以下の通りです。

{
  "Records": [
    {
      "eventSource": "aws:ses",
      "eventVersion": "1.0",
      "ses": {
        "mail": {
          "timestamp": "2019-08-05T21:30:02.028Z",
          "source": "prvs=144d0cba7=sender@example.com",
          "messageId": "EXAMPLE7c191be45-e9aedb9a-02f9-4d12-a87d-dd0099a07f8a-000000",
          "destination": ["recipient@example.com"],
          "headersTruncated": false,
          "headers": [
            // ... ヘッダー情報 ...
            { "name": "From", "value": " \" Doe, John \" <sender@example.com>" },
            // ...
          ]
        }
      }
    }
  ]
}

転送元の明示とFromアドレスの書き換え

転送元を明示するため、メールの件名に「【旧ML宛メール】」を付与し、本文の先頭に元の送信元メールアドレスを追記しました。SESでメールを再送信する際には、SES認証済みドメイン配下のアドレスにFromアドレスを書き換える必要があるという制約があります。この制約を回避するため、「元Fromの@を別の文字に置換してSES認証済みドメインのローカルパートに埋め込む」という方法で元のFromアドレスを保持しました。

添付ファイルの維持

添付ファイルがある場合でも、MIME構造をそのまま維持して転送することで、欠落なく新MLへ送信できるようにしました。

得られた成果や学び

このシステムにより、メーリングリスト移行時のリスクを低減しつつ、メールサーバーの構築・運用やインフラ管理といった運用負荷をゼロに抑えることができました。また、SESの制約であるFromアドレスの書き換え問題も、工夫次第で回避可能であることがわかりました。ただし、SESの受信判定で完全にメールをフィルタリングできるわけではなく、Lambda側での追加の判定処理が必要となる場合があることも学びました。

まとめ

Amazon SESとAWS Lambda、Amazon S3を組み合わせることで、メーリングリスト移行時のメール転送という特定のニーズに対し、サーバーレスで可用性の高いシステムを構築することが可能です。特に、既存のAWS環境で追加要件に対応する必要がある場合に有効なアプローチと言えます。

出典: https://qiita.com/takumiida1/items/694865f0fb43ec601b0d

Related Certifications

この記事に関連する技術領域の認定資格

AWS 関連資格

  • AWS Certified Cloud Practitioner
  • AWS Certified Solutions Architect – Associate
  • AWS Certified Developer – Associate
  • AWS Certified Solutions Architect – Professional
  • AWS Certified DevOps Engineer – Professional
  • AWS Certified Machine Learning – Specialty

※ 認定資格は技術スキルの体系的な学習に役立ちます。試験の出題範囲や受験要件は変更される場合があるため、受験前に必ず公式サイトで最新情報をご確認ください。

SF Tech & Win

Salesforce × AWS × AI 連携の実装ノウハウ

SIer・スタートアップ・中小企業のDX推進に役立つアーキテクチャ事例・実装パターン・最新アップデート情報を毎朝配信。

コメント

タイトルとURLをコピーしました