【Tips】AWS CLIを使ってAmazon EC2を起動・停止するワンライナーまとめ

AWS CLI

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、城内です。
スマホゲームが大好きなのですが、最近はめっきりファンキル *1にハマっています。Fate *2コラボに惹かれて参戦したのですが、直近では結構インパクトのあるCMを打っていたり、過去のコラボもあの花 *3とかまどマギ *4とか、自分的にはかなりのツボですね!

さて、個人的な趣味の話と無駄な脚注は置いておいて、今回もちょいネタです。
EC2を起動したり停止したりする、AWS CLIを使ったワンライナーをいろいろ紹介したいと思います。

目次

ワンライナーまとめ

では、さっそくつらつらとまとめを書きます。
ちなみに、私はAWS CLIやjqのマスターではありませんので、「それ最適じゃないよ」的な部分が随所にあるかもしれませんが、その点はご容赦ください。
(コメントでツッコんでもらえると助かります!)

最初に起動からです。

まずは、普通に起動パターンですね。

$ aws ec2 start-instances --instance-ids <instance_id>
{
    "StartingInstances": [
        {
            "InstanceId": "i-xxxxxxxx",
            "CurrentState": {
                "Code": 0,
                "Name": "pending"
            },
            "PreviousState": {
                "Code": 80,
                "Name": "stopped"
            }
        }
    ]
}

で、その後に起動確認しますよね。
describe系のコマンドでパッと表示させて、その中から必要な情報を確認するのでもいいですが、せっかくなのでjqを使って情報を絞ります。

$ aws ec2 describe-instance-status --instance-ids <instance_id> | jq '.InstanceStatuses[] | {InstanceId, InstanceState: .InstanceState.Name, SystemStatus: .SystemStatus.Status, InstanceStatus: .InstanceStatus.Status}'
{
  "InstanceId": "i-xxxxxxxx",
  "InstanceState": "running",
  "SystemStatus": "ok",
  "InstanceStatus": "ok"
}

必要な情報は、要件に合わせて調整してくださいね。

で、ついでですが、-cオプションを使えば、表示を一行にできます。jqのオプションは、-rとかも結構役に立つので、ぜひ活用してみてください。

$ aws ec2 describe-instance-status --instance-ids <instance_id> | jq -c '.InstanceStatuses[] | {InstanceId, InstanceState: .InstanceState.Name, SystemStatus: .SystemStatus.Status, InstanceStatus: .InstanceStatus.Status}'
{"InstanceId":"i-xxxxxxxx","InstanceState":"running","SystemStatus":"ok","InstanceStatus":"ok"}

あとは、waitコマンドを使って、起動するのを待ってみたりしましょう。

$ aws ec2 start-instances --instance-ids <instance_id> && aws ec2 wait instance-running --instance-ids <instance_id>
{
    "StartingInstances": [
        {
            "InstanceId": "i-xxxxxxxx",
            "CurrentState": {
                "Code": 0,
                "Name": "pending"
            },
            "PreviousState": {
                "Code": 80,
                "Name": "stopped"
            }
        }
    ]
}
$

上記の場合は、インスタンスの状態が「running」になるのを待つだけなので、プロンプトが返ってきた直後では、まだシステムチェックやインスタンスチェックのステータスは「initializing」です。
その辺りは、system-status-okinstance-status-okのコマンドもありますので、適宜要件に合うように調整してみてください。

あとは、完全におまけですが、一行へのこだわりを見せて、こんなのもどうでしょうかw
(待ち時間が長くなるのでご注意を!)

$ aws ec2 start-instances --instance-ids <instance_id> && echo "-- Please wait until instance started..." && aws ec2 wait instance-running --instance-ids <instance_id> && aws ec2 describe-instance-status --instance-ids <instance_id> | jq '.InstanceStatuses[] | {InstanceId, InstanceState: .InstanceState.Name, SystemStatus: .SystemStatus.Status, InstanceStatus: .InstanceStatus.Status}'
{
    "StartingInstances": [
        {
            "InstanceId": "i-xxxxxxxx",
            "CurrentState": {
                "Code": 0,
                "Name": "pending"
            },
            "PreviousState": {
                "Code": 80,
                "Name": "stopped"
            }
        }
    ]
}
-- Please wait until the start of the instance is completed...
{
  "InstanceId": "i-xxxxxxxx",
  "InstanceState": "running",
  "SystemStatus": "ok",
  "InstanceStatus": "ok"
}

最後に、停止している全インスタンスを起動します。

$ aws ec2 start-instances --instance-ids $(aws ec2 describe-instances | jq -r '[.Reservations[].Instances[] | select(.State.Name == "stopped") | .InstanceId] | join(" ")')
{
    "StartingInstances": [
        {
            "InstanceId": "i-xxxxxxxx",
            "CurrentState": {
                "Code": 0,
                "Name": "pending"
            },
            "PreviousState": {
                "Code": 80,
                "Name": "stopped"
            }
        },
        {
            "InstanceId": "i-yyyyyyyy",
            "CurrentState": {
                "Code": 0,
                "Name": "pending"
            },
            "PreviousState": {
                "Code": 80,
                "Name": "stopped"
            }
        },
        ...
    ]
}

次に停止です。

こちらも、まずは普通に停止のパターンからです。

$ aws ec2 stop-instances --instance-ids <instance_id>
{
    "StoppingInstances": [
        {
            "InstanceId": "i-xxxxxxxx",
            "CurrentState": {
                "Code": 64,
                "Name": "stopping"
            },
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        }
    ]
}

停止確認は、describe-instance-statusコマンドでは情報が取れないため、describe-instancesコマンドを使用します。

$ aws ec2 describe-instances --instance-ids <instance_id> | jq '.Reservations[].Instances[] | {InstanceId, InstanceState: .State.Name}'
{
  "InstanceId": "i-xxxxxxxx",
  "InstanceState": "stopped"
}

ちなみに、一覧表示は以下の感じでできます。

$ aws ec2 describe-instances | jq -c '.Reservations[].Instances[] | {InstanceName: .Tags[] | select(.Key == "Name").Value, InstanceId, InstanceState: .State.Name}'
{"InstanceName":"XX Server","InstanceId":"i-xxxxxxxx","InstanceState":"stopped"}
{"InstanceName":"YY Server","InstanceId":"i-yyyyyyyy","InstanceState":"stopped"}
...

停止待ちも、起動待ちと同様にwaitコマンドを使用します。

$ aws ec2 stop-instances --instance-ids <instance_id> && aws ec2 wait instance-stopped --instance-ids <instance_id>
{
    "StoppingInstances": [
        {
            "InstanceId": "i-xxxxxxxx",
            "CurrentState": {
                "Code": 64,
                "Name": "stopping"
            },
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        }
    ]
}
$

起動している全インスタンスを停止するには、以下のコマンドです。

$ aws ec2 stop-instances --instance-ids $(aws ec2 describe-instances | jq -r '[.Reservations[].Instances[] | select(.State.Name == "running") | .InstanceId] | join(" ")')

が・・・。

上記をEC2上で実行すると、自分自身も停止してしまいますね。
当然と言えば当然ですが、急にターミナルが落ちるので少しビックリします。

そのため、ビックリしたくない人は、自分自身を除いた起動中の全インスタンスを停止するようにしましょう。

$ aws ec2 stop-instances --instance-ids $(aws ec2 describe-instances | jq -r --arg myid $(curl http://169.254.169.254/latest/meta-data/instance-id 2> /dev/null) '[.Reservations[].Instances[] | select(.InstanceId != $myid) | select(.State.Name == "running") | .InstanceId] | join(" ")')
{
    "StoppingInstances": [
        {
            "InstanceId": "i-xxxxxxxx",
            "CurrentState": {
                "Code": 64,
                "Name": "stopping"
            },
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        },
        {
            "InstanceId": "i-yyyyyyyy",
            "CurrentState": {
                "Code": 64,
                "Name": "stopping"
            },
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        },
        ...
    ]
}

さいごに

EC2の起動と停止だけでも、いろいろとコマンドの実行パターンがありますね。
ぜひ参考にしてみてください!

参考情報

脚注