LoginSignup
1
1

More than 5 years have passed since last update.

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

Posted at

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

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1