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での停止操作が不可になります)
コメントを残す