
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での設定で悩むことは無くなりそうです。