AWS動作検証【5】（AWS CLIによるサーバ停止・スナップショット取得・サーバ起動）（2020年4月時点）

前回「[AWS動作検証【4】（サーバ自動停止・自動起動）](https://qiita.com/gomasa/items/3dd7aab68aaf32f52a84)」の続きとなります。

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

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

#■■　実施したいジョブ運用のイメージ　■■
前回「[AWS動作検証【4】（サーバ自動停止・自動起動）](https://qiita.com/gomasa/items/3dd7aab68aaf32f52a84)」においてAWSコンソール上でスケジューリングした処理を実行できることを確認しました。しかし、実際に業務で利用する場合は、業務システムのサービス起動・停止等の処理を組み合わせる必要があります。イメージ的には以下の通りです。前処理の終了を受けて後続処理が動作するようにジョブフローを作成する必要があります。
※夜間にインスタンスを停止することは利用料の観点からも非常に重要。

|項|実施時間帯(想定)|処理内容|インスタンスの状態|
|:-----------------|:-----------------|:-----------------|:-----------------|
|1|当日　18:00～18:30|業務システム＿業務終了処理|起動中(利用料発生）|
|2|当日　18:30～20:30|業務システム＿夜間処理|起動中(利用料発生）|
|3|当日　20:30～21:00|業務システム＿サービス停止|起動中(利用料発生）|
|4|当日　21:00～21:10|<font color="red">EC2インスタンス停止</font>|起動中(利用料発生）|
|5|当日　21:10～21:30|<font color="red">EBSスナップショット取得</font>|<font color="red">停止中(課金されない）</font>|
|6|当日　21:10～07:30|処理なし|<font color="red">停止中(課金されない）</font>|
|7|翌日　07:30～07:40|<font color="red">EC2インスタンス起動</font>|起動中(利用料発生）|
|8|翌日　07:40～08:10|業務システム＿サービス起動|起動中(利用料発生）|
|9|翌日　08:10～08:40|業務システム＿業務開始処理|起動中(利用料発生）|
|10|翌日　08:40～18:00|業務時間|起動中(利用料発生）|

AWSのジョブ管理機能では細かいジョブ運用の制御までは難しいと認識しており、ジョブ管理にはサードパーティ製のジョブ管理ツールを利用することを想定しています。サードパーティ製のジョブ管理ツールは、例えば以下のようなソフトを想定しています。

　・[JP1/Automatic Job Management System 3](https://www.hitachi.co.jp/Prod/comp/soft1/jp1/product/jp1/list/ajs/index.html)
　・[FUJITSU Software Systemwalker Operation Manager](https://www.fujitsu.com/jp/products/software/middleware/business-middleware/systemwalker/products/operationmgr/function/?omgr=top-fun01#fun01
)

ただ、その場合、一覧表の項４、５、７を実施させるために[CLI](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-welcome.html)での処理をバッチ化する必要があります。

#[■■　AWS CLIの利用について　■■]()
>AWS Command Line Interface (AWS CLI) は、コマンドラインシェルでコマンドを使用して AWS サービスとやり取りするためのオープンソースツールです。

>最小限の設定で、任意のターミナルプログラムのコマンドプロンプトから、ブラウザベースの AWS マネジメントコンソール で提供される機能と同等の機能を実装するコマンドの実行を開始できます。

>AWS マネジメントコンソール で使用できる AWS IaaS (infrastructure as a Service) の管理、運用、アクセスの全機能は、AWS API と CLI でも使用できます。AWS マネジメントコンソール で使用できる AWS IaaS の新しい機能およびサービスは、開始時、または開始から 180 日以内に、API と CLI からも使用できます。

上記がAWS CLIの説明になります。一覧表の項４、５、７に関するBatファイルを作成し、サードパーティ製のジョブ管理ツールから実行するイメージの検証を実施することとしました。

#■CLI環境のセットアップ（Windows環境前提）
CLIを実施する端末には事前のセットアップが必要になります。Linux等の環境でも利用できますが、今回はWindows環境が前提となります。

##[AWS CLIのインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-windows.html#cliv2-windows-install)（AWS CLI）
Windowsで「[AWS CLI バージョン 2](https://awscli.amazonaws.com/AWSCLIV2.msi)」をインストールします。
![AWSCLIインストール.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/6ef03618-71cd-ee3a-60e3-91dbb66d4903.jpeg)
##[AWS CLIのアップグレード](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-windows.html#cliv2-windows-upgrade)（AWS CLI）
「aws --version」コマンドでバージョンを確認します。

```DOS
aws --version
```
実施結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/45483373-47b2-f2ce-461b-3d748f03d398.png)
[GitHubのリリースページ](https://github.com/aws/aws-cli/releases)で最新のバージョンを確認して、最新版がリリースされていればアップデートします。
##[AWS CLIの初期設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html#cli-quick-configuration)（AWS CLI）
「AWS CLI のかんたん設定」で初期設定を実施します。
設定にはアクセスキー・シークレットアクセスキー・AWS リージョン・出力形式の 4 つの情報が必要な為、準備します。
※今回はローカル端末で実施したためアクセスキーとシークレットキーを使用しましたが、AWSのベストプラクティスはIAMロールを使用することです。AWS上のEC2インスタンスからCLIを実施したい場合は、対象のインスタンスに「CLIを利用するためのIAMロールをアタッチ」することで、より安全に処理が可能になります。手順は「[AWS CLI での IAM ロールの使用](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-role.html)」に記載されています。


|項目|設定値|補足|
|:-----------------|:-----------------|:-----------------|
|AWS Access Key ID [None]||利用するIAMユーザのアクセスキー情報(ルートユーザの使用は避ける） |
|AWS Secret Access Key [None]||利用するIAMユーザのシークレットアクセスキー情報(ルートユーザの使用は避ける）|
|Default region name [None]:|ap-northeast-1|デフォルトでリクエストを送信するサーバーのAWSリージョン|
|Default output format [None]|json|結果の形式を指定|

「aws configure」コマンドを実行して、設定値を入力します。

```DOS
aws configure
```
実施結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/d8eaebf2-5ac2-fc8a-5ab9-d07a9c94f5f0.png)

以下の4つのコマンドで設定を確認できます。シークレットアクセスキーも丸見えです。

```DOS
aws configure get aws_access_key_id --profile default
aws configure get aws_secret_access_key --profile default
aws configure get region --profile default
aws configure get output --profile default
```

「aws configure list」コマンドでも確認できますが、アクセスキーは*で見えなくなっています。

```DOS
aws configure list
```

#■AWS CLIによるEC2インスタンスの起動・停止・sunapshot
環境の準備ができたので、まずはEC2インスタンスの起動・停止・snapshotをCLIで実施します。コマンドは「[AWS CLI リファレンスの EC2 セクション](https://docs.aws.amazon.com/ja_jp/cli/latest/reference/ec2/index.html)」に掲載されていますが、英語版しかないので私はCromeに日本語翻訳を頑張ってもらいました。

##[EC2インスタンスの起動](https://docs.aws.amazon.com/ja_jp/cli/latest/reference/ec2/start-instances.html)（AWS CLI）
以下のコマンドを実施します。

```DOS
aws ec2 start-instances --instance-ids インスタンスID
```
コマンドプロンプトに実行結果が出力されます。実際のAWS上でも問題なくEC2インスタンスが起動していることを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/08734730-0b96-a620-1c5e-e71a82a14ab3.png)
CloudTrailのイベント履歴画面を確認しましたが、きちんと「StartInstances]のログが残っていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/f06d03d3-9a68-4885-334f-4f871e5ac8ea.png)

##[EC2インスタンスの停止](https://docs.aws.amazon.com/ja_jp/cli/latest/reference/ec2/stop-instances.html)（AWS CLI）
以下のコマンドを実施します。

```DOS
aws ec2 stop-instances --instance-ids インスタンスID
```
```DOS
@rem  作成日2020/04/25

Set INSTANCE=i-01f30126d38c87f26
Set ACTION=EC2_create_image
Set TODAY=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
Set LOG=C:\log\awslog\%TODAY%\%INSTANCE%_awslog.log
Mkdir C:\log\awslog\%TODAY%

echo %ACTION% >> %LOG%
echo %date% %time% >> %LOG%
aws ec2 create-image --instance-id  %INSTANCE% --name "%INSTANCE%_%TODAY%" --description "An AMI for %INSTANCE%" >> %LOG%

echo %ACTION%_return_code >> %LOG%
echo %date% %time% >> %LOG%
echo %errorlevel% >>  %LOG%
```

コマンドプロンプトに実行結果が出力されます。実際のAWS上でも問題なくEC2インスタンスが停止していることを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/2140bfa5-101f-2dac-38fc-bc7630001882.png)
CloudTrailのイベント履歴画面を確認しましたが、きちんと「stopInstances]のログが残っていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/afeb31f9-dc19-1d63-dbed-9d326bddfc24.png)

##[EC2インスタンスのEBSスナップショット](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-snapshots.html)（AWS CLI）
以下のコマンドを実施します。「例1：マルチボリュームのスナップショットを作成するには」を参考にしており、指定したインスタンスに接続されているすべてのボリュームのスナップショットを作成するコマンドになります。

```DOS
aws ec2 create-snapshots --instance-specification InstanceId=インスタンスID --description "This is snapshot of a volume from kensyo-instance"
```
コマンドプロンプトに実行結果が出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/6a91e0d5-4d5b-df9b-5095-f6645a7663b3.png)
実際のAWS上でも問題なくEBSスナップショットが取得できていることを確認できました。「description」で記載していた説明文も設定されています。オプションの設定を追加すればタグを付けたり色々な設定が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/f74dc477-89dd-70f6-d623-b430614de139.png)
CloudTrailのイベント履歴画面を確認しましたが、きちんと「CreateSnapshots]のログが残っていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/afeb31f9-dc19-1d63-dbed-9d326bddfc24.png)

#■AWS CLIによるBatファイル作成と実行
最初に記載した通り「インスタンス停止→Snapshot→インスタンス起動」の流れで実施するイメージのBatファイルを作成し、問題なく動作することを確認しました。またジョブ管理ツールだとリターンコードを受け取る必要があるので[リターンコード設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-returncodes.html)も実施しています。

##01_EC2インスタンスの停止（AWS CLI）
###BATファイル(例)
「インスタンスID」には対象のインスタンスの情報を記載します。

```DOS
@rem  作成日2020/04/25

Set INSTANCE=インスタンスID
Set ACTION=EC2_stop
Set TODAY=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
Set LOG=C:\log\awslog\%TODAY%\%INSTANCE%_awslog.log
Mkdir C:\log\awslog\%TODAY%

echo %ACTION% >> %LOG%
echo %date% %time% >> %LOG%
aws ec2 stop-instances --instance-ids %INSTANCE% >> %LOG%

echo %ACTION%_return_code >> %LOG%
echo %date% %time% >> %LOG%
echo %errorlevel% >>  %LOG%
```
###BATファイル実行結果
問題なく処理が実施されました。「%INSTANCE%_awslog.log」に出力された結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/8eef3fca-2dc2-9e17-0d3e-a86c00cff934.png)

##02_EC2スナップショット取得（AWS CLI）
###BATファイル(例)
「インスタンスID」には対象のインスタンスの情報を記載します。

```DOS
@rem  作成日2020/04/25

Set INSTANCE=インスタンスID
Set ACTION=EC2_snapshots
Set TODAY=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
Set LOG=C:\log\awslog\%TODAY%\%INSTANCE%_awslog.log
Mkdir C:\log\awslog\%TODAY%

echo %ACTION% >> %LOG%
echo %date% %time% >> %LOG%
aws ec2 create-snapshots --instance-specification InstanceId=%INSTANCE% --description "This is snapshot of a volume from kensyo-instance %TODAY%" >> %LOG%

echo %ACTION%_return_code >> %LOG%
echo %date% %time% >> %LOG%
echo %errorlevel% >>  %LOG%
```
###BATファイル実行結果
問題なく処理が実施されました。「%INSTANCE%_awslog.log」に出力された結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/fc1007ff-c076-25d1-b7a6-5a597bd4e59c.png)

##03_EC2インスタンスの起動（AWS CLI）
###BATファイル(例)
「インスタンスID」には対象のインスタンスの情報を記載します。

```DOS
@rem  作成日2020/04/25

Set INSTANCE=インスタンスID
Set ACTION=EC2_start
Set TODAY=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
Set LOG=C:\log\awslog\%TODAY%\%INSTANCE%_awslog.log
Mkdir C:\log\awslog\%TODAY%

echo %ACTION% >> %LOG%
echo %date% %time% >> %LOG%
aws ec2 start-instances --instance-ids %INSTANCE% >> %LOG%

echo %ACTION%_return_code >> %LOG%
echo %date% %time% >> %LOG%
echo %errorlevel% >>  %LOG%
```
###BATファイル実行結果
問題なく処理が実施されました。「%INSTANCE%_awslog.log」に出力された結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/d4ab3aad-b1f4-f26a-2071-4fd4b16d9caf.png)

##04_EC2インスタンスの再起動（AWS CLI）
###BATファイル(例)
「インスタンスID」には対象のインスタンスの情報を記載します。

```DOS
@rem  作成日2020/04/25

Set INSTANCE=インスタンスID
Set ACTION=EC2_reboot
Set TODAY=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
Set LOG=C:\log\awslog\%TODAY%\%INSTANCE%_awslog.log
Mkdir C:\log\awslog\%TODAY%

echo %ACTION% >> %LOG%
echo %date% %time% >> %LOG%
aws ec2 reboot-instances --instance-ids %INSTANCE% >> %LOG%

echo %ACTION%_return_code >> %LOG%
echo %date% %time% >> %LOG%
echo %errorlevel% >>  %LOG%
```
###BATファイル実行結果
問題なく処理が実施されました。「%INSTANCE%_awslog.log」に出力された結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/4372ce74-bb7a-e7b4-9da9-6ed6a62f7bb9.png)
#■■　まとめ　■■
インスタンス起動・停止、スナップショットの取得が簡単にCLIを利用して制御できることが確認できました。これで、サードパーティ製のジョブ管理ツールを利用した一元管理が可能であることが解りました。CLIでバッチ化すると色々便利そうな気がするので、もう少し色々なコマンドを確認して検証を進めたいと思います。

次回は「[AWS動作検証【6】（作成済みEBSボリュームの暗号化）](https://qiita.com/gomasa/items/aeadd1998a88692f824b)」です。

以　　上