初めまして。AWS運用管理チームの梶原です。エンジニア歴3ヶ月の初学者です。これからAWSエンジニアを目指す方だったり、「Linuxやネットワークの知識はあるけど、AWSの知識はない」というような方に初心者目線で情報発信・何かのお役に立てればと考えています。
さて、タイトルの「AWS CLIを使ったEBSボリューム変換時間の確認方法」についてお話しさせていただきます。
結論
結論ですが、AWS CLI 環境にて下記コマンドを入力します。
aws ec2 describe-volumes-modifications --volume-ids <EBS ボリュームIDを指定>
この記事の対象者
・EBS ボリュームの正確な変換時間を知りたい方
・AWS CLI とは何か?分からない方
背景
EBS ボリュームに変更を行うと、最適化中 状態が長時間に渡って継続します。 随時、[F5] キーや [Ctrl] + [5] キーを押してブラウザを更新して、AWS マネジメントコンソールを観察し、ボリュームの状態が「使用可能」に変わったことを確認する方法以外に、何かいい方法は無いか探していました。より確実な変更時間を把握するのが今回の趣旨となります。
AWS CLI 使用の前提条件
AWS CLI とは
まず、AWS CLI とは何か?というお話で、公式からの引用で恐縮ですが
AWS Command Line Interface (AWS CLI) は、コマンドライン シェルでコマンドを使用して AWS のサービスを操作できるオープン ソース ツールです。最小限の構成で、AWS CLI を使用すると、ターミナル プログラムのコマンド プロンプトから、ブラウザベースの AWS マネジメント コンソールが提供する機能と同等の機能を実装するコマンドの実行を開始できます。
AWS マネジメントコンソールの直感的な操作が可能な点は、自分を含めた初学者に非常にありがたいですが、中級者以上になるには、このAWS CLIを使用していくのが良さそうです。というのも、下記メリットが考えられるからです。
- 正確かつ確実にリソースの作成ができる(マネジメントコンソールでは、操作ミスの可能性が払拭できない)
- 情報を吐き出すためのコマンドで query オプションなどを使って、必要な情報をピンポイントで抽出が可能
デメリットは、初学者からの習得の難易度が高いのと、グラフィカルな直感的な操作ができない点でしょうか。
使用環境
- Linux
- macOS
- Windows
- Docker
- Cloud9
- CloudShell
Linux 、macOS 、Windows 及び Docker は、AWS CLI のインストール及び設定が必要です。設定の際に必要な情報は、AWS Access Key ID 及び AWS Secret Access Key です。導入方法は、また別記事にてご紹介したいと思います。(Visual Studio Code の Remote SSH を使用して設定する手順を想定してます。)
Cloud9 と Cloudshell は、すでに AWS CLI がインストールされていて、認証情報も IAM インスタンスプロファイルロールにてセットアップされています。aws-shell という AWS CLI コマンドの入力をインタラクティブに補完してくれる便利なツールがありますが、これは別途インストールが必要です。
https://github.com/awslabs/aws-shell
Cloud9 は、一度環境構築してしまえば、次回からのアクセスは容易ですが、環境構築されていない方は、設定などで時間がかかってしまう恐れがあるので、今回のユースケースのように、サクッと必要な情報のみを抽出したい場合には、CloudShell がオススメとなります。
上記背景から、以下、CloudShell の使用を前提とします。
CloudShell で EBS ボリューム変換時間の確認をしてみる
本記事の趣旨となります、EBS のストレージタイプを gp2 から gp3 などに変更していることが前提となります。変換方法については、割愛させていただきます。
CloudShell 実行権限
マネジメントコンソールへログインしている IAM ユーザーもしくは、IAM Role で設定している権限となります。したがいまして、読み取り専用の権限では、実行できないことになります。
必要最小限の権限設定は、公式ドキュメントによると、
CreateEnvironment
CreateSession
GetEnvironmentStatus
StartEnvironment
これらの許可が必要となります。 必要最低限の権限設定をした時の挙動は、こちら が参考になるかと思います。
CloudShell の立ち上げ方
上記、権限設定を確認した上で、マネジメントコンソールへログインします。
上部の赤○で囲った部分をクリックします
これで立ち上がりました。ワンクリックで使用できるのは素晴らしいですね!
ボリューム ID の確認
マネジメントコンソールの別タブを開いて、EC2 → 左側のナビゲーション・ペインにある [インスタンス] をクリック → 該当のインスタンスにチェック
中段の [ストレージ] タブをクリック
ボリューム ID を控えます。(EBS ボリュームを複数アタッチしている場合は複数表示されます。)
変換時間の確認
ボリューム ID を指定してコマンドを投入してみます。
StartTime が変換開始で、EndTime が変換完了を示しています。図の例だと、01:59 - 01:54 で変換に 5 分かかったということが分かりました。
この際、ボリュームの変更がされていないと、下記メッセージが出てしまいますので、ボリュームの変更時間を確認したい場合は、あらかじめボリュームの変更をしておきましょう。
An error occurred (InvalidVolumeModification.NotFound) when calling the DescribeVolumesModifications operation: Modification for volume '▲▲▲' does not exist.
ちなみに、変更中にコマンドを実行すると、下記のようになりました。 変更が終わっていないため、「EndTime」がないのと、「ModificationState」が「optimizing」となっています。
変換作業が終わったら、お知らせするシェルスクリプト
変換が終わったら、すぐに知りたいという方もいらっしゃるのではないでしょうか。メールでお知らせしてくれるシェルスクリプトをご紹介します。ちなみに、作成したのは、私ではありません(笑) ただし、CloudShellは、20~30分操作されないと、セッションが切れてしまうため、EC2やLambdaでの使用をお勧めします。 バックグラウンドでプロセスが動いていても、セッション切れしてしまうようですね。
必要なもの:SNSトピックのARN
#!/bin/bash if [ $# -ne 1 ]; then echo "引数を正しく設定してください。" exit fi echo $1 "の変換状況を確認します。" while : do aws ec2 describe-volumes-modifications --volume-ids $1 --region ap-northeast-1 | grep '"Progress": 100,' if [ $? -eq 0 ]; then echo "完了しました。" break else echo "継続しています。" sleep 60 fi done aws sns publish --topic-arn [SNS トピックの ARN] --message "変換完了しました。" exit
使い方について
①こちらのコード中の[SNS トピックの ARN]
を実際のARNへ置き換えます。
②test.sh
など適当な名前で保存
③ 次のコマンドを実行 ./test.sh [ボリュームID]
→./test.sh
の後にボリュームIDを指定してください
そうすると、下記のような状況になります。
SNSトピックで指定したメールアドレスへ下記のメッセージが届きました
最後に
今回は、AWS CLI でボリューム変換時間の確認をやってみましたが、AWS CLIのリファレンスがあります。膨大な量なので、全部を使いこなすのは、さすがに不可能なので、必要な情報を取得したりとか、確実に操作をしたい場合などにかいつまんで利用していくのが良さそうですね。
今回ご紹介したボリューム変換時間のリファレンスはこちらです。 https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-volumes-modifications.html