AWS Systems Manager を使って AMI と スナップショット を一緒に削除してみた!

2019.08.11

こんにちは 園部です。

AMI やスナップショット を利用した EC2 のバックアップは、多くの方が経験のある作業ではないかと思います。定期的な取得は、専用サービスや自前スクリプトを作成して、自動取得・世代管理(世代を過ぎたリソース削除)を実現されているかと思いますが、システムメンテナンスやリリースの際に、手動にて AMI を取得することもあると思います。

それらのバックアップは、一定期間経過すると不要となるケースが多く、またコスト面からも削除するのが良いです。

今回は、不要となった AMI とスナップショットを削除する方法として、AWS Systems Manager(以降、SSM) Automation を利用して、AMI とスナップショット を一緒に(かつ大量に)削除する方法をやってみたいと思います。

背景

AMI としてバックアップされるものは以下となり、実際にAMI 取得を実行すると、EBS データに関してはスナップショットが合わせて実行されます。

・ 1 つまたは複数の EBS スナップショット、または、instance-store-backed AMI、インスタンスのルートボリュームのテンプレート (オペレーティングシステム、アプリケーションサーバー、アプリケーションなど) ・ 起動許可 (AMI を使用してインスタンスを起動する権限を特定の AWS アカウントに与える) ・ インスタンスの起動時にインスタンスにアタッチするボリュームを指定するブロックデバイスマッピング

( 引用元: 公式ドキュメント(Amazon マシンイメージ (AMI)) )

そのため、取得した AMI と スナップショットには関連性があり、削除する際には AMI を削除(登録解除)した上で、スナップショットを削除する 必要があります。

  • AMI を残したまま、スナップショットを削除した際のエラーメッセージ

The snapshot snap-048384fc96d6b10f6 is currently in use by ami-081a62125c7f6ada7

(意訳: AMI で使ってますよー)

やってみた

「背景」 部分で紹介したように、削除するには2段階で実施する必要があります。( AMI 登録解除 >>> スナップショット削除

AMI 削除したら合わせて削除してほしい...ですよね?

一つや二つであれば、まだ良いですが、大量にあったり万が一間違えた際は惨事となります。

そこで、 AWS Systems Manager Automation 「AWS-DeleteImage」 の出番です!!

説明

Amazon マシンイメージ (AMI) および関連するすべてのスナップショットを削除します。

引用元: 公式ドキュメント

01. AMI 取得

事前に、AMI を二つ取得します。

  • AMI(2つ)

  • スナップショット(4つ)

02. 対象へのタグ付け

手動で作成する際には AMI へ任意のタグを付与することは出来ません。

そのため、 タグエディターを利用してタグを付けていきます。

リソースグループ >>> タグエディター

リソースタイプ で、AWS::EC2::Image を選択します。

対象とするリソースを選択し、 選択されたリソースのタグを管理する を選択します。

タグを追加 を選択し、追加します。(今回は Delete-Target / On )

確認したら、 タグの変更を確認して適用する を選択します。

選択したリソースのすべてに変更を適用する を選択します。

03. SSM Automaiton 「AWS-DeleteImage」 実行

AWS Systems Manager >>> オートメーション >>> オートメーションの実行

AMI management を選択し、 AWS-DeleteImage を選択します。

オートメーションの実行 を選択します。

  • 複数対象の場合は レートの制御 を選択します。
  • ターゲットでは、先ほど作成したタグを指定します。
  • 実行 を選択します。

処理が成功しました。

AMI とスナップショットが消えています。

スッキリ!!!

気になるポイント

パフォーマンス検証

処理にかかる時間を確認していきます。以下の条件を作成し、「やってみる」で紹介した手順を 実行します。

条件

  • EC2: EBS 8GB *1
  • AMI: 81
  • レート: 4(並行実行)

結果

  • 全て削除

  • 1分で終了(各リソースのコンソールから削除されるのはもう少しかかりました)

ターゲット検証

意図したターゲットのみ実行されることを確認していきます。以下の条件を作成し、「やってみる」で紹介した手順を繰り返します。

条件と仮説

  • 同一インスタンス + タグあり AMI( ami-0ef12abd7226a16e2 ) + 関連スナップショット( snap-00f395d6c3a6a527a / snap-0556957a444dab213)
  • 削除対象
  • 同一インスタンス + タグあり スナップショットのみ( snap-011df6f92332cf4f4 )
  • 削除対象外
  • 同一インスタンス + タグなし AMI( ami-02162f9fbc5cdb9fa ) + 関連スナップショット( snap-020b225eea87fac41 / snap-024177d4ef796c581 )
  • 削除対象外
  • 同一インスタンス + タグあり スナップショットのみ( snap-07b4571e28a558f64 )
  • 削除対象外

結果

想定では実行されるステップは一つ(条件の一つ目のみ)だったが、2つのステップが実行されました。

二つ目は失敗となっている。

想定外に実行された対象は 条件の二つ目:同一インスタンス + タグあり スナップショットのみ( snap-011df6f92332cf4f4 ) です。

手動でスナップショットのみを取得し、対象となるタグを付与した。

エラーメッセージによると、ImageID(AMI ID)が正しいパターンではないことが原因とされています。

エラーメッセージ

Step fails when it is validating and resolving the step inputs. com.amazonaws.amiaserviceworker.exception.ActionInputsResolvingException: Input ImageId String pattern validation fails. Expected regex pattern: (^ami-(\w{8}|\w{17})$). Actual value: snap-011df6f92332cf4f4. Please refer to Automation Service Troubleshooting Guide for more diagnosis details.

対象スナップショットは、ImageIDではないため、失敗することは正常な処理とも考えられますが、そもそもの対象外として処理されることを想定していました。スナップショットにも、タグを付けている場合は、利用するタグに注意が必要です。

削除処理は失敗(正しい対象は成功)しますが、注意しておかないと焦ってしまうポイントです。

さいごに

SSM を有効的に利用すると今まで苦労していた(ちょっとしたスクリプト作成)作業が簡単に行うことが可能です。

何か作業を実施する際には、利用できそうなドキュメントはないかをお探しすることをお勧めします!フィットするものがなければ今まで通りスクリプト作成したり、SSM ドキュメントを作成したり、(スポットであれば)手動で行うのが良いと思います。

夏ですね。暑いですね。サービス・システム管理も重要ですが、体調管理も気をつけていきましょう!