ShellScript
AWS
aws-cli

AWSのインスタンスをバックアップする

More than 1 year has passed since last update.

AWSのインスタンスのバックアップを取ろうと思い、
下記参考サイトのスクリプトを実行したところ正常に動かなかったので一部修正しました。

jqをインストールしています。

#!/bin/sh

# インスタンスIDを取得
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)

# バックアップ対象のインスタンス名
INSTANCE_NAME="インスタンス名"

# 本日の日付
DATE_CURRENT=`date +%Y-%m-%d`

# 本日の日時
TIME_CURRENT=`date +%Y%m%d%H%M`

# 何日後に削除するか
PURGE_AFTER_DAYS=3

# ↑のタイムスタンプ
PURGE_AFTER=`date -d +${PURGE_AFTER_DAYS}days -u +%Y-%m-%d`

#バックアップを作成する
AMI_ID=`aws ec2 create-image --instance-id ${INSTANCE_ID} --name "${INSTANCE_NAME}_${TIME_CURRENT}" --no-reboot  | jq '.ImageId' | sed 's/"//g'`

# AMIを検索するためのタグを作成する
aws ec2 create-tags --resources ${AMI_ID} --tags Key=Name,Value="${INSTANCE_NAME}" Key=PurgeAllow,Value=true Key=PurgeAfter,Value=$PURGE_AFTER

# タグを条件にして削除可能なバックアップを検索する
AMI_PURGE_ALLOWED=`aws ec2 describe-tags --filters "Name=resource-type,Values=image" "Name=key,Values=PurgeAllow" | jq '.Tags[].ResourceId' | sed 's/"//g'`

for AMI_ID in ${AMI_PURGE_ALLOWED}; do
  PURGE_AFTER_DATE=`aws ec2 describe-tags --filters "Name=resource-type,Values=image" "Name=resource-id,Values=${AMI_ID}" "Name=key,Values=PurgeAfter" | jq '.Tags[].Value' | sed 's/"//g'`

  if [ -n ${PURGE_AFTER_DATE} ]; then
    DATE_CURRENT_EPOCH=`date -d ${DATE_CURRENT} +%s`
    PURGE_AFTER_DATE_EPOCH=`date -d ${PURGE_AFTER_DATE} +%s`

    if [[ ${PURGE_AFTER_DATE_EPOCH} < ${DATE_CURRENT_EPOCH} ]]; then
      # タグを見て削除対象か判定を行い、対象であればバックアップを削除する
      aws ec2 deregister-image --image-id ${AMI_ID}

      SNAPSHOT_ID=`aws ec2 describe-images --image-ids ${AMI_ID} | jq '.Images[].BlockDeviceMappings[].Ebs.SnapshotId' | sed 's/"//g'`
      aws ec2 delete-snapshot --snapshot-id ${SNAPSHOT_ID}
    fi
  fi
done

参考サイト

https://dev.classmethod.jp/cloud/aws/aws-shellscript-summary/#toc-2
AMIとEBSのバックアップを作成する
AMIのバックアップの取得