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

[AWS Data Pipeline とは](https://docs.aws.amazon.com/ja_jp/datapipeline/latest/DeveloperGuide/what-is-datapipeline.html)
[AWS Data Pipelineで日次バッチ処理取得データをS3にポストする](http://sil.hatenablog.com/entry/aws-datapipeline-job-scheduling-to-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](https://qiita-image-store.s3.amazonaws.com/0/11541/8b63a865-d7dd-e26b-bf0d-c55004e3134c.png "Screen Shot 2015-12-09 at 18.25.16.png")

* `Name` と `Description` に必要な情報を入力します
* `Building using a template` では `ShellCommandActivity` 選択します

### Parameters

![Screen Shot 2015-12-09 at 18.45.03.png](https://qiita-image-store.s3.amazonaws.com/0/11541/c31f581e-526d-38df-568a-b10a6385f7c8.png "Screen Shot 2015-12-09 at 18.45.03.png")

* S3 フォルダの指定は必須です
    * 今回は `S3://my-bucket/output` `s3://my-bucket/input` のようにします
* Shell command to run にスクリプトを貼り付けます
    * `\` を使う場合はエスケープする必要があります

スクリプトはこんなのです。

``` bash
#!/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](https://qiita-image-store.s3.amazonaws.com/0/11541/3bc7e5ba-7fd1-e024-129e-22ea609ec2d4.png "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](https://qiita-image-store.s3.amazonaws.com/0/11541/e9f6befc-ae7c-076a-c1b6-2698d84136d7.png "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](https://qiita-image-store.s3.amazonaws.com/0/11541/3c84ea67-1df6-e71d-2f46-85d36ddae734.png "Screen Shot 2015-12-09 at 18.38.57.png")

* ここでは default とします

### Tags

![Screen Shot 2015-12-09 at 18.39.03.png](https://qiita-image-store.s3.amazonaws.com/0/11541/e2622e9b-cbaf-3680-f165-cb5735833c63.png "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](https://qiita-image-store.s3.amazonaws.com/0/11541/963d9780-abfa-6757-9c9c-c29e51ad8efe.png "Screen Shot 2015-12-09 at 18.48.08.png")

### Resources

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

![Screen Shot 2015-12-09 at 19.09.48.png](https://qiita-image-store.s3.amazonaws.com/0/11541/438f5c44-888e-996b-126f-8522839d40c2.png "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](https://qiita-image-store.s3.amazonaws.com/0/11541/3574b407-bb58-a4dd-718e-181138d9a05f.png "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](https://qiita-image-store.s3.amazonaws.com/0/11541/c29beba0-dfa2-e9c1-a817-2855a6989cfb.png "Screen Shot 2015-12-09 at 19.36.07.png")

ec2 インスタンスも起動しています。
(Resources から keypair を指定して ssh してみましたが、ログインできませんでした)

![Screen Shot 2015-12-09 at 19.39.24.png](https://qiita-image-store.s3.amazonaws.com/0/11541/c43129d7-836a-115d-1483-05476dfa6840.png "Screen Shot 2015-12-09 at 19.39.24.png")

### Finished

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

![Screen Shot 2015-12-09 at 19.47.39.png](https://qiita-image-store.s3.amazonaws.com/0/11541/0799bee7-5863-4775-432a-2d2e5fa44e60.png "Screen Shot 2015-12-09 at 19.47.39.png")

この一連の処理で 12 min かかってるのであまり早くはないです。
画面にある Logs から stdout を見ることができるので、失敗した時はデバッグに使えます。

### さいごに

pipeline 定義は json にエクスポートできるのですが、これを使って aws cli からも利用できそうです。
[AWS Data Pipelineをスケジューラとして使う](http://qiita.com/imaifactory/items/6dc16820c4bec67a7d05)

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