【AWS CLI】EBSのボリュームタイプをgp3へ変更する際に利用できるコマンド

記事タイトルとURLをコピーする

こんにちは。AWS CLIが好きな福島です。

今回は、ボリュームタイプを新しくリリースされたgp3に変更する際に利用できそうなコマンドを記載いたします。

f:id:swx-fukushima:20201022005339p:plain

ボリュームタイプをgp3へ変更するメリットは以下のブログを参照いただけますと幸いです。

blog.serverworks.co.jp

変更対象を洗い出すコマンド

全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 時間実行される必要があります。) ※この機能は、追加料金なしで利用できます。

詳細は以下のブログを参照いただけますと幸いです。

blog.serverworks.co.jp

blog.serverworks.co.jp

「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および現在のボリューム情報が記載されます。

f:id:swx-fukushima:20210107173315p:plain

H-K列

EBSボリュームのメトリクス情報が記載されます。

f:id:swx-fukushima:20210107173512p:plain

L-Q列

推奨値パターン1が記載されます。

f:id:swx-fukushima:20210107173607p:plain

R-W列

推奨値パターン2が記載されます。 (パターン2がない場合もあるようです。)

f:id:swx-fukushima:20210107173711p:plain

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コマンドを記載しました。 どなたかのお役に立てれば幸いです。

福島 和弥 (記事一覧)

SRE3課

2019/10 入社

AWS CLIが好きです。