[AWS Data Pipeline]Pipeline内でShellCommandActivityを逐次実行する
はじめに
バッチ処理の開発をしていると、特定の時間のみシェルコマンドの実行を行いたいケースというの多々あるかと思います。Data Pipelineには「ShellCommandActivity」というシェルを実行するためのActivityが存在します。今回はこれを使用し、あるシェルコマンドの実行後に次のコマンドを実行するといった逐次実行を行ってみました。
具体的におこなったこと
以下の処理を逐次実行してみました。
- 任意のEC2を起動
- EC2起動時にインストール済みのプログラムを実行する
- 一定時間、待機
- 起動したEC2をシャットダウンする
上記の2についてはEC2のcronの設定で起動時にプログラムを実行するようにしました。2以外についてはShellCommandActivityにて設定しました。
Data Pipelineの設定
Data Pipelineの設定は、一つのPipelineに3つのActivityが並ぶようになります。マネージメントコンソール上で見ると、以下のようになります。
左から順に
- 任意のEC2を起動
- 一定時間待機
- 起動したEC2をシャットダウンする
ShellCommandActivityとなります。各Activityが実行順に矢印で繋がっています。以下、各Activityについて見ていきたいと思います。
1.EC2を起動
一番左の「CliActivity」で、これはPipelineの作成時に設定した値が反映されています。Pipeline作成時に設定した項目は以下の通りです。
- 「Source」欄では「Build using a template」を選択。テンプレートしては「Run AWS CLI command」を選択。
- 「AWS CLI command」にて、次のEC2を起動するAWS CLIのコマンドを入力する。「aws ec2 start-instances --instance-ids インスタンスID --region ap-northeast-1」
- 「Security/Access」ではIAM Roleに「Custom」を選択。Pipeline Roleは「DataPipelineDefaultRole」を、EC2 Instance Roleは「DataPipelineDefaultResourceRole」を選択。
尚、このPipelineの作成前には使用するロールにEC2の起動・シャットダウンの権限を付与しておく必要があります。以下のサイトを参考にしてください。
How do I stop and start Amazon EC2 Instances at scheduled intervals with AWS Data Pipeline?
2.一定時間待機
真ん中の「SleepActivity」に当たります。このActivityはPipelineの編集画面上部の「Add Activity」を押下して追加したものです。設定は以下のようになります。
ポイントは以下となります。
- 「Depends On」で先行するActivity(今回はCliActivity)を指定している
- DataPipelineを実行するためのEC2上(CliActivityで起動した任意のEC2とは異なる)でシェルを実行するため、「Runs On」で「Ec2Instance」を指定する
- 「Command」欄に実行するシェルを記述する(今回はsleep)
3.EC2をシャットダウン
最後にEC2のシャットダウンを行うActivityです。「StopActivity」に当たります。設定は以下のようになります。
ポイントは以下となります。
- AWS CLI専用のActivityを選択できなかったため(?)、ShellCommandActivityとしたこと
- 「Depends On」で先行するActivity(今回はSleepActivity)を指定している
- DataPipelineを実行するためのEC2上(CliActivityで起動した任意のEC2とは異なる)でシェルを実行するため、「Runs On」で「Ec2Instance」を指定する
- 「Command」欄に実行するシェルを記述する(今回は「aws ec2 stop-instances --instance-ids インスタンスID --region ap-northeast-1」)
(おまけ)EC2の起動時にプログラムを起動する
Data PipelineにてEC2の起動時、cronからローカルのプログラムを起動するようEC2に設定を行いました。以下、そのcronの設定となります(起動するプログラムはRubyのスクリプトとなります)。
@reboot /bin/bash -l -c 'cd /home/ec2-user/s3_file_write; bundle exec ruby s3_file_write.rb' >>/home/ec2-user/s3_file_write/cron.log 2>>/home/ec2-user/s3_file_write/cron.log
まとめ
ここで紹介した設定を使用すれば、バッチ処理にて特定の時間のみEC2を起動し、プログラムを実行後にシャットダウンを行うといった運用が可能になるかと思います。次回以降、Data Pipelineを使用した実践的な例を書ければと思います。