AWS初心者「いんすたんすを止めるのは緊張する」

# はじめに
この記事は以下の記事を見て、
「そういえば、最近AWSで緊張するボタン触ったな..」と思ったので、オマージュして書いてみました。

https://qiita.com/nakampany/items/2aefb5612a21bc4d09fb

本記事は最近調べたり、聞いたりして知った知識を勢いで書いているので、もし間違いやほかの方法などがあればコメントで教えていただけると嬉しいです！

# 対象読者
- AWS初心者
- 手動でEC2の「インスタンスの停止をする」運用をしていて、操作に緊張する人

# EC2インスタンスのアクションコワイ
皆さんAWSのEC2のアクション「**触るの怖く**」ないですか?
何が怖いかというと、「**インスタンスの終了**」です。  

AWSのEC2を止める系アクションでよく見るのが、
「**インスタンスの停止**」と「**インスタンスの終了**」がありますよね。   
(「インスタンスの休止」は使ったことがないのでここでは割愛) 

もし「EC2インスタンス止めといて」と言われた日にはAWS初心者の皆さん、何を実行しますか？

「**インスタンスの終了**」を選んだあなた... おめでとうございます。  
あなたが選んだEC2は無事終了しました。

**永遠に...**(1敗)
※インスタンスを終了したAWS使用環境で何も対策されていない場合

こういったことは、初心者にありがちではあると思うのですが、
ボタンでアクションを行う場合、いくらわかっていたとしても、ヒューマンエラーが起きてしまうこともあると思います。

# インスタンスの停止、終了
そもそもインスタンスの停止、終了は何か簡単に説明すると、
以下の記事のように

[AWS EC2 インスタンスの起動、開始、停止、休止、終了の違い #AWS - Qiita](https://qiita.com/bezeklik/items/7174992ec267e2c7d10f#%E5%81%9C%E6%AD%A2%E3%81%A8%E4%BC%91%E6%AD%A2%E3%81%A8%E7%B5%82%E4%BA%86)

https://qiita.com/bezeklik/items/7174992ec267e2c7d10f#%E5%81%9C%E6%AD%A2%E3%81%A8%E4%BC%91%E6%AD%A2%E3%81%A8%E7%B5%82%E4%BA%86


インスタンスの停止は
> インスタンスのシャットダウン。

でEC2の動きを**停止**しているのに対して

インスタンスの終了は
> インスタンスの削除。起動や接続は不可能。

となり、AWSのドキュメントでもあるように、EC2の存在自体を **終了(削除)** してしまいます。

[インスタンスの終了 - Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/terminating-instances.html)

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/terminating-instances.html

そういったことから本記事では、
私自身、最近AWSを触る機会が増えた初心者ではありますが、 業務での運用上、
**どうしても終了してはならない、いったん失うと環境構築に数日かかる**ような、
秘伝のEC2インスタンスを触る機会があったので、  
永遠に大事な大事なEC2インスタンスを失わないために、
実際に行った対策や考えてみたできそうな対策を挙げてみます。

# 対策方法
EC2の意図しない「インスタンス終了」へ対策方法としていくつかまとめました。

なお、各方法の詳細手順は他の良記事やドキュメントがたくさん存在するため、
本記事で改めて詳細手順の説明は行っていませんことをご了承ください。
### 1.ECを復旧できる用意をする
もし、誤って終了してEC2が消えたとしても、バックアップデータがあって、そこから復旧出来たら安心ですよね！
そういった、用途に使用できるのがAMI(Amazon Machine Image)です。

これは、EC2の状態をそのまんま、イメージとして残すことができるもので、作成後はAMIの画面アクションから、AMIを起動することで、保存時のインスタンスを再利用できるようになります。

手順については公式ドキュメントや他記事で分かりやすく説明されているのでそちらをご覧ください。

[Amazon EC2 インスタンスからの AMI の作成 - AWS Toolkit for Visual Studio](https://docs.aws.amazon.com/ja_jp/toolkit-for-visual-studio/latest/user-guide/tkv-create-ami-from-instance.html)

https://docs.aws.amazon.com/ja_jp/toolkit-for-visual-studio/latest/user-guide/tkv-create-ami-from-instance.html

[AWS AMI とは #AWS - Qiita](https://qiita.com/miyuki_samitani/items/fa3a846407a4f8a36efe)


https://qiita.com/miyuki_samitani/items/fa3a846407a4f8a36efe

また、AWSドキュメントではEC2のバックアップについてガイダンスがあるので、そちらを読んでみるのもいいかもしれません。

[スナップショットと AMI による Amazon EC2 バックアップとリカバリ - AWS の規範的ガイダンス](https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/backup-recovery/ec2-backup.html)

https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/backup-recovery/ec2-backup.html

### 2. EC2の構成や環境構築を自動化しておく
運用方法やインスタンス内の環境構築方法には寄りますが、
最悪インスタンスを壊したとしても、同じ環境がすぐ作れれば問題はないですよね!

TerraformやAnsibleなどのIaCを使えばAWSのEC2の環境作成を自動化できます！
私自身、触ったことがないので詳細は記載できないのですが、
気になった方は以下のような記事を、見てみると概要がつかめると思います。

[10分で理解するTerraform #AWS - Qiita](https://qiita.com/Chanmoro/items/55bf0da3aaf37dc26f73)

https://qiita.com/Chanmoro/items/55bf0da3aaf37dc26f73

[Ansibleとは何か　構成管理ツールの目的〜Ansible導入まで最速で理解する #Python - Qiita](https://qiita.com/Brutus/items/1894629105d61f4854bc)

https://qiita.com/Brutus/items/1894629105d61f4854bc

なお、Terraformはインスタンスを構成するのは得意ですが、
その後のサーバの構築などはAnsibleを使うといった方法が良さそうなので、
そちらも検討するとより一層インスタンス構築とそのインスタンス内の環境構築が自動化できそうです。

[Ansible と Terraform の違い #Ansible - Qiita](https://qiita.com/yusukaaay/items/cd3bc067d2ad5d449bd1)

https://qiita.com/yusukaaay/items/cd3bc067d2ad5d449bd1


### 3.停止を手動でやらない
そもそも、アクションボタンを触らずに自動化したら、ヒューマンエラーも減りますよね！

一例として自動起動/停止を考えてみると、
先ほど挙げたTerraformやAWSのLambdaを使うことで実現が可能です。

[Terraformを使ってEC2インスタンスの自動起動／自動停止環境を構築する #AWS - Qiita](https://qiita.com/shin7446/items/5a1185a33365a09058eb)

https://qiita.com/shin7446/items/5a1185a33365a09058eb

ただ、上記のようなTerraformの自動起動や停止に関しては、Lambdaでの自動化するほうがスマートそうですね。
[Lambda 関数を使用して EC2 インスタンスを定期的に停止および起動する | AWS re:Post](https://repost.aws/ja/knowledge-center/start-stop-lambda-eventbridge)

https://repost.aws/ja/knowledge-center/start-stop-lambda-eventbridge

なお、EventBridgeを使えばlamdaなど経由せずに直接EC2へ自動起動/停止のスケジュールが設定できるので、そちらでもいいかもですね。
[EventBridge を使用して Amazon EC2 を自動化する - Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/automating_with_eventbridge.html)

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/automating_with_eventbridge.html

### 4.削除保護をする
3のように自動化しても、自動化を組んでるときに誤って終了の処理を書いてしまうことがあるかもしれません。
そんな時は、AWSの設定で削除保護をつけましょう。
手順はドキュメント通りにやればできると思います！

[インスタンスの終了/削除保護の有効化 - Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/terminating-instances.html#Using_ChangingDisableAPITermination)

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/terminating-instances.html#Using_ChangingDisableAPITermination

https://qiita.com/nasuB7373/items/b34af13813816683956a 

また、自動化するときにはIAMのロールを使うことがあると思いますが、
ポリシーをいじれる場合は起動や停止のみのポリシーを作成し付けるといったことも有効そうですね。

[AWS EC2の起動と停止のみが可能なIAMポリシーを作成してIAMポリシーの設定方法を理解する | Tech Note Meeting](https://tech-note-meeting.com/2021/06/05/post-984/)

https://tech-note-meeting.com/2021/06/05/post-984/

# 終わりに
ここであげた、手順を知っていればもう誤って「終了」しても安心ですね！
私自身ここには上げたものの、実際に設定できていなかったり試せていないものも多いので、
今後手を動かして、身につけていければなと思います!

ここまでありがとうございました。!