AWS Health Aware を Power Automate の Teams Incoming Webhook コネクタに対応させる

# はじめに
Microsoft (以下MS) が、Teams内のOffice 365コネクタを廃止することを発表しました。
これにはIncoming Webhookも含まれ、記事執筆時点では、以下のスケジュールが設定されています。

2024年8月15日: 新規コネクタの作成が停止し、これ以降、新規にIncoming Webhookを利用する場合、Power Automateのワークフローでコネクタを介して受信する方式に対応する必要あり
2024年12月31日: 既存のWebhook URLが無効化される予定 (ただし、URLを更新すれば2025年12月まで利用可能)
最新の情報は、以下のMS公式サイトをご参考ください。

https://devblogs.microsoft.com/microsoft365dev/retirement-of-office-365-connectors-within-microsoft-teams/

さて、このMSのコネクタ廃止に伴い、AWSが出している **「AWS Health Aware」** をお使いの方は、WebhookのURLが変更になるため、移行の対応が必要になります。

本記事では、AWS Health Awareをお使いの方がどのような対応を行えば、新しいPower Automateの方式にスムーズに移行できるのかについて解説します。

# AWS Health Awareとは
AWS Health Awareは、AWS Healthからのプロアクティブでリアルタイムなアラートを、普段使っているコミュニケーションツールに連携するためのフレームワークおよびツール群です。
AWS Health Awareを活用することで、AWS上で実行されるアプリケーションの信頼性と可用性を向上させ、インシデントからの復旧プロセスを改善することができます。

以下の公式ブログは2022年の記事で、AWSの特にサービスやリージョンレベルの障害時にAWS Health Dashboardに掲載される類のアラートを管理者宛に通知する手段として注目されました。

https://aws.amazon.com/jp/blogs/news/aws-health-aware-customize-aws-health-alerts-for-organizational-and-personal-aws-accounts/

AWS Health Awareの主な特徴は以下の通りです。

### AWS Organizations連携
AWS Organizationsを利用している場合、組織内の影響を受けるアカウントから集計されたアクティブなアカウントレベルのアラートを受け取ることができます。

### 通知先を柔軟に設定
アラートの通知先には、Slack、Microsoft Teams、Amazon Chime、Eメールやその他のエンドポイントを設定することができます。

### タグベースのフィルタリング
AWSリソースにタグを付けることで、関連するAWS Health イベントのみを選択的に通知できます。

### 通知の強化
Lambda関数を使用して、AWS Health イベントに環境やチーム名などの情報を追加することも可能です。

### 導入が簡単
CloudFormationやTerraformのテンプレートを展開するだけで、通知設定を簡単に構築できます。


# MSのO365コネクタ廃止に伴う要対応箇所
これらの魅力的な特徴を受け、少なくない企業でAWS Health Awareが導入されているのではないかと思われます。
その中には、通知先にTeamsのIncoming Webhookを使用しているケースも多いでしょう。

今回のMSの対応を受け、受信側のTeamsのIncoming WebhookをPower Automate方式に移行する必要があります。
移行のイメージは、以下の記事で解説しましたので、ご参照ください。

https://qiita.com/nasuvitz/items/808cd9f3e9d097e5dfd1

実際に移行する際は、以下の2つのポイントで対応が必要になります。

### (1) Incoming WebhookのURLを変更する
Power AutomateのIncoming Webhook受信トリガーのコネクタを作成すると、新たにIncoming WebhookのURLが作成されます。
URLが変更となりますので、CloudFormationまたはTerraformのパラメータを変えて、スタックのアップデートが必要です。

CloudFormationの場合は `MicrosoftTeamsWebhookURL` になります。

```CFN_DEPLOY_AHA.yml
AWSTemplateFormatVersion: '2010-09-09'
Description: CloudFormation Template for AWS Health Aware (AHA)
Metadata:
  'AWS::CloudFormation::Interface':
    ParameterGroups:
      - Label:
          default: Customize Alerts/Notifications
        Parameters:
          - AWSOrganizationsEnabled
          - AWSHealthEventType
      - Label:
          default: Package Information
        Parameters:
          - S3Bucket
          - S3Key
      - Label:
          default: >-
            Communication Channels - Slack/Microsoft Teams/Amazon Chime And/or
            EventBridge
        Parameters:
          - SlackWebhookURL
          - MicrosoftTeamsWebhookURL
          - AmazonChimeWebhookURL
          - EventBusName

(以下略)
```

### (2) カードを投稿するPower Automateのコネクタを作成する
以下のコードは、AWS Health Awareを構成する `messagegenerator.py` の中の、Teamsに投稿するメッセージを作成する関数の部分を抜粋したものです。

```python:messagegenerator.py
def get_org_message_for_teams(event_details, event_type, affected_org_accounts, affected_org_entities):
    message = ""
    summary = ""
    if len(affected_org_entities) >= 1:
        affected_org_entities = "\n".join(affected_org_entities)
    else:
        affected_org_entities = "All resources in region"
    if len(affected_org_accounts) >= 1:
        affected_org_accounts = "\n".join(affected_org_accounts)
    else:
        affected_org_accounts = "All accounts in region"
    if event_type == "create":
        title = "&#x1F6A8; [NEW] AWS Health reported an issue with the " + event_details['successfulSet'][0]['event'][
            'service'].upper() + " service in the " + event_details['successfulSet'][0]['event'][
                    'region'].upper() + " region."
        message = {
            "@type": "MessageCard",
            "@context": "http://schema.org/extensions",
            "themeColor": "FF0000",
            "summary": "AWS Health Aware Alert",
            "sections": [
                {
                    "activityTitle": title,
                    "markdown": False,
                    "facts": [
                        {"name": "Account(s)", "value": affected_org_accounts},
                        {"name": "Resource(s)", "value": affected_org_entities},
                        {"name": "Service", "value": event_details['successfulSet'][0]['event']['service']},
                        {"name": "Region", "value": event_details['successfulSet'][0]['event']['region']},
                        {"name": "Start Time (UTC)", "value": cleanup_time(event_details['successfulSet'][0]['event']['startTime'])},
                        {"name": "Status", "value": event_details['successfulSet'][0]['event']['statusCode']},
                        {"name": "Event ARN", "value": event_details['successfulSet'][0]['event']['arn']},
                        {"name": "Updates", "value": event_details['successfulSet'][0]['eventDescription']['latestDescription']}
                    ],
                }
            ]
        }

(中略)

    return message
```

このコードを見ると分かるように `"@type": "MessageCard"` となっていることから、Incoming Webhookでは`MessageCard`を構成するjson形式の文字列を受信していることが分かります。

これは、Teamsのスレッドに以下のようなカードのフォーマットでメッセージを投稿する機能です。

https://learn.microsoft.com/ja-jp/microsoftteams/platform/webhooks-and-connectors/how-to/connectors-using

現在のAWS Health Awareは、以下のフォーマットでTeamsにメッセージを投稿します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211986/5846a887-3d34-88df-0b3f-7009dd766632.png)

**しかし、Power Automateのコネクタには`MessageCard`形式を処理できるものがないため、新方式に移行する際は、受信するデータを毎回`AdaptiveCard`に変換する(そのためのコネクタを作成する)か、必要なキーの値だけ抽出してメッセージとして投稿するか、いずれかの対応が必要になります。**
**これらの変換は、なんとスクラッチで実装する必要があります。**

:::note warn
**2024/11: 本件について、マイクロソフトの公式サイトに、この開発が不要になるアップデートが予定されていると受け止められる文章が掲載されております。今後の情報にご注意ください。**
https://devblogs.microsoft.com/microsoft365dev/retirement-of-office-365-connectors-within-microsoft-teams/

* ワークフローアプリのパリティ機能に関する注意
    * 現在、次のシナリオをサポートするために、Workflow アプリで Webhook を使用する方法を開発しており、2025 年 3 月 30 日までに詳細を共有する予定です
        * メッセージカード形式のメッセージ ペイロードを投稿します (ペイロードをアダプティブ カードに再フォーマットする必要はありません)
        * プライベートチャンネルに投稿する
:::

詳しくは以下のサイトが参考になります。

https://stackoverflow.com/questions/78756214/converting-teams-webhook-with-payload-type-messagecard-to-be-used-in-power-autom

https://answers.microsoft.com/en-us/msoffice/forum/all/converting-teams-webhooks-to-power-automate/23704b44-aa49-4b5d-84a3-2c760d195f3e

https://github.com/prometheus/alertmanager/issues/3920#issuecomment-2219950227

[先のブログ](https://qiita.com/nasuvitz/items/808cd9f3e9d097e5dfd1)で解説したように、jsonで受信したデータの中から、必要なものを取り出してメッセージに書くように実装するのが最も簡単でしょう。

以上2点の対応を行うことで、AWS Health Awareを新しいPower Automate方式のIncoming Wabhookに対応させることができます。

# 終わりに
**Incoming Webhookの仕様変更が監視や運用に与える影響は、決して少なくありません。**

仕様変更がWebhookの送信方式や、受信後の処理方式に影響を及ぼす場合、既存のシステム連携が破綻する可能性があります。

特に、今回のように受信側の方式が変わることを気づかずに無視していると、ある日突然、不測の事態に重要な通知が届かなくなり、業務上の影響に発展してしまいます。

また、メンテナンスや運用の手順にも影響を与えます。
今回、新方式に移行することでWebhookのURLが変更されますが、これは関連するすべてのシステムやサービスでの設定変更が必要になることを意味します。

今回は、MSの仕様変更がAWSのソリューションを活用した運用 (特に本件のような障害に関する通知や連絡) にダイレクトに影響を及ぼすという珍しい例であり、あまり経験がない視点であるためか、まだこの課題があまり周知されていない印象を受けました。

本記事をお読みいただき、AWS Health Awareだけに限らず、皆様のシステム監視や運用で対応が必要ではないかとお気づきいただいた方は、ぜひ、自環境での影響を見直してみてください。

# 関連記事およびサイト
https://aws.amazon.com/jp/blogs/news/aws-health-aware-customize-aws-health-alerts-for-organizational-and-personal-aws-accounts/

https://github.com/aws-samples/aws-health-aware

https://devblogs.microsoft.com/microsoft365dev/retirement-of-office-365-connectors-within-microsoft-teams/

https://qiita.com/nasuvitz/items/808cd9f3e9d097e5dfd1