見出し画像

AWS CDKでAmazon EventBridgeのルールの入力トランスフォーマーの設定


背景

AWS CDKでEventBridgeのルールの入力トランスフォーマーを設定したいケースが発生しました。ネットで調べたところ、CfnRuleでの設定の記事はいくつかあったのですが、L2コンストラクタでの方法が見つからずといった状況でした。CDKソースを見てみると出来そうな感じなので、粘っていたところ以下のGitHubのイシューが見つかりました。

このイシュー自体は別の問題に対して上がっているものですが、Generated YAML:の部分を見ると、生成されたCloudFormationのテンプレートとして、入力トランスフォーマの形で出力自体は出来ていることが分かります。CDKのソースを見ると、events.EventField.fromPathを利用してやれば良さそうなのが分かりました。

求めていたのはこれだ。

ということで、コードを書いてCDKでデプロイしたところ、上手く設定が出来、無事に動作することまで確認ができました。

コード例

コード例を記載する前に、コード例として実現したい事は以下です。

S3にファイルがアップロードされたらEventBridgeに通知し、AWS Batchへ連携する、そのためのCDKでのEventBridgeルールの入力トランスフォーマの設定

そして、入力トランスフォーマの設定で実現したいことは以下です。

入力パスでバケット名とオブジェクトキーを取得して、入力テンプレートでAWS Batchのパラメーターとしてバケット名とオブジェクトキーを設定

入力パス

{
  "detail-bucket-name": "$.detail.bucket.name",
  "detail-object-key": "$.detail.object.key"
}

入力テンプレート

{
  "Parameters": {
    "bucketName": <detail-bucket-name>, 
    "objectKey": <detail-object-key>
  }
}

AWS Batch側のコンテナで実行するコマンドは以下です。

command: [
  'echo', 'バケット名: ', 'Ref::bucketName', ', オブジェクトキー: ', 'Ref::objectKey',
],

それでは、以下がCDKのコードです。

const rule = new Rule(this, 'S3PutEventRule', {
  ruleName: `${namePrefix}-s3-put-rule`,
  eventPattern: {
    source: ['aws.s3'],
    detailType: ['Object Created'],
    detail: {
      bucket: {
        name: [bucket.bucketName],
      },
    },
  },
  targets: [
    new BatchJob(
      jobQueue.jobQueueArn,
      jobQueue,
      jobDefinition.jobDefinitionArn,
      jobDefinition,
      {
        jobName: `${namePrefix}-s3-put-job`,
        attempts: 5,
        deadLetterQueue: queue,
        maxEventAge: Duration.hours(2),
        event: RuleTargetInput.fromObject({
          Parameters: {
            bucketName: EventField.fromPath('$.detail.bucket.name'),
            objectKey: EventField.fromPath('$.detail.object.key'),
          },
        }),
      },
    ),
  ],
})

以下が出力されたCloudFormationのテンプレートです。

  BatchS3PutEventRule2B69441C:
    Type: AWS::Events::Rule
    Properties:
      EventPattern:
        source:
          - aws.s3
        detail-type:
          - Object Created
        detail:
          bucket:
            name:
              - Ref: S3Bucket3EB0552D
      Name: learn-aws-batch-ec2-dev-s3-put-rule
      State: ENABLED
      Targets:
        - Arn:
            Fn::GetAtt:
              - BatchJobQueueAFED2E49
              - JobQueueArn
          BatchParameters:
            JobDefinition:
              Ref: BatchJobDefinition1ED94D31
            JobName: learn-aws-batch-ec2-dev-s3-put-job
            RetryStrategy:
              Attempts: 5
          DeadLetterConfig:
            Arn:
              Fn::GetAtt:
                - BatchQueue00F466B7
                - Arn
          Id: Target0
          InputTransformer:
            InputPathsMap:
              detail-bucket-name: $.detail.bucket.name
              detail-object-key: $.detail.object.key
            InputTemplate: '{"Parameters":{"bucketName":<detail-bucket-name>,"objectKey":<detail-object-key>}}'
          RetryPolicy:
            MaximumEventAgeInSeconds: 7200
          RoleArn:
            Fn::GetAtt:
              - BatchJobDefinitionEventsRole1D8E579B
              - Arn

上記の出力されたCloudFormationのテンプレートで、InputTransformerという設定があることが確認できました。この状態でデプロイをすると以下の通り入力トランスフォーマーの設定がされていることが確認できます。

この状態で該当のS3バケットにファイルをアップロードすると、AWS Batchのジョブが作成されて、実行されます。

ログを見てみると、無事にバケット名とアップロードしたファイル名が出力されていることが確認できました。

まとめ

今回はEvent Bridgeのルールのターゲットとしては、AWS Batchですが、それ以外でも同じ方法で出来るはずなので、これで入力トランスフォーマーのCDKでの設定で悩むことは無くなりそうです。

この記事が参加している募集

#最近の学び

182,163件

この記事が気に入ったらサポートをしてみませんか?