AWS CLIを使用してEC2のバックアップを定期的に取得する

AWS CLIjqを使用した実装です。
設定した世代数分保持して古いバックアップから消していきます。

設定値 説明
MAX_IMAGE_NUM バックアップのイメージを保持する世代数
INSTANCE_ID バックアップを取得する対象のEC2インスタンスID
AMI_NAME 取得するAMIの名前。実行毎に重複しないようにする
DESCRIPTION バックアップの種類を識別するために使用します

cronやJenkinsのジョブに設定して定期的に実行します。
再起動を許容する場合は--no-rebootオプションを外します。
EBS付きのインスタンスは追加のオプションが必要なので注意。

#!/bin/sh
MAX_IMAGE_NUM=2
REGION=ap-northeast-1
INSTANCE_ID=i-00000000
AMI_NAME=ec2-backup-$(date +%m%d%H%M)
DESCRIPTION="daily_backup"

IMAGES=$(aws ec2 describe-images\
  --region ap-northeast-1\
  --owners self\
  --filters Name=description,Values=$DESCRIPTION\
  | jq .Images)

# Delete oldest image
if [[ $(echo $IMAGES | jq length) -ge $MAX_IMAGE_NUM ]]; then
  OLDEST_IMAGE_ID=$(echo $IMAGES | jq 'min_by(.CreationDate)' | jq -r .ImageId)
  echo "Delete: $OLDEST_IMAGE_ID"
  aws ec2 deregister-image\
    --region $REGION\
    --image-id $OLDEST_IMAGE_ID
fi

# Create image
echo "Create: $AMI_NAME"
aws ec2 create-image\
  --region ap-northeast-1\
  --instance-id $INSTANCE_ID\
  --name $AMI_NAME\
  --no-reboot\
  --description $DESCRIPTION

exit 0