AMI登録解除時にスナップショットを同時に削除するオプションがめっちゃ便利。ただ、スナップショットの削除は不可の場合はどうなるか気になったので試してみた

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

サービス開発のくればやしです。普段、Cloud AutomatorというAWSの内製化支援サービスを開発しているため、表記のような細かい仕様がきになる毎日です。

背景

以下のアップデートにより、AMI の登録解除時に紐づいているEBS スナップショットを削除できるようになりました。従来はAMI登録解除後に、スナップショットを削除する必要があったので、大変便利だと思います。

aws.amazon.com

このとき、スナップショットの設定によっては、スナップショットの削除に失敗するケースがありえます。例えば、スナップショットをロックしていると、そのスナップショットは削除できません。また、AMIには複数スナップショットが紐づいているケースもあるため、複数スナップショットのうちどれか一つのスナップショットだけ削除できない、というケースも考えられます。

そのような場合にどのような結果や出力が得られるのか確認してみました。(AMIの登録解除自体が失敗するのか、すべてのスナップショットの削除に失敗するのか、一部のスナップショットの削除に失敗するのか、それらのときのレスポンスはどうなるのか。)

ちなみに、スナップショットが複数AMIに紐づいていた場合は、削除できないことはドキュメントに記載されていました。

When deregistering an AMI, you can optionally delete its associated snapshots at the same time. However, if a snapshot is associated with multiple AMIs, it won't be deleted even if specified for deletion, although the AMI will still be deregistered. Any snapshots not deleted will continue to incur storage costs.

Deregister an Amazon EC2 AMI - Amazon Elastic Compute Cloud

AWS CLIでやってみた

複数のスナップショットが紐づいているAMIを用意し、どれか一つのスナップショットをロックして、AMIの登録解除を行ってみました。

aws ec2 deregister-image \
>     --image-id ami-zzzzzzzzzzzzzzzzz \
>     --delete-associated-snapshots
{
    "Return": true,
    "DeleteSnapshotResults": [
        {
            "SnapshotId": "snap-zzzzzzzzzzzzzzzzz",
            "ReturnCode": "client-error"
        },
        {
            "SnapshotId": "snap-xxxxxxxxxxxxxxxxxx",
            "ReturnCode": "success"
        }
    ]
}

snap-zzzzzzzzzzzzzzzzz がロックしているスナップショットです。

  • AMIは登録解除される
  • 削除可能なスナップショットは削除される
  • 削除不可なスナップショットは削除されない

ことが分かります。また、レスポンス中の ReturnCode の中に削除の結果が格納されます。今回のようにロックされていたケースでは client-error が格納されました。

ちなみに、複数AMIに紐づいていた場合は以下のようなレスポンスが得られました。この場合は skipped が得られました。

~ $ aws ec2 deregister-image --image-id ami-bbbbbbbbbbbbbbbbb --delete-associated-snapshots
{
    "Return": true,
    "DeleteSnapshotResults": [
        {
            "SnapshotId": "snap-bbbbbbbbbbbbbbbbb",
            "ReturnCode": "skipped"
        }
    ]
}

このあたりリターンコードの仕様は以下のドキュメントに整理されていました。

docs.aws.amazon.com

上記ドキュメントを確認すると分かりますが、スナップショットのロック等、ユーザーの設定起因のものは

client-error - The snapshot was not deleted due to a client configuration error

と表示されるため、どの設定のために削除できなかったかはこのリターンコードからだけでは判別が難しそうです。 もし delete-snapshot APIを使って直接削除を試みた場合は、詳細の理由が表示されます。失敗の詳細な理由まで取得したい場合は、このように個別の削除か、設定の確認等が必要そうです。

~ $ aws ec2 delete-snapshot --snapshot-id snap-zzzzzzzzzzzzzzzzz

An error occurred (SnapshotLocked) when calling the DeleteSnapshot operation: The snapshot 'snap-zzzzzzzzzzzzzzzzz' is locked.

おわりに

今回、AMI登録解除時にスナップショットを同時に削除するオプションについて深堀りしてみました。なにかの参考になれば幸いです。

紅林輝(くればやしあきら)(サービス開発部) 記事一覧

サービス開発部所属。2015年にサーバーワークスにJOIN。クラウドインテグレーション部を経て、現在はCloud Automatorの開発に従事。ドラクエ部。推しナンバーはⅤ、推しモンスターはクックルー。