【AWS】ec2 describe-volumesコマンドでVolumeIDが取得できなかった理由

<!-- 発端や概要を記載 -->
# 目次
<!-- タイトルとアンカー名を編集 -->
1. [はじめに](#はじめに)
1. [やりたかったこと](#やりたかったこと)
1. [実行環境](#実行環境)
1. [検証](#検証)
1. [ボリュームを復元](#スナップショットからボリュームを復元してみる)
1. [スクリプトの実行](#スクリプトの実行)
1. [さいごに](#さいごに)

# はじめに
大規模なアカウントの場合、膨大な量のスナップショットがアカウント内にあって、どれが不要なものなのかわからない時ってあるかと思います。
そんな時にスナップショットとEBSボリュームIDを紐づけできたらいいなと思ってスクリプトを作成しました。
そして、詰まった個所があったので情報共有します。

# やりたかったこと
「aws ec2 describe-snapshots」コマンドを使用して、スナップショットIDを一覧で取得し、「aws ec2 describe-volumes」コマンドでスナップショットの作成元であるボリュームIDを取得しようと考えていました。
例えば、1つのボリュームから複数のスナップショットが作成されたとき、以下のような形でリスト出力できたらなと考えていました。

``` Volume_SnapshotList.csv
ボリュームID,スナップショットID #ヘッダー部
VolumeAAA,Snapshot1
VolumeAAA<Snapshot2
VolumeAAA,Snapshot3
```
ですが、、、、うまくいきませんでした。


# うまくいかなかった理由
結果から言うと、「aws ec2 describe-volumes」コマンドで取得できるボリュームIDについて勘違いしていたことが原因でした。
私が想像していた「aws ec2 describe-volumes」コマンドの実行結果は、「スナップショットIDの作成元ボリュームID(親)が返ってくる」と思っていました。
ですが実際には「指定したIDのスナップショットから作成されたボリュームID(子)が返ってくる」というものでした。
実際にスナップショットIDを取得し、それに紐づいたボリュームIDを取得することで動作を確認していきます。

# 実行環境
今回検証する環境のボリューム一覧とスナップショット一覧を見ていきます。
リージョンはバージニア北部で行っています。
まず初めに検証用にボリュームを3つ用意しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/0a40429c-2cba-7133-8aab-a2aa704a6b33.png)
そして、検証用に作成したボリュームからスナップショットをそれぞれ作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/4f5a576a-3c15-fd0c-577f-fd5f5034bfc8.png)

ボリュームとスナップショットの親子関係を表すと図のようになります。
ボリュームが「親」でスナップショットが「子」とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/a2d08f10-86da-63fb-479f-ce0ee09a99c2.png)
# 検証
使用したスクリプトは以下になります。
仕組みを簡単に説明すると、リージョン内のスナップショットIDを一覧で取得し、スナップショットIDを1行ずつ読み込みます。
そして、読み込んだスナップショットIDに関連付けられたボリュームIDを取得します。

``` create-list.sh
#!bin/bash
VolumeIdList="VolumeId-list.tmp"
SnapshotIdList="SnapshotId-list.tmp"
Regions="us-east-1"
OutputFile="Snapshot-VolumeID-List.csv"

echo "実行開始"
#csvのヘッダーを作成
echo "VolumeID,SnapshotID" > $OutputFile
#スナップショットIDのリストを取得する
aws ec2 describe-snapshots --owner-ids self --region=$Regions --query "Snapshots[*].[SnapshotId]" --output text > $SnapshotIdList
cat $SnapshotIdList | while read snapshotId 
do
        #指定したスナップショットのボリュームIDを取得する
        aws ec2 describe-volumes --region=$Regions --filters "Name=snapshot-id,Values=$snapshotId"  --query "Volumes[*].[VolumeId]" --output text > $VolumeIdList
        cat $VolumeIdList | while read volumeId
        do
                #スナップショットIDとボリュームをCSVに出力する
                echo "$volumeId,$snapshotId" >> $OutputFile
        done
done
echo "実行完了"
rm $VolumeIdList $SnapshotIdList
```

一見するとスナップショットIDとボリュームIDがセットで取得できそうですが、ボリュームIDは取得できません。
ボリュームIDが取得できないか確認する前に、スナップショットIDが正常に取得できているのか確認してみます。
以下のコマンドの変数部分をちょっとだけ書き換えて、テキスト形式で出力してみます。
```
aws ec2 describe-snapshots --owner-ids self --region=$Regions --query "Snapshots[*].[SnapshotId]" --output text > $SnapshotIdList
```
スナップショットが一覧で取得できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/edb52856-c29e-ed4b-2008-ac1f26d81b0b.png)
次に以下のコマンドの変数部分を書き換えて、ボリュームIDを出力してみます。

```
aws ec2 describe-volumes --region=$Regions --filters "Name=snapshot-id,Values=$snapshotId"  --query "Volumes[*].[VolumeId]" --output text > $SnapshotIdList
```

ボリュームIDは出力されませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/0527416a-9e36-1e95-2a0a-c07cd93cf9b9.png)
ほかのスナップショットIDを指定してみても同様に何も出力されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/588847a2-a86f-2e18-d773-43d66497eeda.png)
# ボリュームを復元
3つのスナップショットからそれぞれボリュームを復元しました。
冒頭に「aws ec2 describe-volumes」コマンドは「指定したIDのスナップショットから作成されたボリュームID(子)が返ってくる」ものだと説明しましたが、はたして本当なのかボリュームを復元してもう一度「aws ec2 describe-volumes」コマンドを実行してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/07f1749e-e7af-beca-a814-dab9215389e2.png)
ちょっと名前の付け方失敗してわかりづらくなってますが、図のような親子関係になっています。
「Volume1」からみて「from-Snapshot1」のボリュームは孫にあたります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/1c68037f-9e38-59e3-2478-75502c8ea48e.png)
この状態で再度「aws ec2 describe-volumes」コマンドを実行してみます。
「aws ec2 describe-snapshots」コマンドでスナップショットIDを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/2fa2b39b-8fb8-7a51-d19d-67360d9bff28.png)
「aws ec2 describe-volumes」コマンドでボリュームIDを取得します。
今度はうまく取得できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/7492cc1a-e511-25da-76d5-b98b8eeceb89.png)
# スクリプトの実行
スナップショットIDと、スナップショットから作成されたボリュームIDをCSV形式で出力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/4c67ea54-86b7-cce6-6fb8-fea0cd0c0c26.png)
出力された「Snapshot-VolumeID-List.csv」の中を見てみると、
スナップショットとスナップショットから作成されたボリュームIDが取得できていました！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2615865/c7e8830f-eb04-131c-605e-a908d8c1548a.png)

# さいごに
取得できないボリュームIDがたくさんあって原因がわからずかなり悩んでいたのですが、検証してみて本当に良かったです。
皆さんもdescribe-volumesコマンドを使用する際は、返ってくる値がスナップショットの「作成元ボリュームID」なのか、「復元したボリュームID」なのか注意してください
これがわかるまでは本当にしんどかったです。。。。