質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.61%

AMIのバックアップでスナップショットにもタグを付けたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,252

Otazoman

score 43

前提・実現したいこと

EC2で起動したサーバについて日次でAMIイメージを取得するバックアップスクリプトで
AMIイメージを取得しようとしています。ほぼ下記のサイトのままでスクリプトを準備しました。

https://web-pencil.com/blog/auto_ami_backup/

但し、AMI取得時に生成されたスナップショットにタグが付いていない状態なので
スナップショットにタグを付けたいと考えております。どの様にすればAMI生成された際に作成されるスナップショットにタグを付けることができるでしょうか。いい方法が思いつかないのでご教示いただけますでしょうか。

該当のソースコード

#!/bin/bash
export HOME=/root;

PROFILE=BackUpRollName
REGION="ap-northeast-1"

## tmpディレクトリチェック
if [ ! -e "/tmp" ];then
        mkdir -p /tmp
fi

## 「Backup-Generation」というタグが付いている、インスタンスID,世代数(Backup-GenerationのValue)を取得
/usr/local/bin/aws ec2 describe-tags --profile ${PROFILE} --region ${REGION} --filters "Name=tag-key,Values=ServerName-Backup-Generation" | awk '{print $3" "$5}' > /tmp/tmp_get_data

while read INSTANCE_ID SEDAI_NO; do
    if [ ! -z ${INSTANCE_ID}  -a ! -z ${SEDAI_NO} ];then
        ## AMIの数を確認
        NOW_AMI_CNT=`/usr/local/bin/aws ec2 describe-images --profile ${PROFILE} --region ${REGION} --filters Name=tag-key,Values=Backup-Type Name=tag-value,Values=auto --query 'sort_by(Images[].{YMD:CreationDate,Name:Name,ImageId:ImageId,DESC:Description},&YMD)' | grep "${INSTANCE_ID}" | wc -l`

        ## Backup-GenerationのValueと現在のAMI数を比較し、現在のAMI数がBackup-GenerationのValueに達していた場合は、一番古いAMIを削除する
        if [ ${NOW_AMI_CNT} -eq ${SEDAI_NO} ];then
            ## 削除対象のAMI_ID取得
            DELETE_AMI_ID=`/usr/local/bin/aws ec2 describe-images --profile ${PROFILE} --region ${REGION} --filters Name=tag-key,Values=Backup-Type Name=tag-value,Values=auto --query 'sort_by(Images[].{YMD:CreationDate,Name:Name,ImageId:ImageId,DESC:Description},&YMD)' | grep "${INSTANCE_ID}" | head -1 | awk '{print $4}'`

            ## AMI登録の解除
            /usr/local/bin/aws ec2 deregister-image --profile ${PROFILE} --region ${REGION} --image-id ${DELETE_AMI_ID}

            ## 削除対象のスナップショットID取得
            DELETE_SNAPSHOT_ID=`/usr/local/bin/aws ec2 describe-snapshots --profile ${PROFILE} --region ${REGION} --filters Name=description,Values=*${DELETE_AMI_ID}* --query 'Snapshots[*].{ID:SnapshotId}'`
            ## スナップショットの削除
            /usr/local/bin/aws ec2 delete-snapshot --profile ${PROFILE} --region ${REGION} --snapshot-id ${DELETE_SNAPSHOT_ID}
        fi

        ## インスタンス名取得
        INSTANCE_NAME=`/usr/local/bin/aws ec2 describe-tags --profile ${PROFILE} --region ${REGION} --filters "Name=tag-key,Values=Name" | grep "${INSTANCE_ID}" | awk '{print $5}'`

        ## AMI作成
        DATE=`date +%Y%m%d%H%M%S`
        CREATE_AMI_ID=`/usr/local/bin/aws ec2 create-image --profile ${PROFILE} --region ${REGION} --instance-id ${INSTANCE_ID} --name "${INSTANCE_NAME}_${DATE}" --description "Create from ${INSTANCE_ID}" --no-reboot`

        sleep 2

        ## AMIにタグを付けする(例:  Name:amazon-linux-test-SV   Backup-Type:auto)
        /usr/local/bin/aws ec2 create-tags --profile ${PROFILE} --region ${REGION} --resources ${CREATE_AMI_ID} --tags Key=Name,Value=${INSTANCE_NAME} Key=Backup-Type,Value=auto Key=Billing,Value=BillingGroupName

       ## スナップショットにタグ付

    fi
done < /tmp/tmp_get_data

rm -f /tmp/tmp_get_data

exit 0
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

何とか自己解決しまいました。質問しておいて申し訳ありません。
書き方が冗長なので、いい書き方があればご教示いただけるとありがたいです。

#!/bin/bash
export HOME=/root;

PROFILE="BackUpRollName"
REGION="ap-northeast-1"
BILLINGGROUP="BillingGroup"
BACKUPGROUP="servername-Backup-Generation"

## tmpディレクトリチェック
if [ ! -e "/tmp" ];then
        mkdir -p /tmp
fi

## 「Backup-Generation」というタグが付いている、インスタンスID,世代数(Backup-GenerationのValue)を取得
/usr/local/bin/aws ec2 describe-tags --profile ${PROFILE} --region ${REGION} --filters "Name=tag-key,Values=${BACKUPGROUP}" | awk '{print $3" "$5}' > /tmp/tmp_get_data

while read INSTANCE_ID SEDAI_NO; do
    if [ ! -z ${INSTANCE_ID}  -a ! -z ${SEDAI_NO} ];then
        ## AMIの数を確認
        NOW_AMI_CNT=`/usr/local/bin/aws ec2 describe-images --profile ${PROFILE} --region ${REGION} --filters Name=tag-key,Values=Backup-Type Name=tag-value,Values=auto --query 'sort_by(Images[].{YMD:CreationDate,Name:Name,ImageId:ImageId,DESC:Description},&YMD)' | grep "${INSTANCE_ID}" | wc -l`

        ## Backup-GenerationのValueと現在のAMI数を比較し、現在のAMI数がBackup-GenerationのValueに達していた場合は、一番古いAMIを削除する
        if [ ${NOW_AMI_CNT} -eq ${SEDAI_NO} ];then
            ## 削除対象のAMI_ID取得
            DELETE_AMI_ID=`/usr/local/bin/aws ec2 describe-images --profile ${PROFILE} --region ${REGION} --filters Name=tag-key,Values=Backup-Type Name=tag-value,Values=auto --query 'sort_by(Images[].{YMD:CreationDate,Name:Name,ImageId:ImageId,DESC:Description},&YMD)' | grep "${INSTANCE_ID}" | head -1 | awk '{print $4}'`

            ## AMI登録の解除
            /usr/local/bin/aws ec2 deregister-image --profile ${PROFILE} --region ${REGION} --image-id ${DELETE_AMI_ID}

            ## 削除対象のスナップショットID取得
            DELETE_SNAPSHOT_ID=`/usr/local/bin/aws ec2 describe-snapshots --profile ${PROFILE} --region ${REGION} --filters Name=description,Values=*${DELETE_AMI_ID}* --query 'Snapshots[*].{ID:SnapshotId}'`
            ## スナップショットの削除
            /usr/local/bin/aws ec2 delete-snapshot --profile ${PROFILE} --region ${REGION} --snapshot-id ${DELETE_SNAPSHOT_ID}
        fi

        ## インスタンス名取得
        INSTANCE_NAME=`/usr/local/bin/aws ec2 describe-tags --profile ${PROFILE} --region ${REGION} --filters "Name=tag-key,Values=Name" | grep "${INSTANCE_ID}" | awk '{print $5}'`

        ## AMI作成
        DATE=`date +%Y%m%d%H%M%S`
        CREATE_AMI_ID=`/usr/local/bin/aws ec2 create-image --profile ${PROFILE} --region ${REGION} --instance-id ${INSTANCE_ID} --name "${INSTANCE_NAME}_${DATE}" --description "Create from ${INSTANCE_ID}" --no-reboot`

        sleep 2

        ## AMIにタグを付けする(例:  Name:amazon-linux-test-SV   Backup-Type:auto)
        /usr/local/bin/aws ec2 create-tags --profile ${PROFILE} --region ${REGION} --resources ${CREATE_AMI_ID} --tags Key=Name,Value=${INSTANCE_NAME} Key=Backup-Type,Value=auto Key=Billing,Value=${BILLINGGROUP}

       ## スナップショットにタグ付けする
       BKUP_SNAPSHOT_ID=`/usr/local/bin/aws ec2 describe-images --profile ${PROFILE} --region ${REGION} --filter "Name=tag:Name,Values=${INSTANCE_NAME}" --query="Images[].[BlockDeviceMappings[].Ebs[].[SnapshotId]]" --output=text`
      /usr/local/bin/aws ec2 create-tags --profile ${PROFILE} --region ${REGION} --resources ${BKUP_SNAPSHOT_ID} --tags Key=Billing,Value=${BILLINGGROUP}

    fi
done < /tmp/tmp_get_data

rm -f /tmp/tmp_get_data

exit 0

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る