AWS CLI で EBS ボリュームタイプを gp2 から gp3 に変更してみた #reinvent

新しく発表された EBS ボリューム gp3 への切り替えを AWS CLI でやってみました。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンバンハ、千葉(幸)です。

先日、EBS ボリュームタイプを gp2 から gp3 に変更することを想定したエントリを書きました。

変更によるコストメリットが出るので、特に制約がなければどんどん変えていきたいです。とは言えコンソールから一つずつ変更していくのも手間だな……と思い、 AWS CLI を使用した時にどのようなコマンドを叩くことになるかを確認してみました。

スクリプト化までは至っていませんが、その部品として参考にしてもらえればと思います。

使用する AWS CLI バージョン

2.1.11 を使用しています。

% aws --version
aws-cli/2.1.11 Python/3.7.4 Darwin/19.6.0 exe/x86_64 prompt/off

途中まで 2.0.48 を使用していたのですが、aws ec2 modify-volumeコマンドで--throughputを指定できないことに気づいたのでアップグレードしました。

% aws --version
aws-cli/2.0.48 Python/3.7.4 Darwin/19.6.0 exe/x86_64

aws ec2 modify-volume help

SYNOPSIS
            modify-volume
          [--dry-run | --no-dry-run]
          --volume-id <value>
          [--size <value>]
          [--volume-type <value>]
          [--iops <value>]
          [--cli-input-json | --cli-input-yaml]
          [--generate-cli-skeleton <value>]
          [--cli-auto-prompt <value>]

既存の gp2 ボリュームの一覧を取得する

--filterオプションでボリュームタイプによるフィルタリングを行います。(--filters(sつき)じゃなくてもいいことを初めて知りました。)

(対象ボリュームが 500 を超える場合は一度のコマンドで全て出力することはできません。)

% aws ec2 describe-volumes\
  --filter "Name=volume-type,Values=gp2"\
  --query "Volumes[*].VolumeId"

[
    "vol-xxx5bba432c583dcd",
    "vol-xxx68aeecae930dd1",
    "vol-xxx02717f2dd4fa6d",
    ---以下略---
]

ついでに--queryオプションでボリューム ID のみを出力するように指定してみました。

既存の gp2 ボリュームの情報を確認する

取り立てて必要なステップではないですが、せっかくなので取得しておきます。

% aws ec2 describe-volumes\
  --volume-ids vol-xxx5bba432c583dcd
  
{
    "Volumes": [
        {
            "Attachments": [
                {
                    "AttachTime": "2020-12-07T16:34:15+00:00",
                    "Device": "/dev/xvda",
                    "InstanceId": "i-XXXca7f781ffbdca2",
                    "State": "attached",
                    "VolumeId": "vol-xxx5bba432c583dcd",
                    "DeleteOnTermination": true
                }
            ],
            "AvailabilityZone": "ap-northeast-1a",
            "CreateTime": "2020-12-07T16:34:16.001000+00:00",
            "Encrypted": false,
            "Size": 8,
            "SnapshotId": "snap-XXX31d416f3b41c6c",
            "State": "in-use",
            "VolumeId": "vol-xxx5bba432c583dcd",
            "Iops": 100,
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "AWS CLI"
                }
            ],
            "VolumeType": "gp2"
        }
    ]
}

ちなみに「ステータス」を確認するコマンドは別になります。

% aws ec2 describe-volume-status\
  --volume-ids vol-xxx5bba432c583dcd

{
    "VolumeStatuses": [
        {
            "Actions": [],
            "AvailabilityZone": "ap-northeast-1a",
            "Events": [],
            "VolumeId": "vol-xxx5bba432c583dcd",
            "VolumeStatus": {
                "Details": [
                    {
                        "Name": "io-enabled",
                        "Status": "passed"
                    },
                    {
                        "Name": "io-performance",
                        "Status": "not-applicable"
                    }
                ],
                "Status": "ok"
            }
        }
    ]
}

ここでいうステータスとはin-useavailableといったものではなく、マネジメントコンソールのここで確認できるものです。

ボリュームタイプを変更する

今回は以下のような条件で変更を行います。

  • ボリュームタイプを gp3 に変更
  • IOPS を 3000 に変更
  • スループットを 125(MiB/s)に変更
  • サイズは変更なし

IOPS とスループットはベースライン(最小)の値を指定しています。必要な値は、冒頭のエントリなどを参考に決定してください。

%  aws ec2 modify-volume\
  --volume-id vol-xxx5bba432c583dcd\
  --volume-type gp3\
  --iops 3000\
  --throughput 125

{
    "VolumeModification": {
        "VolumeId": "vol-xxx5bba432c583dcd",
        "ModificationState": "modifying",
        "TargetSize": 8,
        "TargetIops": 3000,
        "TargetVolumeType": "gp3",
        "TargetThroughput": 125,
        "OriginalSize": 8,
        "OriginalIops": 100,
        "OriginalVolumeType": "gp2",
        "Progress": 0,
        "StartTime": "2020-12-16T10:11:30+00:00"
    }
}

変更前の値と変更後の値がそれぞれOriginal Target という接頭辞が付いて返却されます。

変更のステータスを確認する

変更のステータスは専用のコマンドで確認します。

変更のステータスや進捗を確認できます。

% aws ec2 describe-volumes-modifications\
  --volume-ids vol-xxx5bba432c583dcd

{
    "VolumesModifications": [
        {
            "VolumeId": "vol-xxx5bba432c583dcd",
            "ModificationState": "optimizing",
            "TargetSize": 8,
            "TargetIops": 3000,
            "TargetVolumeType": "gp3",
            "OriginalSize": 8,
            "OriginalIops": 100,
            "OriginalVolumeType": "gp2",
            "Progress": 5,
            "StartTime": "2020-12-16T10:11:30+00:00"
        }
    ]
}

(スループットに関する値が出力に含まれていないのが気になりますが……まぁ、そういうものなのでしょう。)

変更が完了すると、以下のような出力となります。

% aws ec2 describe-volumes-modifications\
  --volume-ids vol-xxx5bba432c583dcd

{
    "VolumesModifications": [
        {
            "VolumeId": "vol-xxx5bba432c583dcd",
            "ModificationState": "completed",
            "TargetSize": 8,
            "TargetIops": 3000,
            "TargetVolumeType": "gp3",
            "OriginalSize": 8,
            "OriginalIops": 100,
            "OriginalVolumeType": "gp2",
            "Progress": 100,
            "StartTime": "2020-12-16T10:11:30+00:00",
            "EndTime": "2020-12-16T10:16:45+00:00"
        }
    ]
}

スタートと終了の時刻が記載されているので、ここで所要時間を確認することもできますね。

変更後のボリュームの情報を確認する

変更後のボリュームを再度確認してみましょう。

% aws ec2 describe-volumes\
  --volume-ids vol-xxx5bba432c583dcd

{
    "Volumes": [
        {
            "Attachments": [
                {
                    "AttachTime": "2020-12-07T16:34:15+00:00",
                    "Device": "/dev/xvda",
                    "InstanceId": "i-xxxca7f781ffbdca2",
                    "State": "attached",
                    "VolumeId": "vol-xxx5bba432c583dcd",
                    "DeleteOnTermination": true
                }
            ],
            "AvailabilityZone": "ap-northeast-1a",
            "CreateTime": "2020-12-07T16:34:16.001000+00:00",
            "Encrypted": false,
            "Size": 8,
            "SnapshotId": "snap-xxx31d416f3b41c6c",
            "State": "in-use",
            "VolumeId": "vol-xxx5bba432c583dcd",
            "Iops": 3000,
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "AWS CLI"
                }
            ],
            "VolumeType": "gp3",
            "Throughput": 125
        }
    ]
}

ボリュームタイプ、 IOPS 、スループット、それぞれ指定した値に変更されていることが確認できます。

終わりに

AWS CLI を用いたボリュームタイプの変更を確認してみました。

変更対象が多くなった場合は、こういったコマンドを活用して作業していきたいですね。新しく使用できるようになった AWS CloudShell を使って見るのも面白いかもしれません。

ご参考になれば幸いです。

以上、千葉(幸)がお送りしました。