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

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

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

2506閲覧

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

Otazoman

総合スコア44

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2018/12/10 02:26

前提・実現したいこと

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

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

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

該当のソースコード

shell

1#!/bin/bash 2export HOME=/root; 3 4PROFILE=BackUpRollName 5REGION="ap-northeast-1" 6 7## tmpディレクトリチェック 8if [ ! -e "/tmp" ];then 9 mkdir -p /tmp 10fi 11 12## 「Backup-Generation」というタグが付いている、インスタンスID,世代数(Backup-GenerationのValue)を取得 13/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 14 15while read INSTANCE_ID SEDAI_NO; do 16 if [ ! -z ${INSTANCE_ID} -a ! -z ${SEDAI_NO} ];then 17 ## AMIの数を確認 18 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` 19 20 ## Backup-GenerationのValueと現在のAMI数を比較し、現在のAMI数がBackup-GenerationのValueに達していた場合は、一番古いAMIを削除する 21 if [ ${NOW_AMI_CNT} -eq ${SEDAI_NO} ];then 22 ## 削除対象のAMI_ID取得 23 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}'` 24 25 ## AMI登録の解除 26 /usr/local/bin/aws ec2 deregister-image --profile ${PROFILE} --region ${REGION} --image-id ${DELETE_AMI_ID} 27 28 ## 削除対象のスナップショットID取得 29 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}'` 30 ## スナップショットの削除 31 /usr/local/bin/aws ec2 delete-snapshot --profile ${PROFILE} --region ${REGION} --snapshot-id ${DELETE_SNAPSHOT_ID} 32 fi 33 34 ## インスタンス名取得 35 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}'` 36 37 ## AMI作成 38 DATE=`date +%Y%m%d%H%M%S` 39 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` 40 41 sleep 2 42 43 ## AMIにタグを付けする(例: Name:amazon-linux-test-SV Backup-Type:auto) 44 /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 45 46 ## スナップショットにタグ付 47 48 fi 49done < /tmp/tmp_get_data 50 51rm -f /tmp/tmp_get_data 52 53exit 0 54 55

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

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

amibkup

1#!/bin/bash 2export HOME=/root; 3 4PROFILE="BackUpRollName" 5REGION="ap-northeast-1" 6BILLINGGROUP="BillingGroup" 7BACKUPGROUP="servername-Backup-Generation" 8 9## tmpディレクトリチェック 10if [ ! -e "/tmp" ];then 11 mkdir -p /tmp 12fi 13 14## 「Backup-Generation」というタグが付いている、インスタンスID,世代数(Backup-GenerationのValue)を取得 15/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 16 17while read INSTANCE_ID SEDAI_NO; do 18 if [ ! -z ${INSTANCE_ID} -a ! -z ${SEDAI_NO} ];then 19 ## AMIの数を確認 20 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` 21 22 ## Backup-GenerationのValueと現在のAMI数を比較し、現在のAMI数がBackup-GenerationのValueに達していた場合は、一番古いAMIを削除する 23 if [ ${NOW_AMI_CNT} -eq ${SEDAI_NO} ];then 24 ## 削除対象のAMI_ID取得 25 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}'` 26 27 ## AMI登録の解除 28 /usr/local/bin/aws ec2 deregister-image --profile ${PROFILE} --region ${REGION} --image-id ${DELETE_AMI_ID} 29 30 ## 削除対象のスナップショットID取得 31 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}'` 32 ## スナップショットの削除 33 /usr/local/bin/aws ec2 delete-snapshot --profile ${PROFILE} --region ${REGION} --snapshot-id ${DELETE_SNAPSHOT_ID} 34 fi 35 36 ## インスタンス名取得 37 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}'` 38 39 ## AMI作成 40 DATE=`date +%Y%m%d%H%M%S` 41 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` 42 43 sleep 2 44 45 ## AMIにタグを付けする(例: Name:amazon-linux-test-SV Backup-Type:auto) 46 /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} 47 48 ## スナップショットにタグ付けする 49 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` 50 /usr/local/bin/aws ec2 create-tags --profile ${PROFILE} --region ${REGION} --resources ${BKUP_SNAPSHOT_ID} --tags Key=Billing,Value=${BILLINGGROUP} 51 52 fi 53done < /tmp/tmp_get_data 54 55rm -f /tmp/tmp_get_data 56 57exit 0 58

投稿2018/12/11 01:53

Otazoman

総合スコア44

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問