AWS Data Pipeline とは
AWS Data Pipelineで日次バッチ処理取得データをS3にポストする
AWS DataPipeline は DB 接続だったり、S3 上のログを EMR に流しこんだりなど日次バッチを AWS 上で定義、実行ができるというもので、とても便利そうです。
今回は 0:00 に起動している ec2 インスタンスがあったら容赦なく停止するというバッチを AWS DataPipeline の ShellCommandActivity
を使って作ってみます。
なお、VPC ではなく、EC2−Classic で試してみます。
前提条件
- ec2 インスタンスには
dont_stop
というタグが付与されているものとします -
dont_stop
タグの value がFalse
のインスタンスを停止対象とします
はまったこと
- ShellCommandActivity
- ベースは amazon-linux 2013.03
- 今のところ HVM インスタンスは非サポート
- awscli が 0.9 と非常に古い
- --query や --filters が使えないので要 update
- エラー処理をちゃんとしないとキレイに terminate されない
- ベースは amazon-linux 2013.03
ManageMentConsole から pipeline を作る
Create Pipeline
-
Name
とDescription
に必要な情報を入力します -
Building using a template
ではShellCommandActivity
選択します
Parameters
- S3 フォルダの指定は必須です
- 今回は
S3://my-bucket/output
s3://my-bucket/input
のようにします
- 今回は
- Shell command to run にスクリプトを貼り付けます
-
\
を使う場合はエスケープする必要があります
-
スクリプトはこんなのです。
#!/bin/bash
sudo yum update aws-cli -y
AWS="/usr/bin/aws --region ap-northeast-1"
ids=$(${AWS} ec2 describe-instances --filters \\
"Name=tag:dont_stop,Values=False" \\
"Name=instance-state-code,Values=16" \\
--query 'Reservations[].Instances[].InstanceId' \\
--output text)
if [ -z "${ids}" ]; then
echo "nothing running instance."
else
echo "stop instances ids -> ${ids}"
${AWS} ec2 stop-instances --instance-id ${ids} \\
&& echo "complete ec2-auto-stop."
fi
exit 0
Schedule
- 12/9 の 0:00 から日次で動作するように設定します
- Ending を Nerver にして期限は定めません
Pipeline Configuration
- Logging を有効として、ログの格納場所を指定します
- ActivityLog / stdout / stderr が出力されます
Security/Access
- ここでは default とします
Tags
- 必要な情報を入力します
- ここまできたら
Edit in Architect
をクリックします
Architect
Architect と呼ばれる画面に遷移します。要素が色々あります。
Resources
EC2 インスタンスについての情報を記入するところで、あった方がよさそうなオプションを追加してみます。
- Add an Optional field から 2 つ追加してみます
- Action On Resource Failure の時、一回だけ retry します
- Action On Task Failure の時、instance は terminate します
Save pipeline
Pipeline を保存します。すると Activate するか聞かれますが、まだしません。
IAM Role
Pipeline 経由で起動した EC2 インスタンスの IAM Role を調整します。
Architect に遷移した際に IAM Role が自動で作成されています。
この内、DataPipelineDefaultResourceRole
が ec2 インスタンスに割り当てられる IAM Role です。
デフォルトではec2:StopInstances
の権限がないので、追加します。
Activate
Architect画面に戻り、Activate
します。
以下の様に pipeline の進捗が確認できるようになっています。
ec2 インスタンスも起動しています。
(Resources から keypair を指定して ssh してみましたが、ログインできませんでした)
Finished
しばらくすると完了します。
この一連の処理で 12 min かかってるのであまり早くはないです。
画面にある Logs から stdout を見ることができるので、失敗した時はデバッグに使えます。
さいごに
pipeline 定義は json にエクスポートできるのですが、これを使って aws cli からも利用できそうです。
AWS Data Pipelineをスケジューラとして使う
が、それはまた今度・・・