こんにちは。AWS CLIが好きな福島です。
今回は、ボリュームタイプを新しくリリースされたgp3に変更する際に利用できそうなコマンドを記載いたします。
ボリュームタイプをgp3へ変更するメリットは以下のブログを参照いただけますと幸いです。
変更対象を洗い出すコマンド
全gp2ボリュームの一覧取得(パターン①)
gp2ボリュームを全てgp3へ変更する場合は、以下のコマンドで変更対象を抽出できます。
aws ec2 describe-volumes --filters "Name=volume-type,Values=gp2" --query "Volumes[].[VolumeId]" --output text
- 実行結果
vol-03a8f440ea016b119 vol-04dd51e8330c98af5 vol-0fcd375827c1cc54f vol-0dd414ea3b130fc7e vol-085a475bc6367330e
ボリュームの詳細を表示したい場合
echo "VolumeId,Size,Iops,VolumeType,State,InstnaceId[1],InstnaceId[2]" > /tmp/awscli.tmp;\ aws ec2 describe-volumes \ --filters "Name=volume-type,Values=gp2" \ --query "Volumes[].[VolumeId,Size,Iops,VolumeType,State,Attachments[0].InstanceId,Attachments[1].InstanceId]" \ --output text | sort -Vk 2 | tr "\t" "," >> /tmp/awscli.tmp;\ column -s, -t /tmp/awscli.tmp rm /tmp/awscli.tmp
- 出力結果
VolumeId Size Iops VolumeType State InstnaceId[1] InstnaceId[2] vol-0e0f2f0c98bf36694 4 100 gp2 in-use i-050536efdd9dc1126 None vol-076f19c9dae018abe 8 100 gp2 in-use i-0ef06f9b7e2000544 None vol-04dd51e8330c98af5 8 100 gp2 in-use i-07d5d019427d1f749 None vol-0172865e01b54cad9 8 100 gp2 in-use i-0808672558492fde8 None vol-03a8f440ea016b119 8 100 gp2 in-use i-0808672558492fde8 None vol-0668ef05ea72d4c6c 10 100 gp2 available None None
特定のタグが付いたgp2ボリューム一覧(パターン②)
まずは、開発環境や検証環境から実施したい場合、 ボリュームにタグが付与されている前提ですが、以下のコマンドで変更対象を抽出できます。
EnvironmentキーのバリューがDevの場合
TAG_KEY=Environment TAG_VALUE=Dev
上記変数を定義後、以下のコマンドを実行することでEnvironmentキーのバリューがDevのボリュームの一覧を取得できます。
echo "VolumeId,Size,Iops,VolumeType,State,InstnaceId[1],InstnaceId[2]" > /tmp/awscli.tmp;\ aws ec2 describe-volumes \ --filters "Name=volume-type,Values=gp2" \ --query "Volumes[].[VolumeId,Size,Iops,VolumeType,State,Attachments[0].InstanceId,Attachments[1].InstanceId]" \ --output text > /tmp/all-gp2.tmp;\ aws ec2 describe-tags --filters "Name=key,Values=${TAG_KEY}" "Name=value,Values=${TAG_VALUE}" "Name=resource-type,Values=volume" --query "Tags[].[ResourceId]" --output text | while read line do grep $line /tmp/all-gp2.tmp | tr "\t" "," >> /tmp/awscli.tmp done;\ column -s, -t /tmp/awscli.tmp;\ rm /tmp/awscli.tmp /tmp/all-gp2.tmp
- 出力結果
VolumeId Size Iops VolumeType State InstnaceId[1] InstnaceId[2] vol-03a8f440ea016b119 8 100 gp2 in-use i-0808672558492fde8 None vol-04dd51e8330c98af5 8 100 gp2 in-use i-07d5d019427d1f749 None
特定のタグが付いたインスタンスにアタッチされているgp2ボリューム一覧(パターン③)
まずは、開発環境や検証環境から実施したいが、ボリュームにタグを付けていない場合もあるかもしれません。
その場合は、インスタンスにタグが付与されている前提ですが、以下のコマンドで変更対象を抽出できます。
EnvironmentキーのバリューがDevの場合
TAG_KEY=Environment TAG_VALUE=Dev
上記変数を定義後、以下のコマンドを実行することでEnvironmentキーのバリューがDevのインスタンスにアタッチされているgp2ボリュームの一覧を取得できます。
echo "VolumeId,Size,Iops,VolumeType,State,InstnaceId[1],InstnaceId[2]" > /tmp/awscli.tmp;\ aws ec2 describe-tags --filters "Name=key,Values=${TAG_KEY}" "Name=value,Values=${TAG_VALUE}" "Name=resource-type,Values=instance" --query "Tags[].[ResourceId]" --output text | while read line do aws ec2 describe-volumes \ --filters "Name=volume-type,Values=gp2" "Name=attachment.instance-id,Values=${line}" \ --query "Volumes[].[VolumeId,Size,Iops,VolumeType,State,Attachments[0].InstanceId,Attachments[1].InstanceId]" \ --output text | tr "\t" "," >> /tmp/awscli.tmp done;\ column -s, -t /tmp/awscli.tmp;\ rm /tmp/awscli.tmp
- 実行結果
VolumeId Size Iops VolumeType State InstnaceId[1] InstnaceId[2] vol-085a475bc6367330e 30 100 gp2 in-use i-03ab9f7ae7f20b003 None vol-0fcd375827c1cc54f 30 100 gp2 in-use i-08c4df6efbe1cad57 None
ボリュームのIOPSやスループットの推奨値出力コマンド
gp2はボリュームサイズに応じて、IOPSやスループットが決まりますが、 gp3はIOPSやスループットを利用者が指定できるようになりました。
そのため、gp3へボリュームタイプを変更する際に、 IOPSやスループット値が過剰な可能性があるため、 gp2時のIOPSやスループットの値を踏襲すべきか、悩むかもしれません。
そんな時に利用できるのが、「AWS Compute Optimizer」になります。 このサービスは、過去 14 日間の Amazon CloudWatch メトリクスと設定データに基づいて、 ボリュームの最適な設定値をの分析してくれます。(少なくとも 30 時間実行される必要があります。) ※この機能は、追加料金なしで利用できます。
詳細は以下のブログを参照いただけますと幸いです。
「AWS Compute Optimizer」はコンソールから確認できますが、 変更するボリュームが複数ある場合、コンソールから見るのは大変かと思います。 その場合、以下のコマンドを実行し、CSVファイルに分析した内容を出力します。
echo "volumeArn,current_volumeType,current_volumeSize,current_volumeBaselineIOPS,current_volumeBurstIOPS,current_volumeBaselineThroughput,current_volumeBurstThroughput,VolumeReadOpsPerSecond,VolumeWriteOpsPerSecond,VolumeReadBytesPerSecond,VolumeWriteBytesPerSecond,reco[0]_volumeType,reco[0]_volumeSize,reco[0]_volumeBaselineIOPS,reco[0]_volumeBurstIOPS,reco[0]_volumeBaselineThroughput,reco[0]_volumeBurstThroughput,reco[1]_volumeType,reco[1]_volumeSize,reco[1]_volumeBaselineIOPS,reco[1]_volumeBurstIOPS,reco[1]_volumeBaselineThroughput,reco[1]_volumeBurstThroughput" > Compute-Optimizer-ebs.csv;\ aws compute-optimizer get-ebs-volume-recommendations \ --query "volumeRecommendations[].[volumeArn,\ currentConfiguration.volumeType,\ currentConfiguration.volumeSize,\ currentConfiguration.volumeBaselineIOPS,\ currentConfiguration.volumeBurstIOPS,\ currentConfiguration.volumeBaselineThroughput,\ currentConfiguration.volumeBurstThroughput,\ utilizationMetrics[0].value,\ utilizationMetrics[1].value,\ utilizationMetrics[2].value,\ utilizationMetrics[3].value,\ volumeRecommendationOptions[0].configuration.volumeType,\ volumeRecommendationOptions[0].configuration.volumeSize,\ volumeRecommendationOptions[0].configuration.volumeBaselineIOPS,\ volumeRecommendationOptions[0].configuration.volumeBurstIOPS,\ volumeRecommendationOptions[0].configuration.volumeBaselineThroughput,\ volumeRecommendationOptions[0].configuration.volumeBurstThroughput,\ volumeRecommendationOptions[1].configuration.volumeType,\ volumeRecommendationOptions[1].configuration.volumeSize,\ volumeRecommendationOptions[1].configuration.volumeBaselineIOPS,\ volumeRecommendationOptions[1].configuration.volumeBurstIOPS,\ volumeRecommendationOptions[1].configuration.volumeBaselineThroughput,\ volumeRecommendationOptions[1].configuration.volumeBurstThroughput]" --output text | tr "\t" "," >> Compute-Optimizer-ebs.csv
A~G列
EBSボリュームのARNおよび現在のボリューム情報が記載されます。
H-K列
EBSボリュームのメトリクス情報が記載されます。
L-Q列
推奨値パターン1が記載されます。
R-W列
推奨値パターン2が記載されます。 (パターン2がない場合もあるようです。)
gp3への変更コマンド
まずは、gp3へ変更するボリュームを記載します。
vi gp3-change.list
記載例)
# cat gp3-change.list vol-xxxxxxxxxxxxxxxxx vol-xxxxxxxxxxxxxxxxx vol-xxxxxxxxxxxxxxxxx vol-xxxxxxxxxxxxxxxxx
リストの編集が完了したら、以下のコマンドを実行します。
IOPSとthroughputの値を指定していないため、デフォルトの3000IOPS,125MB/sになります。
cat gp3-change.list | while read line do aws ec2 modify-volume --volume-id ${EBS_VOLUME_ID} --volume-type gp3 sleep 1 done
もし、IOPSやthroughputを変更する場合は、以下のコマンドを使います。
実行例) IOPS:3100,スループット:128MB/sに設定
aws ec2 modify-volume --volume-type gp3 --volume-id vol-xxxxxxxxxxxxxxxxx --iops 3100 --throughput 128
ステータス確認コマンド
echo "StartTime VolumeId ModificationState OriginalVolumeType TargetVolumeType OriginalSize TargetSize OriginalIops TargetIops OriginalThroughput TargetThroughput Progress" > /tmp/awscli.tmp ;\ aws ec2 describe-volumes-modifications --query "VolumesModifications[].[StartTime,VolumeId,ModificationState,OriginalVolumeType,TargetVolumeType,OriginalSize,TargetSize,OriginalIops,TargetIops,OriginalThroughput,TargetThroughput,Progress]" --output text >> /tmp/awscli.tmp ;\ column -t /tmp/awscli.tmp ;\ rm /tmp/awscli.tmp
- 実行結果
StartTime VolumeId ModificationState OriginalVolumeType TargetVolumeType OriginalSize TargetSize OriginalIops TargetIops OriginalThroughput TargetThroughput Progress 2020-07-27T06:57:11+00:00 vol-047f9e48ae594ab52 completed gp2 gp2 50 60 150 180 None None 100 2020-12-09T08:22:56+00:00 vol-07099d2e09eb102b6 completed gp2 gp3 8 8 100 3000 None 125 100 2021-01-07T08:08:10+00:00 vol-0a6092980c505e7ca completed gp3 gp3 8 8 3000 3100 125 128 100
ModificationState
EBSボリュームのステータスが分かります。
コマンド実行後、
modifying ⇒ optimizing ⇒ completed
のようにステータスが遷移します。
optimizing から completed になるまで、1日以上かかることもあります。
OriginalVolumeType OriginalSize OriginalIops OriginalThroughput
EBSボリュームの変更前の値になります。
TargetVolumeType TargetSize TargetIops TargetThroughput
EBSボリュームの変更後の値になります。
※Throughput の値は、gp2の場合、Noneになるようです。
おわりに
今回は、ボリュームタイプを変更する際に利用できるAWS CLIコマンドを記載しました。 どなたかのお役に立てれば幸いです。