CreateAccountResult を Input transformer で整形し正しく Slack へ連携されるようにする

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

マネージドサービス部 佐竹です。
Amazon EventBridge の API Call via CloudTrail から CreateAccountResult を AWS Chatbot を通じて Slack へと連携すると期待通りに表示されないため、これを解決するための記事になります。

はじめに

blog.serverworks.co.jp

以前、上記のブログで AWS アカウントの新規作成をフックして通知する内容について記載しました。本ブログは上記ブログの補足記事になります。

1点目、この中で「AWS Chatbot に対応していない」という旨をお伝えしましたが、現在は対応しています。今回は、AWS Chatbot 連携時のお話です。

2点目、CreateAccount よりも CreateAccountResult を確認するほうが運用としてベターという話をしました。

2点目については以下の公式ドキュメントもご参考ください。

docs.aws.amazon.com

ということで、CreateAccountResult の API Call を AWS Chatbot から Slack へと連携してみました。

なのですが・・・

CreateAccountResult が正しく表示されない

何が何だかわからない

上画像の通り、結果が正しく連携されません。

なお CreateAccount は以下の通り、問題なく Slack へと連携されます。

理由を想像してみたのですが CreateAccount は AWS へと送信し、受け取られた素の API Call です。ですが CreateAccountResult 側は「結果の返り値」のような API Call のため、恐らく Chatbot が整形するために必要な情報が揃っていないのだと思われます。

参考までに CreateAccountResult の元ネタとなる JSON は、以下の通りです。

{
    "version": "0",
    "id": "c3951119-exmple99c7-b6d3-0755e8be9c83",
    "detail-type": "AWS Service Event via CloudTrail",
    "source": "aws.organizations",
    "account": "123456789012",
    "time": "2023-06-28T03:29:54Z",
    "region": "us-east-1",
    "resources": [],
    "detail": {
        "eventVersion": "1.08",
        "userIdentity": {
            "accountId": "123456789012",
            "invokedBy": "AWS Internal"
        },
        "eventTime": "2023-06-28T03:29:54Z",
        "eventSource": "organizations.amazonaws.com",
        "eventName": "CreateAccountResult",
        "awsRegion": "us-east-1",
        "sourceIPAddress": "AWS Internal",
        "userAgent": "AWS Internal",
        "requestParameters": null,
        "responseElements": null,
        "eventID": "4aacbfa3-exmple-a287-399b0804dbff",
        "readOnly": false,
        "eventType": "AwsServiceEvent",
        "managementEvent": true,
        "recipientAccountId": "123456789012",
        "serviceEventDetails": {
            "createAccountStatus": {
                "id": "car-834exmpleexmpleexmple7cac6aeb08c2",
                "state": "SUCCEEDED",
                "accountName": "****",
                "accountId": "NEWACCOUNTID",
                "requestedTimestamp": "Jun 28, 2023 3:29:52 AM",
                "completedTimestamp": "Jun 28, 2023 3:29:54 AM"
            }
        },
        "eventCategory": "Management"
    }
}

何はともあれ、このままだとあまりにも可読性が悪いため、Input transformer で手を加えます。

Configure input transformer

Amazon EventBridge の各 Rule において設定が可能な「Input transformer」は、そのイベントのターゲットに情報を渡す前に内容をカスタマイズする機能です。

詳しくは、以下の AWS 公式ドキュメントに記載のあるチュートリアルもご確認ください。

docs.aws.amazon.com

具体的な設定例は以下の通りです。

Input path

{
    "account": "$.account",
    "eventID": "$.detail.eventID",
    "eventName": "$.detail.eventName",
    "id": "$.id",
    "region": "$.region",
    "source": "$.source",
    "state": "$.detail.serviceEventDetails.createAccountStatus.state",
    "time": "$.time",
    "userAgent": "$.detail.userAgent"
}

Input template (Template)

{
    "version": "0",
    "id": "<id>",
    "detail-type": "AWS API Call via CloudTrail",
    "source": "<source>",
    "account": "<account>",
    "time": "<time>",
    "region": "<region>",
    "resources": [],
    "detail": {
        "eventVersion": "1.08",
        "userIdentity": {
            "arn": "No ARN"
        },
        "userAgent": "<userAgent>",
        "eventTime": "<time>",
        "eventName": "<eventName>(<state>)",
        "awsRegion": "<region>",
        "eventID": "<eventID>",
        "eventType": "AwsServiceEvent"
    }
}

Generate output

最初に掲載しました CreateAccountResult の元ネタとなる JSON を「Sample event」として利用すると、Output の検証も可能です。

画面キャプチャーに記載されている Output は以下の通りです。

{
  "version": "0",
  "id": "c3951119-exmple99c7-b6d3-0755e8be9c83",
  "detail-type": "AWS API Call via CloudTrail",
  "source": "aws.organizations",
  "account": "123456789012",
  "time": "2023-06-28T03:29:54Z",
  "region": "us-east-1",
  "resources": [],
  "detail": {
    "eventVersion": "1.08",
    "userIdentity": {
      "arn": "No ARN"
    },
    "userAgent": "AWS Internal",
    "eventTime": "2023-06-28T03:29:54Z",
    "eventName": "CreateAccountResult(SUCCEEDED)",
    "awsRegion": "us-east-1",
    "eventID": "4aacbfa3-exmple-a287-399b0804dbff",
    "eventType": "AwsServiceEvent"
  }
}

この設定を行った状態で AWS Chatbot から連携された Slack の投稿を確認してみましょう。

Input transformer 成形後の Slack 投稿

CreateAccountResult(SUCCEEDED)

CreateAccountResult を Input transformer で整形したところ、上画像の通り正常に Slack 連携がされるようになりました。

ステータスを Slack へ連携し表示させるために

今回のポイントは「Event name」に「CreateAccountResult(SUCCEEDED)」という成功のステータスを表示している箇所です。

AWS Chatbot の Slack への通知形式に関しましては、変更することが不可能な仕様です。このため、通知内容に(少々無理に)入れ込む改変を行っています。

それが「Input path」における "state" : "$.detail.serviceEventDetails.createAccountStatus.state" の設定箇所であり、「Input template」における "eventName": "<eventName>(<state>)" の設定箇所になります。

正直これらについては設定方法が不明であったため、AWS サポートに調査をお願いしました。結果的にうまく行って安心しています。

補足: API Call を Chatbot 連携した場合にどの項目が Slack に表示されるのか?

表示される項目は5つのみです。具体的には以下の通りになります。

  1. User identity
  2. User agent
  3. Event name
  4. Event ID
  5. Event time

よって、これ以外の JSON に記載がされている情報は Slack から閲覧ができません。

state の項目を6つ目として用意することもできないため、「Event name」に state を合わせて入れ込んでいるという補足でした。

まとめ

画像の再掲

本ブログ記事では、Amazon EventBridge の API Call via CloudTrail から CreateAccountResult を AWS Chatbot を通じて Slack へと連携すると期待通りに表示されないために、これを Input transformer の設定で解決する 方法について記載しました。

この記事で、同様の問題に悩まれている方が1人でも救われれば幸いです。

では、またお会いしましょう。

佐竹 陽一 (Yoichi Satake) エンジニアブログの記事一覧はコチラ

マネージドサービス部所属。AWS資格全冠。2010年1月からAWSを利用してきています。2021-2022 AWS Ambassadors/2023 Japan AWS Top Engineers/2020-2023 All Certifications Engineers。AWSのコスト削減、最適化を得意としています。