【EC2】停止保護を使ってみた

2022年5月末のアップデートで、ついにEC2に停止保護と呼ばれる機能が追加されました。
名前の通り、コンソール上からの「インスタンスの停止」ができなくなる機能です。

先んじて、クラメソ様から記事が出てますので、そちらもご参照ください。
https://dev.classmethod.jp/articles/ec2-stop-protection/

いざ実験!① シンプルに停止してみる

停止保護を有効にするには、EC2コンソールから、対象のインスタンスを選択して、
「停止保護を変更」からチェックボックスを入れるだけです。カンタン。

停止保護が有効になりました。
この状態で、コンソールからインスタンスを停止してみます。

停止できません(#^ω^)と無事に怒られました。

いざ実験!② Lambdaから停止してみる

では、Lambdaから停止する場合はどうなるのでしょうか。

import boto3

def lambda_handler(event, context):
    region = 'ap-northeast-1'
    instances = ['<i-から始まるインスタンスID>']
    ec2 = boto3.client('ec2', region_name=region)
    ec2.stop_instances(InstanceIds=instances)
    print('stopped instances: ' + str(instances))

上記のコードを用いて、停止保護が有効のインスタンスを落としてみます。

エイヤッ

おおお! ちょっと字が細かいのでアレですが、しっかりと怒られました。
エラーメッセージとしては、実験①と同じメッセージが返ってきています。

いざ実験!③ Systems Manager Session Managerから停止してみる

SSMからの停止を試みてみます。
ちなみにクラメソ様の記事にあるように、ゲストOSからのシャットダウンは受け付ける仕様なので、これは通る想定です。

とりあえず"sudo shutdown"を打ってみます。

何も引き止めを食らうことはなく、シャットダウン信号が送られました。

ちなみに、インスタンスが停止していても、停止保護は有効のままでした。
再度起動してもここは維持されます。便利ですね!

終わりに

EC2型のECSなど、AutoScaling Groupに関連して起動している場合は、インスタンスが落とせなくなりますのでご注意。(APIでの停止操作が不可になります)