web-dev-qa-db-ja.com

AWS-EC2スナップショットを作成して自動的に名前を変更するスクリプト

私は現在、次のことを行うスクリプトを(UbuntuサーバーからAWS CLIを使用して)セットアップしようとしています。

  • 既存のすべてのボリュームのスナップショットを作成します。それらのボリュームにはすでにNAMEタグがあります(SERVER1、SERVER1DATA、SERVER2、SERVER2DATAなど)。

  • 同じタグNAMESで取得したスナップショットの名前を変更します(そのため、AWSコンソールでは、日付でそれらをフィルタリングでき、簡単に識別できます)。

ここでの主な問題は自動名前変更です。

私はec2-describe-volumes、ec2-create-snapshot、ec2addtagコマンドをいじっていましたが、私のスクリプトはそれほど良くありません。これまでのところ、VOLUME NAMEとNAME TAGを使用してリストを作成することでこれを設定できました(これらのパラメーターはec2addtagによって取得されます)が、環境でボリュームを追加または削除するたびに手動でリストを更新する必要があります。

どんな助けでも大歓迎です。

4
Nicolas

私はあなたの質問を完全に理解しているとは思いませんが、名前タグとともにボリュームのリストを生成できるようにしたい場合は、次のようなものが機能する可能性があります。

aws ec2 describe-tags --query "Tags[*].{Name:Value,ResourceId:ResourceId}" --filters "Name=key,Values=Name"  --filters "Name=resource-type,Values=volume" --output json

基本的には、「Volume」タイプのすべてのリソースの「リソースIDとタグ「name」の値を教えてください。この場合、出力としてjsonを指定しました。「text」または「table "必要に応じて。

別のアプローチ:

aws ec2 describe-volumes --query "Volumes[*].{ID:VolumeId}" --output text

これにより、ボリュームのリストが返されます。これをテキストファイルにパイプ処理した場合、ファイルにはボリューム識別子のリストが1行に1つだけ含まれます。

次に、リスト内の各ボリュームのNameタグを次のように取得できます。

aws ec2 describe-tags --query "Tags[*].{Name:Value,ResourceId:ResourceId}" --filters "Name=key,Values=Name"  --filters "Name=resource-type,Values=volume" --filters "Name=resource-id,Values=vol-2e293949" --output json

これは基本的に「指定されたID vol-2e293949のリソースIDとタグ名の値を教えてください。

ご覧のとおり、CLIコマンドは読みにくく、フィルタリングとクエリは少し難しいです。 (これらの例では、AWSの最新バージョンを使用しています [〜#〜] cli [〜#〜]

5
vjones

Create-snapshotコマンドからスナップショットIDを抽出する場合は、awk/sed/grep/etcを必要とせずに実行できます。いくつかのCLI機能(クエリと出力)を使用する。

例えば:

$ SNAP_ID=`aws ec2 create-snapshot --cli-input-json file://$temp_file --query 'SnapshotId' --output text`
$
$ echo "snap id: "$SNAP_ID
snap id: snap-aaaabbbb
$
$ aws ec2 create-tags --resources $SNAP_ID --tags Key=Name,Value=$SOME_NAME
$

「テキスト」の代わりにjsonの出力を使用すると、返されたスナップショットIDはJSON標準ごとに二重引用符で囲まれます。

4
philarmour

しばらく前に私は このbashスクリプト を書いて、これを正確にやってくれました。基本的に、バックアップする各EC2インスタンスにインストールし、秘密鍵、証明書ファイル、EC2 APIツールを提供すると、インスタンスID、それに接続されているボリューム、および各ボリュームのスナップショットを作成します。

ボリュームにはNameおよびDeviceのタグを付ける必要があります。 Nameは、スナップショットの説明に表示されるわかりやすい名前です。 Deviceは、サーバー上の実際のデバイス名です。 /dev/sdf 例えば。最後に、事前定義された制限に達すると、スナップショットがローテーションされます。デフォルトは50です。51番目のスナップショットが作成されると、最も古いスナップショットが削除されます。

1
dannosaur
#!/bin/bash

aws ec2 describe-volumes --query "Volumes[*].{ID:VolumeId}" --output text > /tmp/volumes

for i in $(cat /tmp/volumes); do

aws ec2 create-snapshot --volume-id $i | awk {'print $2'} | grep snap* | sed 's/\"//g'|sed 's/\,//g' > /tmp/snapname

SNAPENAME=$(cat /tmp/snapname)

TAGNAME=$(aws ec2 describe-tags --query "Tags[*].{Name:Value,ResourceId:ResourceId}" --filters "Name=key,Values=Name" --filters "Name=resource-type,Values=volume" --filters "Name=resource-id,Values=$i" --output text | awk '{ print $1 }') 

sleep 5

aws ec2 create-tags --resources $SNAPENAME --tags Key=Name,Value=$TAGNAME >/dev/null

done

少し面倒で、おそらく不必要な長いですが、必要なことを実行します。使用可能なすべてのボリュームのスナップショットを作成し、(NAMEタグがある場合)ボリュームの名前をそれらのNAMEタグで変更します。

1
Nicolas