Amazon WorkMail でバウンスログを出力して検索してみた

# はじめに

[前回の記事](https://qiita.com/sugimount-a/items/ee3369b43369d525c72e)では、Amazon WorkMail を構築したあとに、Web UI を利用したメールの送受信を行いました。メールサーバーを自前で管理運用する必要がなく、AWS 側に負担をオフロードでき、軽減できるメリットがわかりました。

メールを運用する中で、バウンスメールや苦情メールなどを適切に管理運用する必要があります。バウンス率が高くなると、メール送信元が怪しいとインターネット上で評価されるため、健全なメール活動を続けるうえで、バウンス率や苦情率は重要な要素です。WorkMail を利用しているうえで、ログを出力して、バウンスメールなどの管理に活かすことが可能です。

今回は、WorkMail を使ってメール送受信に関するログを CloudWatch Logs に出力して検索をしてみる手順となります。



# WorkMail で Log を有効化

WorkMail の画面でログを有効化していきます。デフォルトで無効になっています。

![image-20220122154007455.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/90af592b-c3e4-b44d-6c72-33ad44f5a699.png)



default settings を利用して保存を押します。保存期間などを変更したい場合は、カスタムも可能となっています。

- 出力先のロググループが、`/aws/workmail/emailevents/workmail-sugiaws` となる
- ロググループの保存期間が30日となる

![image-20220122154121241.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a49ec8d5-e80f-2cf0-3927-70b690040b46.png)



ログ設定が保存されました

![image-20220122154348988.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/904a5257-891d-b378-028e-0f8c8a28343f.png)



# 正常なメールを送付し、ログを確認

[以前の記事](https://qiita.com/sugimount-a/items/f9e28dde8d1fc845aa2a)で、Outlook からメールを送受信できるようにしました。この環境を使って、メールをおくってみて、その時のログを確認してみましょう。

WorlMail 内のユーザーにメールを送る

![image-20220122154802132.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/5e51e17f-2806-8c65-b734-9899abc1b0ff.png)



CloudWatch Logs の画面に移動すると、WorkMail 用のロググループが自動生成されています。

![image-20220122160642915.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d8ddae9d-21fc-206e-9dae-d95ebdb8a380.png)



Log Stream も自動生成されています。

![image-20220122160836815.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3ac8a97e-3949-3ff8-7b3f-b1060631f2f1.png)



1回のメール送付につき、4個のイベントが記録されています。WorkMail の内部の user001 から user002 に送付しているため、送付と受信の両方でログが記録されている状態です。

- OUTGOING_EMAIL_SUBMITTED : メールの送信リクエストを受け付けたイベント
- OUTGOING_EMAIL_SENT : メールが正常に配信されたイベント
- ORGANIZATION_EMAIL_RECEIVED : WorkMail がメールを受信したイベント
- MAILBOX_EMAIL_DELIVERED : メールボックスにメールが配信されたイベント
- 詳細は Document に記載されています。
  - https://docs.aws.amazon.com/ja_jp/workmail/latest/adminguide/monitoring-workmail-cloudwatch.html

![image-20220122160939704.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/2230ca99-a6c5-3ef8-522d-3869e3c8a7b6.png)



メールを送信した時の `OUTGOING_EMAIL_SUBMITTED `はこんな感じでログが出力されます。

- 送信元、送信先、メールタイトルが記録されてる
- メール本文は記録されていない

```json
{
    "accountId": "xxxxxxxxxxxx",
    "organizationId": "m-be3ce98c53314e96bad137a1e9a6a884",
    "traceId": "7c0c8c4b91b323ca7b2caf824c1f739a",
    "eventTime": 1642834087633,
    "event": {
        "eventName": "OUTGOING_EMAIL_SUBMITTED",
        "from": "user001@workmail.sugiaws.tokyo",
        "sender": "",
        "recipients": [
            "user002@workmail.sugiaws.tokyo"
        ],
        "subject": "WorkMail 内の user002 あてのメール"
    }
}
```



同様にメールを受信したときの `ORGANIZATION_EMAIL_RECEIVED` のログはこんな感じです。

- 送信元、送信先、メールタイトルが記録されてる
- メール本文は記録されていない

```json
{
    "accountId": "xxxxxxxxxxxx",
    "organizationId": "m-be3ce98c53314e96bad137a1e9a6a884",
    "traceId": "493088f7f0bd472498d67978658e5670",
    "eventTime": 1642834089463,
    "event": {
        "spamVerdict": "PASS",
        "recipients": [
            "user002@workmail.sugiaws.tokyo"
        ],
        "subject": "WorkMail 内の user002 あてのメール",
        "messageId": "<0100017e808ad0c6-c4e66064-51bf-4ab1-b392-0954707468a4-000000@email.amazonses.com>",
        "eventName": "ORGANIZATION_EMAIL_RECEIVED",
        "from": "user001@workmail.sugiaws.tokyo",
        "dmarcVerdict": "PASS",
        "spfVerdict": "PASS",
        "messageTimestamp": 1642834088996,
        "dkimVerdict": "PASS"
    }
}
```



# バウンスメールを送付し、ログを確認

AWS にはバウンスメールをシミュレートしてくれるメールアドレスを用意してくれており、これを使ってテストをします。メールアドレスは `bounce@simulator.amazonses.com` です。

Document
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/send-email-simulator.html



Outlook から送付

![image-20220122161856885.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e1463a53-b2da-baf3-27a9-4b41866ae56e.png)



バウンスメールなので、すぐに mailer-daemon よりメールが送付されます。

![image-20220122161946061.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e2c5bbb6-e032-edfc-798f-2dc0cb96bd05.png)



CloudWatch Logs には、新たなログが生成されています。

- OUTGOING_EMAIL_SUBMITTED : メールの送信リクエストを受け付けたイベント
- OUTGOING_EMAIL_BOUNCED : メールの送信がバウンスしたときのイベント

![image-20220122162153802.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/4f3a2907-ad8d-ad24-9f68-6105298ae180.png)



ログはこんな感じです。

```
{
    "accountId": "xxxxxxxx",
    "organizationId": "m-be3ce98c53314e96bad137a1e9a6a884",
    "traceId": "d0db181f7cca69cb4269c5723f11b98d",
    "eventTime": 1642835944318,
    "event": {
        "eventName": "OUTGOING_EMAIL_SUBMITTED",
        "from": "user001@workmail.sugiaws.tokyo",
        "sender": "",
        "recipients": [
            "bounce@simulator.amazonses.com"
        ],
        "subject": "バウンスメールタイトル"
    }
}
```



もうひとつ

```
{
    "accountId": "xxxxxxxxxxxx",
    "organizationId": "m-be3ce98c53314e96bad137a1e9a6a884",
    "traceId": "d0db181f7cca69cb4269c5723f11b98d",
    "eventTime": 1642835947603,
    "event": {
        "bouncedRecipient": {
            "status": "5.1.1",
            "action": "failed",
            "emailAddress": "bounce@simulator.amazonses.com",
            "reason": "smtp; 550 5.1.1 user unknown"
        },
        "eventName": "OUTGOING_EMAIL_BOUNCED"
    }
}
```



# バウンスメールをログから検索して見つける

CloudWatch Logs で出力したログは、CloudWatch Logs Insights の機能を使うことで、わかりやすく各種条件を付けた検索が出来ます。例えば、バウンスメールだけに限定した検索などが可能です。Document にいくつかの検索サンプルがあり、気になる方はご覧ください。

https://docs.aws.amazon.com/ja_jp/workmail/latest/adminguide/monitoring-workmail-cloudwatch.html#cw-insights



それでは、バウンスメールで検索をしてみます。Logs Insights ページを開きます。

![image-20220122163428242.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/192d4dbd-c39a-5622-11ef-f8eaaea0bec9.png)



該当の Log Group を選択します。

![image-20220122163513976.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a509e33e-b444-7653-d188-9140e04867ba.png)



次の文字列で検索します。`OUTGOING_EMAIL_BOUNCED` を指定しているのがポイントです。

```
fields @timestamp, event.destination, event.reason
| sort @timestamp desc
| filter event.eventName = "OUTGOING_EMAIL_BOUNCED"
```

![image-20220122163606945.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/458c33d3-70f4-4022-c9aa-d3fbe8a40324.png)



2回バウンスメールが発生していることがわかります。1個の詳細ログを見てみましょう。

![image-20220122163707821.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a68964ef-9661-45f0-2772-b10d6e55bdcb.png)



ログの内容を確認できます。バウンスメールの送信先メールアドレスはログでわかりますが、送信元が不明です。さらにドリルダウンするために、traceid を控えます。

![image-20220122164103659.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/67c3fe45-f7fc-597d-988c-c8485aae9865.png)



以下のクエリーを行います。

```
fields @timestamp, event.eventName
| sort @timestamp asc
| filter traceId = "d0db181f7cca69cb4269c5723f11b98d"
```



検索結果を見ると、次の内容を見つけ出すことができ、バウンスメールを適切に管理するための材料を取得できます。

- メールタイトル
- timestamp や 検索時のグラフで、おおよその時刻
- メール送信元アドレス
- メール送信先アドレス

![image-20220122164515173.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/af235081-b48b-d1d7-08bb-fb71afa4cb60.png)



# 検証を通じてわかったこと

- WorkMail のログを CloudWatch Logs に出力可能
- Logs Insights を利用して、バウンスメールのタイプや、ドメインなどの条件を指定した検索が可能
- ログにはいろいろな情報が含まれる。メールタイトルまではログに出るが、本文はログに出ない。
  - 本文まで含めて、メールの監査を実施したい場合は、E メールジャーナリングが利用できそうかも？後で確認したい
  - https://docs.aws.amazon.com/ja_jp/workmail/latest/adminguide/journaling_overview.html



# 参考URL


メッセージの追跡
https://docs.aws.amazon.com/ja_jp/workmail/latest/adminguide/tracking.html

Amazon CloudWatch による Amazon WorkMail のモニタリング
https://docs.aws.amazon.com/ja_jp/workmail/latest/adminguide/monitoring-workmail-cloudwatch.html