EC2のSnapshotのLifecyclePolicyをコピペで設定するためのあんちょこ

はじめに

EBSスナップショットのライフサイクルポリシーの作成は設定項目がそこそこ多いので、同じような内容で複数個設定しようとすると面倒だしミスも発生しやすくなります。

特に、IaC環境ではなくマネジメントコンソールで設定しなければいけない場合に大変です。 現在のお仕事先でもマネジメントコンソールを使って設定していて煩雑だったため、以降同じことをする時に楽なるようにコピペできるようなスクリプトを書いて見ました。

スクリプト

tagにサーバーのRoleが付いているという前提で、そのRoleに該当したEC2のスナップショットをデイリーで取得するようなポリシーを作る場合のスクリプトです。

# role名を書く
target_role=toraru_role

# 実際に作る
aws dlm create-lifecycle-policy \
--execution-role-arn "arn:aws:iam::$(aws sts get-caller-identity | jq -r .Account):role/service-role/AWSDataLifecycleManagerDefaultRole" \
--description "for ${target_role}" \
--state ENABLED \
--policy-details "$(cat << EOS 
{
    "ResourceTypes": [
        "INSTANCE"
    ],
    "TargetTags": [
        {
            "Key": "Role",
            "Value": "${target_role}"
        }
    ],
    "Schedules": [
        {
            "Name": "Daily ${target_role} backup",
            "CopyTags": true,
            "VariableTags": [
                {
                    "Key": "instance-id",
                    "Value": "\$(instance-id)"
                },
                {
                    "Key": "timestamp",
                    "Value": "\$(timestamp)"
                }
            ],
            "CreateRule": {
                "Interval": 24,
                "IntervalUnit": "HOURS",
                "Times": [
                    "16:00"
                ]
            },
            "RetainRule": {
                "Count": 30
            }
        }
    ],
    "Parameters": {
        "ExcludeBootVolume": false
    }
}
EOS
)"

ポイント

  • get-caller-identityを使うことでAccountIDを手動入力しなくても良いようにしています(そのためjqが使えることが前提です)
  • Shell ScriptでJSON内に変数を展開させるのは結構面倒で、試行錯誤した結果ヒアドキュメント経由が良さそうでした