【AWS ChatBot】カスタム通知を試してみた(AWS CLI,boto3,EventBridge)

記事タイトルとURLをコピーする

こんにちは。AWS CLIが好きな福島です。

はじめに

先月のアップデートでAWS ChatBotがカスタム通知に対応しました。 今回は実際にカスタム通知を試したため、その内容をブログに記載します。

aws.amazon.com

カスタム通知とは?

まずAWS ChatBotでは、様々なAWSのイベントをAmazon Chime、Microsoft Teams、または Slack に通知することができ、通知する内容はAWS側で良い感じに整形してくれています。

  • AWS ChatBot(Slack)の通知例

比較として、Amazon EventBridgeで受信したイベントをSNS(Email)に連携した通知の画像を以下に貼っておりますが、 ご覧の通り生のJSONが記載されており、見づらいかと思います。(EventBridgeの入力トランスフォーマーを使うことで整形することは可能です。)

  • SNS(Email)の通知例

上記の通り、ChatBotを利用することでAWSで良い感じに整形してくれたメッセージを受け取るができとても便利だったのですが、 メッセージをユーザー側でカスタムすることはできなく、カスタムしたい場合はそれぞれのアプリのネイティブな機能を使う必要がありました。 (例えばSlackであればIncoming WebHooksやAPIを使う必要がありました。)

ということで前置きが長くなってしまったのですが、今回のアップデートで(それぞれのアプリのネイティブな機能を使わずに)ユーザー側でメッセージをある程度自由にカスタムできるようになりました!

試しにSecurity Hubの通知をカスタムしてみたのですが、以下のようにデフォルトの通知内容より情報を含めることができています。

  • AWS ChatBot(Slack)のカスタム通知例

カスタム通知のやり方

まず、AWS ChatBotはSNSのサブスクリプションに登録して利用するかと思います。 そのため、AWS ChatBotのカスタム通知を利用するためには、SNSに対してカスタム通知機能に準拠したイベントスキーマを飛ばすことでメッセージをカスタムすることができます。

docs.aws.amazon.com

イベントスキーマには複数のパラメーターが含まれていますが、何を利用できるかは、上記をご確認いただければと思います。 以下は、必須またはほとんどのケースで使うであろうパラメーターを含むイベントを記載します。

{
  "version": "1.0",
  "source": "custom",
  "content": {
    "title": "カスタム通知のテスト",
    "description": "カスタム通知のテストになります\nカスタム通知のテストになります"
  }
}
  • 説明

    • version: 1.0 で固定です。
    • source: custom で固定です。
    • title : メッセージのタイトルになります。
    • description : メッセージの本文になります。
  • カスタム通知のイメージ図

カスタム通知のイメージとしては上記の通りです。図にはEventBridgeとLambdaしか記載していませんが、 要は、SNS Publish APIのmessageキーにカスタム通知に準拠したイベントを送信することができればメッセージをカスタムすることができます。

EventBridgeとSNSを連携している場合は、(おそらく)EventBridgeから送信されたデータがそのまま、SNS Publish APIのmessageキーに含まれるようなため、 入力トランスフォーマーを使うことでカスタム通知に準拠したイベントに変換する必要があります。

実際に試してみる

ここからAWS CLI,boto3,EventBridgeを利用してカスタム通知を試してみます。 ※SNSおよびChatBotの設定が完了している前提で記載します。

AWS CLIで試してみる

  • テストイベント記載したファイルを作成する。

今回はSlackの絵文字を使いたいため、titleに「:rotating_light:」を含めます。 また、メッセージの本文には、ハイパーリンクを入れてみます。

最大文字数はtitleが250 文字で、descriptionが8000文字になるため、ご注意ください。

$ cat sample-event.json  
{
  "version": "1.0",
  "source": "custom",
  "content": {
    "title": ":rotating_light:カスタム通知のテスト",
    "description": "カスタム通知のテストになります\n<https://blog.serverworks.co.jp/|サーバーワークスエンジニアブログ>"
  }
}
$ 
  • sns publish apiの実行
## 実行コマンド
aws sns publish \
   --topic-arn [TopicArn] \
   --message file://sample-event.json

## 実行結果イメージ
$ aws sns publish \
   --topic-arn arn:aws:sns:ap-northeast-1:123456789012:xxxxx \
   --message file://sample-event.json
{
    "MessageId": "fedcee42-2572-506b-8d2e-b3f0c408a8d7"
}
   ~/Desktop
$ 

無事にパトランプのリアクションとサーバーワークスエンジニアブログのハイパーリンクを含めることができました。

boto3で試してみる

## test.pyの中身
import boto3
import json

test_event = json.dumps({
  "version": "1.0",
  "source": "custom",
  "content": {
    "title": ":rotating_light:カスタム通知のテスト",
    "description": "カスタム通知のテストになります\n<https://blog.serverworks.co.jp/|サーバーワークスエンジニアブログ>"
  }
})

sns = boto3.client('sns')

response = sns.publish(
    TopicArn='arn:aws:sns:ap-northeast-1:123456789012:xxxxx',
    Message=test_event
)

print (response)
python3 test.py

無事にパトランプのリアクションとサーバーワークスエンジニアブログのハイパーリンクを含めることができました。

EventBridgeの入力トランスフォーマーで試してみる

今回は、AWSアカウントの作成(CreateAccountResult)イベントを通知することを想定して試してみます。

まずは、EventBridgeのルールとターゲット、入力トランスフォーマーの設定をする必要があるため、 26行目の【TopicArn】を修正した上で以下のスタックを流します。 36行目と37行目を修正することでメッセージを変更することができます。

AWSTemplateFormatVersion: '2010-09-09'
Description: CloudFormation template for EventBridge rule 'test'
Resources:
  EventRule0:
    Type: AWS::Events::Rule
    Properties:
      EventBusName: default
      EventPattern:
        source:
          - test-event.source
        detail-type:
          - AWS Service Event via CloudTrail
        detail:
          eventSource:
            - organizations.amazonaws.com
          eventName:
            - CreateAccountResult
          serviceEventDetails:
            createAccountStatus:
              state:
                - SUCCEEDED
      Name: test
      State: ENABLED
      Targets:
        - Id: Idbff27853-9914-4f6c-8abb-eb4a3282baea
          Arn: 【TopicArn】
          InputTransformer:
            InputPathsMap:
              accountId: $.detail.serviceEventDetails.createAccountStatus.accountId
              state: $.detail.serviceEventDetails.createAccountStatus.state
            InputTemplate: |-
              {
                "version": "1.0",
                "source": "custom",
                "content": {
                  "title": ":tada: 新しくAWSアカウントが発行されました | <accountId> | <state>",
                  "description": "新しくAWSアカウントが発行されました。\n\n詳細は、マネジメントアカウントで<https://us-east-1.console.aws.amazon.com/organizations/v2/home/accounts/<accountId>|リンク>にアクセスしてください。"
                }
              }

※10行目は本来、aws.organizationsを指定する必要がありますが、テストイベントに反応するようにあえて、test-event.sourceにしています。 そのため、実際の運用で利用する場合は、aws.organizationsを指定する必要がある点はご注意ください。

  • テストイベントを発行
TEST_EVENT='[                                  
    {
        "Source": "test-event.source",
        "DetailType" : "AWS Service Event via CloudTrail",
        "Detail": "{\"eventSource\": \"organizations.amazonaws.com\",\"eventName\": \"CreateAccountResult\",\"serviceEventDetails\": {\"createAccountStatus\": {\"accountId\": \"123456789012\",\"state\": \"SUCCEEDED\"}}}"
    }
]'
aws events put-events --entries "${TEST_EVENT}"

無事に通知が来ることを確認できました!

終わりに

今回はカスタム通知の機能について、ご紹介しました。どなたかのお役に立てれば幸いです。

福島 和弥 (記事一覧)

2019/10 入社

AWS CLIが好きです。