ec2 インスタンスをまとめてaws cli から停止する

忘れやすいのでメモメモ


# 1. まず確認
指定の名前タグが入っているインスタンスIDと名を取り出す。
タグに入れてあるそれらしい文字列XXXXXXを指定する。

```lang:bash
$ aws ec2 describe-instances | jq '.Reservations[].Instances[]
  | select(.Tags[].Key == "Name" and (.Tags[].Value | test("XXXXXX")))
  |  {"InstanceName":(.Tags[] | select(.Key=="Name").Value) ,"instance-id": .InstanceId}'

{
  "InstanceName": "XXXXXX-28",
  "instance-id": "i-0791d3f5e36351883"
}
{
  "InstanceName": "XXXXXX-22",
  "instance-id": "i-03c6f00bd51f7dbcd"
}
{
  "InstanceName": "XXXXXX-23",
  "instance-id": "i-0c5cf083435cb6070"
}
{
  "InstanceName": "XXXXXX-30",
  "instance-id": "i-0151fcf7f29fb0876"
}
{
  "InstanceName": "XXXXXX-25",
  "instance-id": "i-0d0360a9c2b6c8bae"
}
```
違うインスタンスは含まれていないようです。

# 2. 停止 インスタンスIDリスト作成
```
--cli-input-json
```
を使っても良いのですが、 JSONファイルを作らないと行けないので、 今回は、 ` --instance-ids ` で気楽に指定します。なので、1を修正して、
"instance-id1" "instance-id2"
の1行に変換します。

まず、インスタンスIDのみ取り出してみます。

```lang:bash
$ aws ec2 describe-instances | jq '.Reservations[].Instances[]
  | select(.Tags[].Key == "Name" and (.Tags[].Value | test("XXXXXX")))
  |  {"InstanceName":(.Tags[] | select(.Key=="Name").Value) ,"instance-id": .InstanceId}'

{
  "instance-id": "i-0791d3f5e36351883"
}
{
  "instance-id": "i-03c6f00bd51f7dbcd"
}
{
  "instance-id": "i-0c5cf083435cb6070"
}
{
  "instance-id": "i-0151fcf7f29fb0876"
}
{
  "instance-id": "i-0d0360a9c2b6c8bae"
```
悪くないですね。
これを、sed で IDのみ抽出します。

```lang:bash
$ aws ec2 describe-instances | jq '.Reservations[].Instances[]
  | select(.Tags[].Key == "Name" and (.Tags[].Value | test("XXXXXX")))
  |  {"instance-id": .InstanceId}' | sed -n -e 's/.*"instance-id": "\(.*\)"/\1/p'

i-0791d3f5e36351883
i-03c6f00bd51f7dbcd
i-0c5cf083435cb6070
i-0151fcf7f29fb0876
i-0d0360a9c2b6c8bae
```
改行が入っているので削除してスペースに変換します。

```lang:bash
$ aws ec2 describe-instances | jq '.Reservations[].Instances[]
  | select(.Tags[].Key == "Name" and (.Tags[].Value | test("XXXXXX")))
  |  {"instance-id": .InstanceId}' | sed -n -e 's/.*"instance-id": "\(.*\)"/\1/p' | tr '\n' ' '
i-0791d3f5e36351883 i-03c6f00bd51f7dbcd i-0c5cf083435cb6070 i-0151fcf7f29fb0876 i-0d0360a9c2b6c8bae
```

"instance-id1" "instance-id2" の形式になりました。

# 3. 停止コマンド発行
では、` $ aws ec2 stop-instances ` を使いましょう。
最初は、Dry-runとか付けておくと良いでしょう。

```
$ aws ec2 stop-instances --dry-run --instance-ids $(2のコマンドを入れる)
```
次のようになります。

```lang:bash
aws ec2 stop-instances --dry-run --instance-ids $(
aws ec2 describe-instances | jq '.Reservations[].Instances[]
  | select(.Tags[].Key == "Name" and (.Tags[].Value | test("XXXXXX")))
  |  {"instance-id": .InstanceId}' | sed -n -e 's/.*"instance-id": "\(.*\)"/\1/p' | tr '\n' ' ')
```
こんな感じです。 2の部分を ` --instance-ids ` の後ろに \$() でBashの展開を利用して指定しています。
上記のコマンドでは、 $() の部分が実行されて実際は2のインスタンスIDのリストになっています。
では、--dry-runを外します。

```lang:bash
aws ec2 stop-instances --instance-ids $(aws ec2 describe-instances | jq '.Reservations[].Instances[]
  | select(.Tags[].Key == "Name" and (.Tags[].Value | test("XXXXXX")))
  |  {"instance-id": .InstanceId}' | sed -n -e 's/.*"instance-id": "\(.*\)"/\1/p' | tr '\n' ' ')

{
    "StoppingInstances": [
        {
            "InstanceId": "i-0a011f82414e366bd",
            "CurrentState": {
                "Code": 64,
                "Name": "stopping"
            },
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        },
        {
            "InstanceId": "i-0528abc7952480f4c",
            "CurrentState": {
                "Code": 64,
                "Name": "stopping"
            },
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        },
        {
            "InstanceId": "i-0f049840b8939d681",
            "CurrentState": {
                "Code": 64,
                "Name": "stopping"
            },
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        },
    ＜＜＜＜＜中略＞＞＞＞＞
    ]
}
```

良いようですね。コンソールでも確認します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/33ff35c2-84d4-f472-81e0-57a5516736f3.png)

OKでした。