AWS CLIでAMI・スナップショット一覧を取得する - サーバーワークスエンジニアブログ

AWS CLIでAMI・スナップショット一覧を取得する

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

コーヒーが好きな木谷映見です。今日はスタバのホワイトモカを飲みました。

EC2を利用していると、定期バックアップ等でAMIやスナップショットが溜まります。
これらをAWS CLIで一覧にして取得します。

スナップショットのSnapshotIdの取得

aws ec2 describe-snapshots --owner-ids <対象AWSアカウントID>を実行すると、以下のようにスナップショットの詳細がJSON形式でずらずら出てきます。この情報の中から--queryオプションで必要な情報(今回はSnapshotIdStartTime)を抜き出していきます。

{
    "Snapshots": [
        {
            "Description": "20220329_snapshottest5",
            "Encrypted": false,
            "OwnerId": "対象AWSアカウントID",
            "Progress": "100%",
            "SnapshotId": "snap-xxxxxxxxxxxxxxxxx",
            "StartTime": "2022-03-29T01:36:28.912000+00:00",
            "State": "completed",
            "VolumeId": "vol-xxxxxxxxxxxxxxxxx",
            "VolumeSize": 8,
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "20220329_snapshottest5"
                }
            ],
            "StorageTier": "standard"
        },
        :
        :

対象AWSアカウント内のSnapshotIdの一覧

aws ec2 describe-snapshots \
  --owner-ids 対象AWSアカウントID \
  --query 'Snapshots[].{Id1:SnapshotId}' \
  --output text

出力例

snap-xxxxxxxxxxxxxxxxx
snap-xxxxxxxxxxxxxxxxx
snap-xxxxxxxxxxxxxxxxx
snap-xxxxxxxxxxxxxxxxx
snap-xxxxxxxxxxxxxxxxx
snap-xxxxxxxxxxxxxxxxx
snap-xxxxxxxxxxxxxxxxx
snap-xxxxxxxxxxxxxxxxx
snap-xxxxxxxxxxxxxxxxx

SnapshotIdと時間の一覧

aws ec2 describe-snapshots \
  --owner-ids 対象AWSアカウントID \
  --query 'Snapshots[].{Id1:SnapshotId, id2:StartTime}' \
  --output text

出力例
※時間はUTCであることにご注意ください。

snap-xxxxxxxxxxxxxxxxx  2022-03-29T01:36:28.912000+00:00
snap-xxxxxxxxxxxxxxxxx  2022-03-29T01:35:10.057000+00:00
snap-xxxxxxxxxxxxxxxxx  2022-03-29T01:35:56.022000+00:00
snap-xxxxxxxxxxxxxxxxx  2022-03-29T01:36:11.919000+00:00
snap-xxxxxxxxxxxxxxxxx  2022-03-29T01:34:38.385000+00:00
snap-xxxxxxxxxxxxxxxxx  2022-03-22T13:40:31.227000+00:00
snap-xxxxxxxxxxxxxxxxx  2022-03-07T07:26:55.056000+00:00
snap-xxxxxxxxxxxxxxxxx  2022-03-22T13:41:16.133000+00:00
snap-xxxxxxxxxxxxxxxxx  2022-03-07T07:04:39.160000+00:00

特定日次より前に作成されたsnapshotのSnapshotIdと時間の一覧

aws ec2 describe-snapshots \
  --owner-ids 対象AWSアカウントID \
  --query 'Snapshots[?StartTime<=`2022-03-28T01:36:28.912000+00:00`].{Id1:SnapshotId, id2:StartTime}' \
  --output text

出力例

snap-xxxxxxxxxxxxxxxxx  2022-03-22T13:40:31.227000+00:00
snap-xxxxxxxxxxxxxxxxx  2022-03-07T07:26:55.056000+00:00
snap-xxxxxxxxxxxxxxxxx  2022-03-22T13:41:16.133000+00:00
snap-xxxxxxxxxxxxxxxxx  2022-03-07T07:04:39.160000+00:00

おまけ:CloudShellでjqコマンドを使う

CloudShellにはデフォルトでjqコマンドがインストールされているので、jqを使って取得することもできます。

aws ec2 describe-snapshots \
  --owner-ids 対象AWSアカウントID|jq -r '.Snapshots[]|@text "\(.SnapshotId)"'

出力例

snap-xxxxxxxxxxxxxxxxx
snap-xxxxxxxxxxxxxxxxx
snap-xxxxxxxxxxxxxxxxx
snap-xxxxxxxxxxxxxxxxx
snap-xxxxxxxxxxxxxxxxx
snap-xxxxxxxxxxxxxxxxx
snap-xxxxxxxxxxxxxxxxx
snap-xxxxxxxxxxxxxxxxx
snap-xxxxxxxxxxxxxxxxx

AMIのImageId取得

aws ec2 describe-images --owners <対象AWSアカウントID>を実行すると、以下のようにAMIの詳細がJSON形式でずらずら出てきます。この情報の中から--queryオプションで必要な情報(今回はImageIdCreationDate)を抜き出していきます。

{
    "Images": [
        {
            "Architecture": "x86_64",
            "CreationDate": "2022-03-22T13:41:15.000Z",
            "ImageId": "ami-xxxxxxxxxxxxxxxxx",
            "ImageLocation": "対象AWSアカウントID/ami_test1",
            "ImageType": "machine",
            "Public": false,
            "OwnerId": "対象AWSアカウントID",
            "PlatformDetails": "Linux/UNIX",
            "UsageOperation": "RunInstances",
            "State": "available",
            "BlockDeviceMappings": [
                {
                    "DeviceName": "/dev/xvda",
                    "Ebs": {
                        "DeleteOnTermination": true,
                        "SnapshotId": "snap-xxxxxxxxxxxxxxxxx",
                        "VolumeSize": 8,
                        "VolumeType": "gp2",
                        "Encrypted": false
                    }
                }
            ],
            "Description": "ami_test1",
            "EnaSupport": true,
            "Hypervisor": "xen",
            "Name": "ami_test1",
            "RootDeviceName": "/dev/xvda",
            "RootDeviceType": "ebs",
            "SriovNetSupport": "simple",
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "ami_test1"
                }
            ],
            "VirtualizationType": "hvm"
        },
        :
        :

対象AWSアカウント内のImageIdの一覧

aws ec2 describe-images \
  --owners 対象AWSアカウントID  \
  --query 'Images[].{Id1:ImageId}' \
  --output text

出力例

ami-xxxxxxxxxxxxxxxxx
ami-xxxxxxxxxxxxxxxxx
ami-xxxxxxxxxxxxxxxxx
ami-xxxxxxxxxxxxxxxxx
ami-xxxxxxxxxxxxxxxxx

ImageIdと時間の一覧

※時間はUTCであることにご注意ください。

aws ec2 describe-images \
  --owners 対象AWSアカウントID  \
  --query 'Images[].{Id1:ImageId,id2:CreationDate}' \
  --output text

出力例

ami-xxxxxxxxxxxxxxxxx   2022-03-22T13:41:15.000Z
ami-xxxxxxxxxxxxxxxxx   2022-03-29T09:00:32.000Z
ami-xxxxxxxxxxxxxxxxx   2022-03-22T13:40:30.000Z
ami-xxxxxxxxxxxxxxxxx   2022-03-29T08:57:11.000Z
ami-xxxxxxxxxxxxxxxxx   2022-03-29T08:59:29.000Z

特定日次より前に作成されたAMIのImageIdと時間の一覧

aws ec2 describe-images \
  --owners 対象AWSアカウントID  \
  --query 'Images[?CreationDate<=`2022-03-28T08:59:29.000Z`].{Id1:ImageId,id2:CreationDate}' \
  --output text

出力例

ami-xxxxxxxxxxxxxxxxx   2022-03-22T13:41:15.000Z
ami-xxxxxxxxxxxxxxxxx   2022-03-22T13:40:30.000Z

おまけ:CloudShellでjqコマンドを使う

CloudShellにはデフォルトでjqコマンドがインストールされているので、jqを使って取得することもできます。

aws ec2 describe-images \
  --owners 対象AWSアカウントID|jq -r '.Images[]|@text "\(.ImageId)"' 

出力例

ami-xxxxxxxxxxxxxxxxx
ami-xxxxxxxxxxxxxxxxx
ami-xxxxxxxxxxxxxxxxx
ami-xxxxxxxxxxxxxxxxx
ami-xxxxxxxxxxxxxxxxx

おわりに

--queryオプションを工夫することでほしい値がすっきり取得できます。
「while read ~ done」の構文を使って該当のリソースを削除したり、タグ付けしたりする際便利に使えますので、ほかにもいろいろな値を取得してみてください。
--queryオプションについては以下の当社ブログをぜひご参照ください。 blog.serverworks.co.jp

emi kitani(執筆記事の一覧)

AS部LX課。2022/2入社、コーヒーとサウナが好きです。執筆活動に興味があります。AWS認定12冠。