📌

EC2インスタンスをCLIで素早く起動&停止するには

2021/03/07に公開

AWS CLIでEC2インスタンスを起動するには aws ec2 start-instances --instance-ids i-XXXXX とします。

$ aws ec2 start-instances --instance-ids i-XXXXX
{
    "StartingInstances": [
        {
            "CurrentState": {
                "Code": 16,
                "Name": "pending"
            },
            "InstanceId": "i-XXXXX",
            "PreviousState": {
                "Code": 16,
                "Name": "stopped"
            }
        }
    ]
}

ただ、これだと「起動する命令を送った」だけなので、正しく起動が完了したことや、割り当てられたIPアドレスなどが分かりません。

そこで次のように、起動命令->起動待ち->インスタンス情報を表示。というのを順番に実行します。これで起動したインスタンスのグローバルIPアドレスなどをすぐに確認することができます。

$ aws ec2 start-instances --instance-ids i-XXXXX \
&& aws ec2 wait instance-running --instance-ids i-XXXXX; \
aws ec2 describe-instances --instance-ids i-XXXXX \
| jq '.Reservations[].Instances[] | \
{InstanceId, InstanceState: .State.Name, PublicDnsName, PublicIpAddress}'
{
    "StartingInstances": [
        {
            "CurrentState": {
                "Code": 16,
                "Name": "stopping"
            },
            "InstanceId": "i-XXXXX",
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        }
    ]
}
{
  "InstanceId": "i-XXXXX",
  "InstanceState": "running",
  "PublicDnsName": "ec2-99-99-99-99.ap-northeast-1.compute.amazonaws.com",
  "PublicIpAddress": "99.99.99.99"
}

次に停止です。EC2インスタンスを停止するには aws ec2 stop-instances --instance-ids i-XXXXX とします。

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

これも停止命令を送るだけなので、これだけだと実際に止まったことが確認できません。止めたつもりなのに止まってないと結構辛いので、これも停止待ちを入れてみます。

$ aws ec2 stop-instances --instance-ids i-XXXXX \
&& aws ec2 wait instance-stopped --instance-ids i-XXXXX; \
aws ec2 describe-instances --instance-ids i-XXXXX \
| jq '.Reservations[].Instances[] | {InstanceId, InstanceState: .State.Name}'
{
    "StoppingInstances": [
        {
            "CurrentState": {
                "Code": 64,
                "Name": "stopping"
            },
            "InstanceId": "i-XXXXX",
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        }
    ]
}
{
  "InstanceId": "i-XXXXX",
  "InstanceState": "stopped"
}

これで確実に止まったことが確認できます。

コマンドが長いのでALIASにしておくと便利だと思います。

Discussion