S3の特定パス配下にファイルが配置されたことを検知して、Amazon EventBridge(CloudwatchEvents)を実行する

これはなに?

S3の特定のパス配下にファイルが配置されたことを検知して、Amazon EventBridge(CloudwatchEvents)を実行するための設定方法。
Amazon EventBridgeからLambdaやCodePipelineを呼べるので、様々の処理のトリガーとして使えます。

Amazon EventBridgeの一般的な設定方法は割愛するので以下参照。
Amazon S3 ソースの CloudWatch イベント ルールを作成する (コンソール) - AWS CodePipeline

実施したいことのイメージ

f:id:ykoomaru:20200903191235p:plain

前提

・S3バケットが作成されていること ・Cloudtrailが有効化されていること

設定

Amazon EventBridge(CloudwatchEvents)設定

以下のパラメータより、Amazon EventBridgeを設定する。
カスタムパターンの "prefix": "<your_prefix>" の設定がポイント。

  • 名前: 任意
  • 説明: 任意
  • パターン: イベントパターン
  • イベント一致パターン: カスタムパターン
  • ターゲット: 任意(S3にファイルが配置されてことを検知して実行したいサービスを指定)

イベントパターン

  • <your_bucket_name>: S3バケット名
  • <your_prefix>: Prefix名
      • aaa.txt : aaa.txt がS3バケット内のどこかに配置されると実行
      • prefix/ : prefix/ 配下にファイルが配置されると実行
{
  "detail-type": [
    "AWS API Call via CloudTrail"
  ],
  "source": [
    "aws.s3"
  ],
  "detail": {
    "eventSource": [
      "s3.amazonaws.com"
    ],
    "requestParameters": {
      "bucketName": [
        "<your_bucket_name>"
      ],
      "key": [
        {
          "prefix": "<your_prefix>"
        }
      ]
    },
    "eventName": [
      "CopyObject",
      "PutObject",
      "CompleteMultipartUpload"
    ]
  }
}

※ AWSコンソール上のCloudwatchEventsのPrefixを設定しようとすると構文エラーとなるので、AWSCLIを利用するかAmazon EventBridgeの画面から作業するようにしましょう。

動作確認

S3バケットの特定の場所(prefix/)にファイルが配置されたことをAmazon EventBridge(CloudwatchEvents)が検知してLambdaを実行します。
Lambdaのイベントデータよりどのアクションがトリガーになったのかを確認します。

S3バケット名: prefix-test1
イベントパターン

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

S3://prefix-test1/prefix/に aaa.txt を配置

<Lambdaイベントデータ>

︙
 'eventTime': '2020-09-03T10:37:15Z', 'eventSource': 's3.amazonaws.com', 'eventName': 'PutObject', 'awsRegion': 'ap-northeast-1'
︙  
 'resources': [{'type': 'AWS::S3::Object', 'ARN': 'arn:aws:s3:::prefix-test1/prefix/aaa.txt'}, {'accountId': 'xxxxxxxxxx', 'type': 'AWS::S3::Bucket', 'ARN': 'arn:aws:s3:::prefix-test1'}], 'eventType': 'AwsApiCall', 'managementEvent': False, 'recipientAccountId': 'xxxxxxxxxx', 'eventCategory': 'Data'}}

prefix-test1/prefixにaaa.txt がPutされたことがトリガーとなっています。

S3://prefix-test1/prefix/aaa/に aaa.txt を配置

<Lambdaイベントデータ>

︙
 'eventSource': 's3.amazonaws.com', 'eventName': 'PutObject', 'awsRegion': 'ap-northeast-1',
︙
'resources': [{'type': 'AWS::S3::Object', 'ARN': 'arn:aws:s3:::prefix-test1/prefix/aaa/aaa.txt'}, {'accountId': 'xxxxxxxxxx', 'type': 'AWS::S3::Bucket', 'ARN': 'arn:aws:s3:::prefix-test1'}], 'eventType': 'AwsApiCall', 'managementEvent': False, 'recipientAccountId': 'xxxxxxxxxx', 'eventCategory': 'Data'

prefix-test1/prefix/aaaにaaa.txt がPutされたことがトリガーとなっています。

最後に

CloudwatchEventsのコンソールでPrefix設定できなかったり、Cloudtrailを有効化し忘れていたりして結構ハマりましたが無事設定できました。