Boto3 не копирует снимок в другие регионы, другие варианты? - PullRequest
0 голосов
/ 18 мая 2018

[Очень плохо знакомы с AWS]

Привет,

Я пытаюсь переместить копии снимков томов EBS по регионам.Я пытался использовать Boto3 для перемещения снимков.Моя цель - ежедневно перемещать последний снимок из региона us-east-2 в регион us-east-1.

Я использовал команду aws configure в терминале, чтобы установить свои учетные данные безопасности и установить для региона значение us-east-2.

Я использую pandas для получения самого последнего идентификатора снимка, используя этот код:

import boto3
import pandas as pd
from pandas.io.json.normalize import nested_to_record    
import boto.ec2


    client = boto3.client('ec2')
    aws_api_response = client.describe_snapshots(OwnerIds=['self'])
    flat = nested_to_record(aws_api_response)
    df = pd.DataFrame.from_dict(flat)
    df= df['Snapshots'].apply(pd.Series)
    insert_snap = df.loc[df['StartTime'] == max(df['StartTime']),'SnapshotId']
    insert_snap = insert_snap.reset_index(drop=True)

insert_snap возвращает идентификатор снимка, например, snap-1234ABCD

Iя пытаюсь использовать этот код для перемещения снимка с us-east-2 на u s-east-1:

client.copy_snapshot(SourceSnapshotId='%s' %insert_snap[0],
                     SourceRegion='us-east-2',
                     DestinationRegion='us-east-1',
                     Description='This is my copied snapshot.')

Снимок копируется в том же регионе с использованием вышеуказанной строки.

Я также пытался переключать регионы с помощью команды aws configure в терминале, с той же проблемой, возникающей при копировании снимка в том же регионе.

В Boto3 есть ошибка, которая пропускает целевой параметр в коде copy_snapshot().Информация найдена здесь: https://github.com/boto/boto3/issues/886

Я пытался вставить этот код с помощью лямбда-менеджера, но постоянно получаю сообщение об ошибке "errorMessage": "Unable to import module 'lambda_function'":

region = 'us-east-2'
ec = boto3.client('ec2',region_name=region)

def lambda_handler(event, context):
    response=ec.copy_snapshot(SourceSnapshotId='snap-xxx',
                     SourceRegion=region,
                     DestinationRegion='us-east-1',
                     Description='copied from Ohio')
    print (response)

У меня нет вариантов, что я могусделать для автоматизации передачи снимков в aws?

1 Ответ

0 голосов
/ 19 мая 2018

Согласно CopySnapshot - Amazon Elastic Compute Cloud :

CopySnapshot отправляет копию снимка в региональную конечную точку, которую вы отправляете HTTP-запросом на ,например, ec2.us-east-1.amazonaws.com (в CLI AWS это указывается параметром --region или регионом по умолчанию в вашем файле конфигурации AWS).

Поэтому вам следует отправить команду copy_snapshot()на us-east-1, с исходным регионом на us-east-2.

Если вы хотите переместить самый последний снимок, вы можете выполнить:

import boto3

SOURCE_REGION = 'us-east-2'
DESTINATION_REGION = 'us-east-1'

# Connect to EC2 in Source region
source_client = boto3.client('ec2', region_name=SOURCE_REGION)

# Get a list of all snapshots, then sort them
snapshots = source_client.describe_snapshots(OwnerIds=['self'])
snapshots_sorted = sorted([(s['SnapshotId'], s['StartTime']) for s in snapshots['Snapshots']], key=lambda k: k[1])
latest_snapshot = snapshots_sorted[-1][0]

print ('Latest Snapshot ID is ' + latest_snapshot)

# Connect to EC2 in Destination region
destination_client = boto3.client('ec2', region_name=DESTINATION_REGION)

# Copy the snapshot
response = destination_client.copy_snapshot(
    SourceSnapshotId=latest_snapshot,
    SourceRegion=SOURCE_REGION,
    Description='This is my copied snapshot'
    )

print ('Copied Snapshot ID is ' + response['SnapshotId'])
...