Posted at

AWS DataPipeline の ShellCommandActivity を使って特定のタグを持つインスタンスを日次停止する

More than 3 years have passed since last update.

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 されない




ManageMentConsole から pipeline を作る


Create Pipeline

Screen Shot 2015-12-09 at 18.25.16.png



  • NameDescription に必要な情報を入力します


  • Building using a template では ShellCommandActivity 選択します


Parameters

Screen Shot 2015-12-09 at 18.45.03.png


  • 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

Screen Shot 2015-12-09 at 18.36.32.png


  • 12/9 の 0:00 から日次で動作するように設定します

  • Ending を Nerver にして期限は定めません


Pipeline Configuration

Screen Shot 2015-12-09 at 18.38.49.png


  • Logging を有効として、ログの格納場所を指定します

  • ActivityLog / stdout / stderr が出力されます


Security/Access

Screen Shot 2015-12-09 at 18.38.57.png


  • ここでは default とします


Tags

Screen Shot 2015-12-09 at 18.39.03.png


  • 必要な情報を入力します

  • ここまできたら Edit in Architect をクリックします


Architect

Architect と呼ばれる画面に遷移します。要素が色々あります。

Screen Shot 2015-12-09 at 18.48.08.png


Resources

EC2 インスタンスについての情報を記入するところで、あった方がよさそうなオプションを追加してみます。

Screen Shot 2015-12-09 at 19.09.48.png


  • 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 が自動で作成されています。

Screen Shot 2015-12-09 at 19.27.45.png

この内、DataPipelineDefaultResourceRoleが ec2 インスタンスに割り当てられる IAM Role です。

デフォルトではec2:StopInstancesの権限がないので、追加します。


Activate

Architect画面に戻り、Activate します。

以下の様に pipeline の進捗が確認できるようになっています。

Screen Shot 2015-12-09 at 19.36.07.png

ec2 インスタンスも起動しています。

(Resources から keypair を指定して ssh してみましたが、ログインできませんでした)

Screen Shot 2015-12-09 at 19.39.24.png


Finished

しばらくすると完了します。

Screen Shot 2015-12-09 at 19.47.39.png

この一連の処理で 12 min かかってるのであまり早くはないです。

画面にある Logs から stdout を見ることができるので、失敗した時はデバッグに使えます。


さいごに

pipeline 定義は json にエクスポートできるのですが、これを使って aws cli からも利用できそうです。

AWS Data Pipelineをスケジューラとして使う

が、それはまた今度・・・