2017-08-09 2 views
1

現在、自動化されたEBSスナップショットをBashスクリプトからPython Boto3に移行しています。元のBashシェルでは、スクリプトは、以下ちょうど一行た:実行中のインスタンスに対してのみBoto3でEBSスナップショットを取る方法は?

ec2-describe-instances --filter "instance-state-code=16" | grep "vol-" | awk '{print $3}' | xargs -n 1 -t ec2-create-snapshot -d "automated daily backup" 

インスタンス状態コード16実行中のEC2インスタンスを指します。私はBoto3を初めて使用していますが、私はどこからでもボリュームをスナップショットにすることができますが、EBSボリュームで何も変更されていないにもかかわらず、停止したインスタンスは毎晩スナップショットになります。

+0

* "EBSボリュームで何も変更されていないにもかかわらず、毎晩スナップショットがスナップショットになります。" *価値のあることに注意してください。スナップショットが保存されている場合、未使用ボリュームのスナップショットも追加費用はかかりません。同じボリュームのスナップショットは保存前に重複排除されるため、変更されていないボリュームの連続スナップショットを作成しても新しいスナップショットデータは保存されません。同様の理由で、これらのスナップショットも非常に迅速に完了することがわかります。 –

答えて

2

boto3を使用すると、実行中のインスタンスのみを取得するec2リソース用にa filterを作成できます。結果のインスタンスのリストから、それぞれのインスタンスを繰り返し処理し、block_device_mappingsをチェックします。

上記の辞書からボリュームIDを取得できます。さて、あなたがする必要があるのはcreate a snapshotです。

ラフコードは次のようになります。

ec2 = boto3.resource('ec2') 
for instance in ec2.instances.filter(
    Filters=[{ 
     'Name': "instance-state-name", 
     'Values': ["running"] 
    }] 
): 
    for device in instance.block_device_mappings: 
     ec2.create_snapshot(VolumeId=device.get('Ebs').get('VolumeId')) 
0

これはあなたのbotoの質問に答えていないが、私はあなたが古いスタイルのコマンドラインインターフェイスを使用しています注意してください。最近、いくつかの優れた機能を持つAWS Command-Line Interface (CLI)を使用することをお勧めします。

たとえば、このコマンドは、インスタンスに接続されているすべてのEBSボリュームのボリュームIDが一覧表示されます:

aws ec2 describe-instances --query Reservations[*].Instances[*].BlockDeviceMappings[*].Ebs.VolumeId --filter Name=instance-state-name,Values=running --output text 

aws ec2 describe-instances --query Reservations[*].Instances[*].BlockDeviceMappings[*].Ebs.VolumeId --output text 

あなただけにフィルタを追加することができランニングのインスタンスを表示次にに入れてのボリュームをスナップショットする別のコマンドを実行すると、インスタンス:

aws ec2 create-snapshot --volume-id `aws ec2 describe-instances --query Reservations[*].Instances[*].BlockDeviceMappings[*].Ebs.VolumeId --filter Name=instance-state-name,Values=running --output text` 

奇妙なawk/grepコマンドは必要ありません!

関連する問題