DataPipelineには、定義したActivity実行するかどうかを判断する前提条件機能(Precinditons)があるのですが、あまりそこに関するドキュメントが多くない気がしたので、ちょっと書いてみます。
前提条件機能についてはこちら。
今回利用したのが、S3KeyExistsとShellCommandPreconditionの2つになるので、そちらのご紹介です。
S3KeyExists
該当のファイルがs3に存在するかチェックします。
動作としては、指定のs3キーが作成されるまでチェックを行い続け、作成が確認できたらActivityを実行するという挙動になります。
設定の画面はこんな感じです。
S3KeyにチェックしたいS3のキー名を記述します。
毎日実行したいバッチだったりすると、S3のファイル名にも日時が入ってきそうです。
例えば、前日の日付がついたファイルの存在確認は下記のように記述します。
s3://bucket-name/dir-name/file_#{format(yesterday(inTimeZone(@scheduledStartTime,'Asia/Tokyo')),'YYYYMMdd')}.txt
他に指定しているRetry Delayは再実行の間隔、Maximum Retriesは再実行回数ということですが、正直Retry Delayの動作はよくわからんです。この値の間隔でチェックしてるというわけでもなさそう。
ShellCommandPrecondition
指定のシェルスクリプトを実行し、そのスクリプトの終了コードによって、前提条件を満たしたかどうかを判定します。
S3KeyExistsと違い、前提条件を実行する段階でResource(EC2)が作成されるので、その点はご注意ください。
設定の画面は下記。
Commandに実行したいスクリプトを記載します。
StdoutやStderrには、ログファイルの指定を行います。下記のように書くと、/パイプラインID/前提条件ID/ という形でディレクトリ切ってくれるのでいいと思います。
s3://bucket-name/#{@pipelineId}/#{@id}/stdout.log
ShellCommandPreconditionの注意点としては、Resourceに指定しているEC2の終了時間設定(Terminate After)の時間を、前提条件判定で待機してる間に過ぎてしまうと、EC2が落ちて処理が失敗してしまうので、Terminate Afterの時間は長めにしておいた方がよいです。