Amazon CloudWatch EventsのルールでAmazon S3のキーをプレフィックス指定できた

Amazon CloudWatch EventsでS3のイベントをトリガーにすることができますが、ソースに指定できるのは完全一致するバケット名とキーだと思っていたのですが、プレフィックス指定できること知って、ふぁーっ！となったのでメモ。


## イベントルールを用意する

イベントルールの作成方法は下記を参考にしました。

Amazon S3 ソースの CloudWatch イベント ルールを作成する (コンソール) - CodePipeline
https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/create-cloudtrail-S3-source-console.html

イベントルールのカスタムイベントパターンは下記のように指定するのですが、**`my-bucket/my-key` オブジェクトのイベントのみ**を検知してトリガーされます。単一のオブジェクトではなく、`detail.requestParameters.key` 配下のオブジェクトすべて(例えば`my-key/*` )を対象にしたいケースがあります。

```json
{
    "source": [
        "aws.s3"
    ],
    "detail-type": [
        "AWS API Call via CloudTrail"
    ],
    "detail": {
        "eventSource": [
            "s3.amazonaws.com"
        ],
        "eventName": [
            "CopyObject",
            "CompleteMultipartUpload",
            "PutObject"
        ],
        "requestParameters": {
            "bucketName": [
                "my-bucket"
            ],
            "key": [
                "my-key"
            ]
        }
    }
}
```

アスタリスク(`*` )が利用できればよいのですが、残念ながら利用できないので、これまでは諦めていたのですが、下記ドキュメントにプレフィックス指定ができるとありました。ドキュメントは2019年12月19日に追加されたみたいです。

Content-based Filtering with Event Patterns - Amazon EventBridge
https://docs.aws.amazon.com/eventbridge/latest/userguide/content-filtering-with-event-patterns.html#filtering-prefix-matching

>*Prefix Matching*
>You can match on the prefix of a value in the event source. For example, the following event pattern would match on any event where the "time" field started with "2017-10-02".

>```json
{
  "time": [ { "prefix": "2017-10-02" } ],
}
```

素敵です。最高です。

イベントルールのカスタムイベントパターンでは下記のように利用できます。

```json
{
    "source": [
        "aws.s3"
    ],
    "detail-type": [
        "AWS API Call via CloudTrail"
    ],
    "detail": {
        "eventSource": [
            "s3.amazonaws.com"
        ],
        "eventName": [
            "CopyObject",
            "CompleteMultipartUpload",
            "PutObject"
        ],
        "requestParameters": {
            "bucketName": [
                { "prefix": "my-" }
            ],
            "key": [
                { "prefix": "my-key/" }
            ]
        }
    }
}
```

`detail.requestParameters.key` だけかなと思ってましたが、`detail.requestParameters.bucketName` でも指定可能です。
`detail.requestParameters.key` には`/` も指定できるので、指定キー配下のオブジェクトを対象にできます。

素敵です。最高です。


### アスタリスク！？

下記に「アスタリスク使えるよ。」的なコメントがあり、期待を込めて検証しましたがアスタリスクは利用できませんでした。「2020年2月にリリースされた」とありますが、ドキュメント(英語)をみてもそれらしき記述はありません。もしかすると特定のリージョンのみで適用されていたりするのでしょうか？？？(2020年3月時点)

amazon s3 - Does AWS CloudWatch Events Rule supports any wildcards in S3 bucket/key names - Stack Overflow
https://stackoverflow.com/questions/49435580/does-aws-cloudwatch-events-rule-supports-any-wildcards-in-s3-bucket-key-names


>I found a fancy solution for this using Content-based filtering (released in February 2020) like prefix for example.

>```json
{
  "source": ["aws.s3"],
  "account": ["1111111xxxxx"],
  "detail": {
    "eventSource": ["s3.amazonaws.com"],
    "eventName": ["PutObject"],
    "requestParameters": {
      "bucketName": ["mybucket"],
      "key": ["myfile-*"]
    }
  }
}
```

### まとめ

日々アップデートされるAWSですが、すべてが告知されるわけでなくドキュメントがひっそりと更新されるケースもあるので、利用頻度が高いサービスだけでも定期的に最新情報を確認しなきゃなと改めて感じました(まる)


## 参考

Amazon S3 ソースの CloudWatch イベント ルールを作成する (コンソール) - CodePipeline
https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/create-cloudtrail-S3-source-console.html

Content-based Filtering with Event Patterns - Amazon EventBridge
https://docs.aws.amazon.com/eventbridge/latest/userguide/content-filtering-with-event-patterns.html#filtering-prefix-matching

amazon s3 - Does AWS CloudWatch Events Rule supports any wildcards in S3 bucket/key names - Stack Overflow
https://stackoverflow.com/questions/49435580/does-aws-cloudwatch-events-rule-supports-any-wildcards-in-s3-bucket-key-names