AWS動作検証【4】（サーバ自動停止・自動起動）（2020年4月時点）

前回「[AWS動作検証【3】（AWS BackupによるEC2バックアップ・復元）](https://qiita.com/gomasa/items/0c39da55958d8d6a8a04)」の続きとなります。

#■■　筆者情報　■■
・AWSの資格試験はプロフェッショナルまで取得済。
・AWSの操作経験は初心者並み。
・理論は解っていても操作は解っていない状況。
※資格試験取得に興味のある方は[「AWS認定試験の勉強方法](https://qiita.com/gomasa/items/6ce860a2e11a620c92ae)」を参照ください。

#■■　この記事を読んでほしい対象　■■
・AWSの知識はある程度ついたので、AWS操作を一通り実施したい人。
・AWS公式ドキュメントをベースに手順を確認したい人。
※手順を簡単にまとめてくれているサイトも多々ありますが、可能な限りAWSの公式ドキュメントを読み解きながら確認を実施しています。その為、この記事のリンクの多くは公式ドキュメントに対して貼られており、どうしても公式ドキュメントのみだと解らない場合に、個人のHPを頼っています。

#■■　AWSのEC2サーバ自動化運用　■■
EC2インスタンスに関しては、インスタンス起動中のみ課金される前提となります。そうなると利用しない時間帯はインスタンスを停止しておけば、課金額を抑えることができます。サードベンダーの多機能・高性能なジョブ管理ツールを使用してCLIで指示する形が理想形だと思いますが、まずはAWS単体の機能で実施できることを整理してみました。

・方式【1】「CloudWatch-Event」＋「SystemsManager」パターン
・方式【2】「CloudWatch-Event」＋「Lambda」パターン

パターンとしては概ねこの2パターンになります。これまでのAWSでは方式【2】が主流だったようですが、SystemMangerの機能が追加されてからは方式【1】が主流になっているようです。

その為、今回の検証は、方式【1】を実施します。

#■SystemsManagerの仕様について（検討要）
基本的にEC2インスタンスは利用しない時は手動で停止していました。本日2日ほど起動せずに置いているとSystemsManagerの「マネージドインスタンス一覧」に表示されていなことに気付きました。EC2インスタンスを起動すると、再度表示されるようになりました。
![マネージドインスタンス.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/e9e788d0-7486-f8b1-9242-449b24043155.jpeg)

SystemsManagerの「インベントリ」画面でもインスタンス停止中は何も表示されません。
![インスタンス停止中の画面.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/5184f543-3bd8-6634-363b-528817d7c915.jpeg)
しかし、インスタンスを起動させると表示されます。
![インスタンス起動中の画面.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/f3c9b077-c876-9f0e-b5c7-22e132654481.jpeg)
AWSのHPを調べていると「[Systems Manager コンソールの [マネージドインスタンス] に EC2 インスタンスが表示されないのはなぜですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/systems-manager-ec2-instance-not-appear/)」との投稿がありました。前提条件の「当該インスタンスにおいてSSMエージェントがインストールおよび実行されている」がポイントで、要は「インスタンス停止中＝SSMエージェントが実行されていない=マネージドインスタンスの対象にならない」ということです。

>インスタンスをマネージドインスタンスにするには、次の前提条件を満たす必要があります。

>・AWS Systems Manager エージェント (SSM エージェント) がインストールおよび実行されている。
>・SSM エージェントを使用して Systems Manager エンドポイントに接続されている。
>・適切な AWS Identity and Access Management (IAM) ロールがアタッチされている。
>・インスタンスメタデータサービスに接続されている。

私はSSMエージェントを設定したインスタンス情報はインスタンス状況に関わらず一元管理できると思っていたので、サーバ管理に利用できると思っていました。ただ、この仕様だと例えば利用料の関係で停止している開発用サーバ等はこの一覧には表示されないので、全体のサーバ情報としては確認できないことになります。その為、そういった用途の場合は、別の仕組みを考える必要がありそうです。

#■EC2インスタンスの自動停止・自動起動（SystemsManager)
方式【1】「CloudWatch-Event」＋「SystemsManager」の動作確認を実施しました。

##[IAMロールの作成](https://docs.aws.amazoIAMn.com/ja_jp/systems-manager/latest/userguide/automation-permissions.html#automation-role)（IAM）
Systems Manager Automation に対するサービスロール (引き受けロール) を作成します。 
![ロールの作成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/ceba3080-6c18-ca8d-8f52-81c97c01b417.jpeg)
##[ロールへの信頼関係追加](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-permissions.html#automation-trust2)（IAM）
信頼されたエンティティに対して「events.amazonaws.com」を追加します。
![信頼関係の編集.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/814960d0-a961-2a13-5695-7a160942d09e.jpeg)
信頼されたエンティティに正常に表示されることを確認します。
![信頼されたエンティティ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/2049e437-83e5-b0f3-2d6a-2dfef60869fe.jpeg)

##[イベント追加・動作確認（自動停止）](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/Create-CloudWatch-Events-Scheduled-Rule.html)（CloudWatch-Events）
AWSに日本語版のドキュメントが無く、英語版のドキュメントをGoogle Cromeを使用して解読しました。英語力のある人には必要の無い労力です。Cromeで一度「日本語の翻訳」を選択して翻訳するとリンクページを含めてすべて日本語に翻訳してくれるので大変便利です。

EC2インスタンスの停止設定を実施します。
スケジュールは[Cron式](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html#CronExpressions)での登録になります。UTC時間なので、日本時間マイナス9時間で考える必要があります。例えば日本時間が12時なら、UTC時間は3時なので、3時で登録する必要があります。

|項目 |選択内容|
|:-----------------|:------------------|
|イベントソース |「スケジュール」を選択 |
|スケジュール入力欄 |スケジュールを設定 |
|ターゲット|SSM Automation|
|ドキュメント|AWS-StopEC2Instance|
|オートメーションパラメータの設定|「定数」を選択。|
|instanceID|停止させたいインスタンスのIDを設定|
|インプットトランスフォーマー|「既存のロールを使用」を選択。|
|ロール入力欄|先ほど作成したロールを設定|
|ルールの定義：名前|ルールの定義の名前を設定|
![停止スケジュール.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/8c646e0a-2804-c777-995a-419272b1049b.jpeg)
![停止スケジュール２.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/5d4628f6-22f1-7def-2ead-1d63af0d531f.jpeg)
ルールの定義画面で設定した名前のルールが作成されます。
![停止スケジュール3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/f070f31b-7a2d-e975-57e3-d9d55551e5bf.jpeg)

設定した時間になるとインスタンスが停止しました。実行結果はSystemsManagerの「自動化」画面で確認できます。この後でサーバを起動しなおしてOS画面上でシステムログを確認しましたが、通常のシャットダウンと同じ停止の流れでした。
![SSM実行結果画面.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/cbd0610a-a733-7f52-fd2b-2245fafe21a3.jpeg)

なお、CloudWatchでもルール名称で検索することで、実行結果を確認できます。
![停止スケジュール4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/ad621678-9ae7-8180-fa51-db9c98251020.jpeg)

##[イベント追加・動作確認（自動起動）](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/Create-CloudWatch-Events-Scheduled-Rule.html)（CloudWatch-Events）

EC2インスタンスの起動設定を実施します。
スケジュールは[Cron式](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html#CronExpressions)での登録になります。UTC時間なので、日本時間マイナス9時間で考える必要があります。例えば日本時間が12時なら、UTC時間は3時なので、3時で登録する必要があります

|項目 |選択内容|
|:-----------------|:------------------|
|イベントソース |「スケジュール」を選択 |
|スケジュール入力欄 |スケジュールを設定 |
|ターゲット|SSM Automation|
|ドキュメント|AWS-StaartEC2Instance|
|オートメーションパラメータの設定|「定数」を選択。|
|instanceID|起動させたいインスタンスのIDを設定|
|インプットトランスフォーマー|「既存のロールを使用」を選択。|
|ロール入力欄|先ほど作成したロールを設定|
|ルールの定義：名前|ルールの定義の名前を設定|
![起動スケジュール.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/b5645271-ecd0-3753-22b6-8b4a5d171d2f.jpeg)
![起動スケジュール2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/35828452-a6cd-c2ee-f2a4-9ad7adc41b23.jpeg)
ルールの定義画面で設定した名前のルールが作成されます。
![起動スケジュール3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/1a4c952e-2cc3-4d76-3f39-bd1a0b75ed98.jpeg)

設定した時間になるとインスタンスが起動しました。実行結果はSystemsManagerの「自動化」画面で確認できます。サーバに接続してOS画面上で確認しましたが、問題なく起動されており、エラー等はありませんでした。
![SSM実行結果画面.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/605bdb71-186d-d969-b2b7-e0366d1b88c0.jpeg)


なお、CloudWatchでもルール名称で検索することで、実行結果を確認できます。
![起動スケジュール4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/984d0c16-f94c-7a2f-e0a1-e5f632d3d9df.jpeg)


#■■　まとめ　■■
今回のサーバ自動停止・自動起動はかなり簡単に設定可能でした。また、CloudWatchとSystemsMangerを組み合わせれば他にも色々なことができそうなので、試してみたいと思いました。今回は単体でのサーバ自動停止・自動起動でしたが、業務システムが稼働している場合は、前後にサービス停止処理等を実施する必要が出てきます。そういった処理をAWSの仕組みを使ってうまく実現できるかを、今後検証したいと思います。今回はあくまでGUIでしたが[コマンドライン](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/Stop_Start.html#starting-stopping-instances)を利用した処理を検証していきたいです。

また、SystemsManagerの「当該インスタンスにおいてSSMエージェントがインストールおよび実行されている」というところの仕様把握ができたので、今後は資産管理の観点でどう機能を使い分けるかも検討していきたいと思います。

次回は「[AWS動作検証【5】（AWS CLIによるサーバ停止・スナップショット取得・サーバ起動）](https://qiita.com/gomasa/items/464b5fc13c62208e8eb7)」です。

以　　上