[アップデート]Amazon EventBridgeのルールでは、イベントパターンにワイルドカード(*)が利用できるようになりました

[アップデート]Amazon EventBridgeのルールでは、イベントパターンにワイルドカード(*)が利用できるようになりました

Clock Icon2023.10.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Amazon EventBridgeのルールでは、イベントパターンにワイルドカード(*)が利用できるようになりました。

ワイルドカード(*)とは、任意の文字または文字列と一致するための特殊な文字記号のことで、特定のパターンを持つ文字列を検索または一致させる際に使用されます。

今回のアップデートでは、イベントパターン内でワイルドカードを使用することで、dir/*のような特定のディレクトリ配下や*hoge*のような特定の単語を含む値に対して、イベントが発火できます。

同じターゲットに対して処理を行うEventBridgeのルールのうち、ワイルドカードによって、イベントパターンを集約できる可能性があり、ルール数を減らし運用管理の負担を低減することができます。

今回は、ワイルドカードを利用したEventBridgeのルールを作成し、S3にアップロードしたファイル名をトリガーにして試してみます。

S3のバケット設定

S3バケットを作成し、Amazon EventBridgeへの通知の送信を有効化します。

EventBridgeのルール作成

シナリオとしては、test-1.txttest-2.txtなどのファイル名がS3にアップロードされた際に、EventBridgeによってSNSからメールを送信します。

EventBridgeのルールを作成します。ルール名は何でもよいです。

イベントパターンは、下記の通りです。バケットは、先程作成したバケット名を記載します。

test-*.txtとすることで、シナリオ通りメール送信されます。

{
  "source": ["aws.s3"],
  "detail-type": ["Object Created"],
  "detail": {
    "bucket": {
      "name": ["cm-test-20231004"]
    },
    "object": {
      "key": [{
        "wildcard": "test-*.txt"
      }]
    }
  }
}

ターゲットは、事前にメール送信できるように設定したSNSトピックを指定します。

この設定でルールを作成します。作成後、S3にtest-1.txtファイルをアップロードします。

SNS経由で以下の内容のメールが受信されました。

{
  "version": "0",
  "id": "0de15976-bca8-4c08-056e-1fcef11d13f8",
  "detail-type": "Object Created",
  "source": "aws.s3",
  "account": "アカウントID",
  "time": "2023-10-03T21:55:37Z",
  "region": "ap-northeast-1",
  "resources": [
    "arn:aws:s3:::cm-test-20231004"
  ],
  "detail": {
    "version": "0",
    "bucket": {
      "name": "cm-test-20231004"
    },
    "object": {
      "key": "test-1.txt",
      "size": 4,
      "etag": "0cbc6611f5540bd0809a388dc95a615b",
      "sequencer": "00651C8DD9C8A655A6"
    },
    "request-id": "GS84CYDQ8RND2ZN2",
    "requester": "アカウントID",
    "source-ip-address": "クライアントIP",
    "reason": "PutObject"
  }
}

test-1.txtをS3にアップロードしたことで、イベントが発火されたことがわかります。

今回のアップデート内容であるイベントパターンにワイルドカードを使用する場合、いくつかの考慮点を紹介します。

ワイルドカードはエスケープ可能か

ワイルドカードが名前に含まれるtest-*.txtというファイル名のみをトリガーにさせたい場合、バックスラッシュを追加することでエスケープができるとドキュメントに記載がありました。

EventBridge supports using the backslash character () to specify the literal * and \ characters in wildcard filters:
- The string \* represents the literal * character
- The string \\ represents the literal \ character

イベントパターンを下記の通り、test-\*.txtとすることで、test-*.txtというファイル名のみを発火させることができるか確認します。

{
  "source": ["aws.s3"],
  "detail-type": ["Object Created"],
  "detail": {
    "bucket": {
      "name": ["cm-test-20231004"]
    },
    "object": {
      "key": [{
        "wildcard": "test-\*.txt"
      }]
    }
  }
}

イベントパターンを設定すると、無効な構文と出ました。理由は、さだかではありませんが、まだワイルドカードのエスケープ処理はできないようです。

ワイルドカードを連続して利用

ドキュメントには、以下の通り、ワイルドカードを連続して利用することはできないと記載がありましたので、試してみます。

You can specify any number of wildcard characters in a given string value; however, consecutive wildcard characters are not supported.

イベントパターンは、下記の通り、ワイルドカードを連続して使用してみます。

{
  "source": ["aws.s3"],
  "detail-type": ["Object Created"],
  "detail": {
    "bucket": {
      "name": ["cm-test-20231004"]
    },
    "object": {
      "key": [{
        "wildcard": "test**.txt"
      }]
    }
  }
}

エラー表示は出ませんでしたが、[ルールの更新]をクリックしても画面が遷移されず、更新されませんでしたので、連続して使用はできないことが確認できました。

ワイルドカードを使用したイベントパターンの複雑さ

ドキュメントには、ワイルドカードを使用したイベントパターンが複雑な場合、エラーになることがあると記載があります。

また、ドキュメントでは、エラーになる可能性が高い2つの例が紹介されていました。

  1. ワイルドカードの多用
    • 具体例:[ { "wildcard": "*:*:*:*:*:event-bus/*" } ]
  2. ワイルドカードを使用した後に同じ文字列を多用
    • 具体例:[ { "wildcard": "/Users/*/dir/dir/dir/dir/dir/doc.txt" } ]

それぞれ、実際に試してみます。

ワイルドカードの多用

実際にワイルドカードを多用してみます。

{
  "source": ["aws.s3"],
  "detail-type": ["Object Created"],
  "detail": {
    "bucket": {
      "name": ["cm-test-20231004"]
    },
    "object": {
      "key": [{
        "wildcard": "test-*-*-*-*-*-*.txt"
      }]
    }
  }
}

この場合は、エラーが以下のように表示されました。

イベントパターンは無効です。理由ルールが複雑すぎる - ワイルドカード文字を少なくするか、ワイルドカード文字の後に続く繰り返し文字列を少なくしてください。

ルールが複雑すぎる、という理由でエラーとなりました。

ちなみに、ワイルドカードが6つではなく、5つにすると問題なくルールが更新されました。

{
  "source": ["aws.s3"],
  "detail-type": ["Object Created"],
  "detail": {
    "bucket": {
      "name": ["cm-test-20231004"]
    },
    "object": {
      "key": [{
        "wildcard": "test-*-*-*-*-*.txt"
      }]
    }
  }
}

単純に「ワイルドカードを6つ以上使用するとエラーになる」、というわけではないと思いますが、参考値として認識頂ければ幸いです。

ワイルドカードを使用した後に同じ文字列を多用

ワイルドカードを使用した後に、同じ文字列を多用してみます。

ドキュメントの例として、挙げられていた内容をそのまま使用してみます。

{
  "source": ["aws.s3"],
  "detail-type": ["Object Created"],
  "detail": {
    "bucket": {
      "name": ["cm-test-20231004"]
    },
    "object": {
      "key": [{
        "wildcard": "/Users/*/dir/dir/dir/dir/dir/doc.txt"
      }]
    }
  }
}

上記の場合は、問題なくルールを更新できました。

もう少し多く/dirを追加してみると、複雑すぎるルールのため、エラーが出ました。

{
  "source": ["aws.s3"],
  "detail-type": ["Object Created"],
  "detail": {
    "bucket": {
      "name": ["cm-test-20231004"]
    },
    "object": {
      "key": [{
        "wildcard": "/Users/*/dir/dir/dir/dir/dir/dir/dir/dir/dir/dir/doc.txt"
      }]
    }
  }
}

最後に

今回のアップデートでは、イベントパターンにワイルドカード(*)が利用できるようになりました。

ワイルドカードを利用することで、EventBridgeのルールを集約できる可能性がありますので、ぜひ見直してみてください。

一部、ワイルドカードを使用した制限がありますので、エラーになった場合、解説した内容をもとに、ワイルドカードの使用数や繰り返しの文字列の使用を抑えましょう。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.