share facebook facebook facebook twitter twitter menu hatena pocket slack

2020.03.30 MON

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

甲斐 甲

WRITTEN BY 甲斐 甲

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/* )を対象にしたいケースがあります。

{
    "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”.

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

素敵です。最高です。

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

{
    "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.

{
  "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

元記事はこちら

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

甲斐 甲

甲斐 甲

2018/7にJOIN。 最近の好みはサーバレスです。なんでもとりあえず試します。

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。