😇

AWSCLIで2日より前の日のスナップショットを削除する。

7 min read

はじめに

くーばねてすを倒す前にAWSをやっつけないといけなくなったので、今回はスナップショットを倒す!!!はぁはぁ

ミッション

AWSライフサイクルマネージャーを使用せずに不要なN日以前のスナップショットを削除せよ。

■対象ボリュームと項目の指定をする
■取得する日付を指定する。
■削除対象スナップショットID、スナップショット作成日時を一覧取得する.
■対象スナップショットを削除する

をまとめた!(^^)!

■対象ボリュームと項目の指定をする。

まず、N日より前の日という縛りをつけて、必要なスナップショットのみ出力させたい。

表示する要素を指定するには--filtersオプションをつかう。

--filters Name=XXX,Values=XXX

--filtersでなんという名前でキー指定すれば良いかは、コマンドに「help」を付けると確認することができる。

$ aws ec2 describe-snapshots help
略
OPTIONS
       --filters (list)
          The filters.

          o description - A description of the snapshot.

          o encrypted  -  Indicates  whether the snapshot is encrypted (true |
            false )

          o owner-alias - Value from an Amazon-maintained list (amazon |  self
            |  all  | aws-marketplace | microsoft ) of snapshot owners. Not to
            be confused with the user-configured AWS account alias,  which  is
            set from the IAM console.

          o owner-id - The ID of the AWS account that owns the snapshot.

          o progress  - The progress of the snapshot, as a percentage (for ex-
            ample, 80%).

          o snapshot-id - The snapshot ID.

          o start-time - The time stamp when the snapshot was initiated.

          o status - The status of the snapshot (pending | completed  |  error
            ).

          o tag  :<key>  -  The key/value combination of a tag assigned to the
            resource. Use the tag key in the filter name and the tag value  as
            the  filter  value. For example, to find all resources that have a
            tag with the key Owner and the value TeamA , specify tag:Owner for
            the filter name and TeamA for the filter value.

          o tag-key - The key of a tag assigned to the resource. Use this fil-
            ter to find all resources assigned a tag with a specific key,  re-
            gardless of the tag value.

 あった!→o volume-id - The ID of the volume the snapshot is for.

          o volume-size - The size of the volume, in GiB.

volume-idなんだ!('Д')VolumeIdじゃだめなんだ('Д')!←学ぶ

対象ボリュームのスナップショットを取得する。

※ちなみにAND検索をする場合するときは、--filters "Name=XXX,Values=XXX" "Name=XXX,Values=XXX"というように""で囲うみたい。
※そしてOR検索をする場合は、Valuesにカンマ(,)で追加する。
--filters Name=XXX,Values=XXX,YYY
参考

https://qiita.com/kkino1985/items/6e92e87e01f40bc06d8b
対象ボリュームのスナップショットを取得する。
$ aws ec2 describe-snapshots --filters --filters Name=volume-id,Values=vol-xxxxxxxxxx --output text

SNAPSHOTS       sanpshot test   False   012345678910    100%    snap-xxxxxxxxxx  2021-06-21T10:36:33.319Z       completed        vol-xxxxxxxxxx   8
SNAPSHOTS       sanpshot test   False   012345678910    100%    snap-xxxxxxxxxx  2021-06-20T04:09:45.656Z       completed        vol-xxxxxxxxxx   8
SNAPSHOTS       snapshot_test   False   012345678910    100%    snap-xxxxxxxxxx  2021-06-19T06:43:06.595Z       completed        vol-xxxxxxxxxx   8
SNAPSHOTS       snapshot_test   False   012345678910    100%    snap-xxxxxxxxxx  2021-06-18T03:29:47.371Z       completed        vol-xxxxxxxxxx   8
SNAPSHOTS       snapshot_test   False   012345678910    100%    snap-xxxxxxxxxx  2021-06-18T03:22:30.507Z       completed        vol-xxxxxxxxxx   8
SNAPSHOTS       snapshot_test   False   012345678910    100%    snap-xxxxxxxxxx  2021-06-17T16:30:02.038Z       completed        vol-xxxxxxxxxx   8

普通に取得してしまうと、名前、ID、サイズ、説明、ステータスなど、すべての情報が出力されてしまう。
見えにくいので必要な情報だけ出力したい。

表示項目を限定する--queryオプションを使用する。
参考

https://blog.serverworks.co.jp/aws-cli-query
--query 'XXX'

選択するキーは、スナップショットをjsonで取得するとわかりやすい。

{
    "Snapshots": [
        {
            "Description": "sanpshot test",
            "Encrypted": false,
            "OwnerId": "01234567890",
            "Progress": "100%",
            "SnapshotId": "snap-xxxxxxxxxx",
            "StartTime": "2021-06-25T11:23:24.328Z",
            "State": "completed",
            "VolumeId": "vol-xxxxxxxxxx",
            "VolumeSize": 8
        }
    ]
}

"Snapshots"項目の[]配列からのすべての出力をフィルタリングするには、ワイルドカード表記を使用する。
Snapshots[*]

その配列の中からSnapshotId,StartTimeのみ出力させたい。

スナップショットID と時刻のみ出力する。
{}→.
と表記する。
同じ位置にある絞り込みたいときのキーが複数ある時の場合は、
[XXX,XXX]
と表記する。
なので.[SnapshotId,StartTime]になる。
なので

 --query "Snapshots[*].[SnapshotId,StartTime]"

と指定する。

aws ec2 describe-snapshots --filters Name=volume-id,Values=vol-XXXXXXXXXX  --query "Snapshots[*].[SnapshotId,StartTime]" 

出力

snap-XXXXXXXXXX  2021-06-21T10:36:33.319Z
snap-XXXXXXXXXX  2021-06-20T04:09:45.656Z
snap-XXXXXXXXXX  2021-06-19T06:43:06.595Z
snap-XXXXXXXXXX  2021-06-18T03:29:47.371Z
snap-XXXXXXXXXX  2021-06-18T03:22:30.507Z
snap-XXXXXXXXXX  2021-06-17T16:30:02.038Z

■取得する日付を指定する。

スナップショットを一覧取得してみると、専用のフォーマットがあるのがわかる。

2021-06-17T16:30:02.038Z

このフォーマットに合わせて日付を指定していく。
2日より前の日で指定したいので、

date "+%Y-%m-%d" -u -d '-2 day'

で指定する。
出力

2021-06-21

ミリ秒単位まで指定したい場合は

date "+%Y-%m-%dT%H:%M:%S.%3NZ" -u -d '-2 day'

で指定する。(しなくてもOK)

■削除対象スナップショットID、スナップショット作成日時を./delete_listに一覧取得する.

sp_list

#!/bin/bash
TARGET_DATE=$(date "+%Y-%m-%d" -u -d '-2 day')

aws ec2 describe-snapshots \
  --filters Name=volume-id,Values=vol-XXXXXXXXXX \
  --region ap-northeast-1 \
  --query "Snapshots[?(StartTime<='$TARGET_DATE')].[SnapshotId,StartTime]" \
  --output text > ./sp_delete_list

例: スナップショットの経過日に基づくフィルタリング

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-describing-snapshots.html
を参考にして作成。

削除対象スナップショットを一覧取得する。

bash -ex sp_delete_list

今回削除されるスナップショットがsp_delete_listに一覧表示されるので確認する。

確認して問題なければ、sp_delete_listのスナップショットを削除する。

今回削除されるスナップショットリストはsnapshots_deletedに追記して対象スナップショットを削除します。
参考

https://qiita.com/sumomo_99/items/1ceca3e43dc390af1f99
https://orebibou.com/ja/home/201507/20150727_001/
sp_delete
#!/bin/bash
TARGET_DATE=$(date "+%Y-%m-%d" -u -d '-2 day')

# 削除するスナップショットをsnapshots_deletedに追記する
aws ec2 describe-snapshots \
  --filters Name=volume-id,Values=vol-XXXXXXXXXX \
  --region ap-northeast-1 \
  --query "Snapshots[?(StartTime<='$TARGET_DATE')].[SnapshotId,StartTime]" \
  --output text >> ./snapshots_deleted

# sp_delete_listのスナップショットを削除する
aws ec2 describe-snapshots \
  --filters Name=volume-id,Values=vol-XXXXXXXXXX \
  --region ap-northeast-1 \
  --query "Snapshots[?(StartTime<='$TARGET_DATE')].[SnapshotId]" \
  --output text | \
  xargs -I{} aws ec2 delete-snapshot \
  --snapshot-id {}

■対象スナップショットを削除する。

$ bash -ex sp_delete
++ date +%Y-%m-%d -u -d '-2 day'
+ TARGET_DATE=2021-06-19
+ aws ec2 describe-snapshots --filters Name=volume-id,Values=vol-xxxxxxxxxx --region ap-northeast-1 --query 'Snapshots[?(StartTime<='\''2021-06-19'\'')].[SnapshotId]' --output text
+ xargs '-I{}' aws ec2 delete-snapshot --snapshot-id '{}'