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

  • 1
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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をスケジューラとして使う

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