GNU/Linux >> Belajar Linux >  >> Linux

Cara menyalin item dari satu DynamoDB ke tabel DynamoDB lain menggunakan Python di AWS

Anda dapat menggunakan Python untuk menyalin item dari satu tabel DynamoDB ke tabel lainnya. Skrip yang sama dapat digunakan untuk menyalin item antara tabel DynamoDB di akun yang berbeda. Sebelum kita melanjutkan dengan artikel ini, diasumsikan bahwa Anda memiliki pemahaman dasar tentang Python. Anda tidak perlu menulis apa pun sendiri, Anda hanya perlu menjalankan skrip untuk menyelesaikan operasi penyalinan. Jika Anda perlu memahami skrip dan kode yang tertulis di dalamnya, maka Anda harus memiliki pemahaman dasar tentang Python.

Anda dapat menjalankan skrip ini dari mesin apa pun dengan akses ke internet dan Python yang terpasang di dalamnya. Anda harus menginstal Python dan Boto3 di sistem Anda. Skrip ini diuji dengan Python 2.7.16, Anda dapat mencoba dengan berbagai versi yang tersedia di Python 2.7.

Layanan AWS Data Pipeline juga dapat digunakan untuk menyalin item dari satu tabel DynamoDB ke tabel DynamoDB lainnya, tetapi itu adalah proses yang sedikit membosankan. Jadi, saya menulis skrip ini sendiri untuk menyederhanakan tugas.

Sekarang, mari kita mulai.

Prasyarat

  1. Pemahaman dasar tentang Python.
  2. Python 2.7.16 dan Boto3 diinstal pada Server Linux.
  3. Akun AWS (Buat jika Anda belum memilikinya).
  4. 'access_key' &'secret_key' dari Pengguna AWS IAM dengan izin yang memadai/penuh pada DynamoDB. (Klik di sini untuk belajar membuat pengguna IAM dengan 'access_key' &'secret_key' di AWS, )

Apa yang akan kita lakukan

  1. Periksa Prasyarat.
  2. Buat Skrip.
  3. Jalankan Skrip.

Periksa Prasyarat

Periksa Python

python --versi

Periksa Pip

pip --versi

Periksa Boto3

pip tampilkan boto3

Buat Skrip

Buat file baru dengan kode berikut di sistem lokal Anda. Kode ini juga tersedia di Repo Github saya. Berikut adalah tautan ke kode di Github.

Tautan Github: https://github.com/shivalkarrahul/DevOps/blob/master/aws/python/aws-copy-dynamo-db-table/copy-dynamodb-table.py

File: copy-dynamodb-table.py

import boto3
import os
import sys
import argparse
import datetime


global args
parser = argparse.ArgumentParser()

parser.add_argument('-sa', '--source_aws_access_key_id', required=True, action="store", dest="source_aws_access_key_id",
                    help="Source AWS Account aws_access_key_id", default=None)
parser.add_argument('-ss', '--source_aws_secret_access_key', required=True, action="store", dest="source_aws_secret_access_key",
                    help="Source AWS Account aws_secret_access_key", default=None)
parser.add_argument('-da', '--destination_aws_access_key_id', required=True, action="store", dest="destination_aws_access_key_id",
                    help="Destination AWS Account aws_access_key_id", default=None)
parser.add_argument('-ds', '--destination_aws_secret_access_key', required=True, action="store", dest="destination_aws_secret_access_key",
                    help="Destination AWS Account aws_secret_access_key", default=None)
parser.add_argument('-st', '--sourceTableName', required=True, action="store", dest="sourceTableName",
                    help="Source AWS Account DyanamoDB Table", default=None)
parser.add_argument('-dt', '--destinationTableName', required=True, action="store", dest="destinationTableName",
                    help="Destination AWS Account DyanamoDB Table", default=None) 
args = parser.parse_args()                                                                                                                       

source_aws_access_key_id = args.source_aws_access_key_id
source_aws_secret_access_key = args.source_aws_secret_access_key

destination_aws_access_key_id = args.destination_aws_access_key_id
destination_aws_secret_access_key = args.destination_aws_secret_access_key


sourceTableName=args.sourceTableName 
destinationTableName=args.destinationTableName 

sourceTableExists = "false" 
destinationTableExists = "false" 

print("Printing values")
print("source_aws_access_key_id", source_aws_access_key_id)
print("source_aws_secret_access_key", source_aws_secret_access_key)
print("destination_aws_access_key_id", destination_aws_access_key_id)
print("destination_aws_secret_access_key", destination_aws_secret_access_key)
print("sourceTableName", sourceTableName)
print("destinationTableName", destinationTableName)


timeStamp = datetime.datetime.now()
backupName = destinationTableName + str(timeStamp.strftime("-%Y_%m_%d_%H_%M_%S"))

item_count = 1000 #Specify total number of items to be copied here, this helps when a specified number of items need to be copied
counter = 1 # Don't not change this

source_session = boto3.Session(region_name='eu-west-3', aws_access_key_id=source_aws_access_key_id, aws_secret_access_key=source_aws_secret_access_key)
source_dynamo_client = source_session.client('dynamodb')

target_session = boto3.Session(region_name='eu-west-3', aws_access_key_id=destination_aws_access_key_id, aws_secret_access_key=destination_aws_secret_access_key)
target_dynamodb = target_session.resource('dynamodb')


dynamoclient = boto3.client('dynamodb', region_name='eu-west-3', #Specify the region here
    aws_access_key_id=source_aws_access_key_id,  #Add you source account's access key here
    aws_secret_access_key=source_aws_secret_access_key) #Add you source account's secret key here

dynamotargetclient = boto3.client('dynamodb', region_name='eu-west-3', #Specify the region here
    aws_access_key_id=destination_aws_access_key_id, #Add you destination account's access key here
    aws_secret_access_key=destination_aws_secret_access_key) #Add you destination account's secret key here
# response = dynamotargetclient.list_tables()
# print("List of tables", response)

dynamopaginator = dynamoclient.get_paginator('scan')

def validateTables(sourceTable, destinationTable):
    print("Inside validateTables")
    try:
        dynamoclient.describe_table(TableName=sourceTable)
        sourceTableExists = "true"
    except dynamotargetclient.exceptions.ResourceNotFoundException:
        sourceTableExists = "false"


    try:
        dynamotargetclient.describe_table(TableName=destinationTable)
        destinationTableExists = "true"
    except dynamotargetclient.exceptions.ResourceNotFoundException:
        destinationTableExists = "false"
    
    return {'sourceTableExists': sourceTableExists, 'destinationTableExists':destinationTableExists}        



def copyTable(sourceTable, destinationTable,item_count,counter):
    
    print("Inside copyTable")
    print("Coping", sourceTable, "to", destinationTable)

    print('Start Reading the Source Table')
    try:
            dynamoresponse = dynamopaginator.paginate(
            TableName=sourceTable,
            Select='ALL_ATTRIBUTES',
            ReturnConsumedCapacity='NONE',
            ConsistentRead=True
        )
    except dynamotargetclient.exceptions.ResourceNotFoundException:
        print("Table does not exist")
        print("Exiting")
        sys.exit()

    print('Finished Reading the Table')
    print('Proceed with writing to the Destination Table')
    print("Writing first", item_count , "items" )
    print(dynamoresponse)
    for page in dynamoresponse:
        for item in page['Items']:
            if (counter ==  item_count):
                print("exiting")
                sys.exit()
            else:      
                print('writing item no', counter)
                dynamotargetclient.put_item(
                    TableName=destinationTable,
                    Item=item
                    )   
            counter = counter + 1

def backupTable(destTableName, backupTimeStamp):
    print("Inside backupTable")
    print("Taking backup of = ", destTableName)
    print("Backup Name = ", backupTimeStamp)

    response = dynamotargetclient.create_backup(
        TableName=destTableName,
        BackupName=backupTimeStamp
    )
    print("Backup ARN =", response["BackupDetails"]["BackupArn"])

def deleteDestinationTable(destTableName):
    print("Inside deleteDestinationTable")
    try:
        dynamotargetclient.delete_table(TableName=destTableName)
        waiter = dynamotargetclient.get_waiter('table_not_exists')
        waiter.wait(TableName=destTableName)
        print("Table deleted")
    except dynamotargetclient.exceptions.ResourceNotFoundException:
        print("Table does not exist")


def doesNotExist():
    print("Inside doesNotExist")
    print("Destination table does not exist ")
    print("Exiting the execution")
    # sys.exit()

def createDestinationTable(sourceTable):
    print("Inside createDestinationTable")
    source_table = source_session.resource('dynamodb').Table(sourceTable)

    target_table = target_dynamodb.create_table(
    TableName=destinationTableName,
    KeySchema=source_table.key_schema,
    AttributeDefinitions=source_table.attribute_definitions,
    ProvisionedThroughput={
        'ReadCapacityUnits': 5,
        'WriteCapacityUnits': 5
    })

    target_table.wait_until_exists()
    target_table.reload()


result = validateTables(sourceTableName, destinationTableName)
print("value of sourceTableExists = ", result['sourceTableExists'])
print("value of destinationTableExists = ", result['destinationTableExists'])

if (result['sourceTableExists'] == "false" ) and (result['destinationTableExists'] == "false" ):
    print("Both the tables do not exist")

elif (result['sourceTableExists'] == "false" ) and (result['destinationTableExists'] == "true" ):
    print("Source Table does not exist")

elif (result['sourceTableExists'] == "true" ) and (result['destinationTableExists'] == "false" ):
    createDestinationTable(sourceTableName)
    copyTable(sourceTableName, destinationTableName, item_count, counter)

elif (result['sourceTableExists'] == "true" ) and (result['destinationTableExists'] == "true" ):
    backupTable(destinationTableName, backupName)
    deleteDestinationTable(destinationTableName)

    createDestinationTable(sourceTableName)
    copyTable(sourceTableName, destinationTableName, item_count, counter)

else:
    print("Something is wrong")

Sintaks: 

python copy-dynamodb-table.py -sa -ss -da -ds -st -dt

Jalankan Script.

Anda dapat merujuk ke sintaks di atas dan meneruskan argumen ke skrip.

Perintah:

python copy-dynamodb-table.py -sa AKI12345IA5XJXFLMTQR -ss ihiHd8+NzLJ567890z4i6EwcN6hbV2A5cMfurscg -da AKI12345IA5XJXFLMTQR -ds  ihiHd8+NzLJ567890 my

Di sini,

  • -sa =Sumber Kunci Akses Akun AWS = AKIAQ6GAIA5XJXFLMTQR
  • -ss = Sumber Rahasia Akun AWS key = ihiHd8+NzLJK5DFfTz4i6EwcN6hbV2A5cMfurscg
  • -da = Tujuan AWS Account Access key = AKIAQ6GAIA5XJXFLMTQR
  • -ds = Tujuan Rahasia Akun AWS key = ihiHd8+NzLJK5DFfTz4i6EwcN6hbV2A5cMfurscg
  • -st = Tabel Sumber = tabel-sumber-saya
  • -dt = Tabel Tujuan = meja-tujuan-saya

Anda harus menggunakan kunci Anda, kunci di sini adalah milik saya.

Skrip mencakup 4 kasus penggunaan yang berbeda

  1. Kasus penggunaan 1:Kedua tabel, Sumber dan Tujuan, tidak ada.
  2. Kasus penggunaan 2: Tabel sumber tidak ada tetapi tabel Tujuan ada.
  3. Kasus penggunaan 3: Tabel sumber ada tetapi tabel Tujuan tidak ada.
  4. Kasus penggunaan 4:Baik tabel, Sumber dan Tujuan, ada.

Mari kita lihat kasus penggunaan ini satu per satu.

Use-case 1:Kedua tabel, Sumber dan Tujuan, tidak ada.

Jika Anda tidak memiliki tabel DynamoDB di akun Anda dan masih mencoba menjalankan skrip, skrip akan keluar dengan pesan "Kedua tabel tidak ada".

Kasus penggunaan 2: Tabel sumber tidak ada tetapi tabel Tujuan ada.

Jika Anda mencoba melewati tabel yang tidak ada sebagai tabel sumber, skrip akan keluar dengan pesan "Tabel Sumber tidak ada".

Kasus penggunaan 3: Tabel sumber ada tetapi tabel Tujuan tidak ada.

Dalam kedua kasus penggunaan di atas, tidak ada operasi yang dilakukan. Sekarang, jika Anda meneruskan tabel sumber yang ada tetapi tabel tujuan tidak ada, skrip akan membuat tabel dengan nama yang Anda tentukan sebagai tabel tujuan dan menyalin item dari tabel sumber ke tabel tujuan yang baru dibuat.

Use-case 4:Baik tabel, Sumber dan Tujuan, ada.

Dalam skenario ini, cadangan tabel tujuan diambil sebelum menyalin item dari tabel sumber, lalu tabel tujuan dihapus. Setelah tabel dihapus, tabel baru dengan nama yang Anda tentukan di parameter tujuan dibuat dan kemudian item dari tabel sumber disalin ke tabel tujuan yang baru dibuat.

Kesimpulan

Dalam artikel ini, kita melihat skrip Python untuk menyalin item dari satu tabel DynamoDB ke Tabel DynamoDB lainnya. Script mencakup empat kasus penggunaan berbeda yang dapat muncul saat menyalin item dari satu tabel ke tabel lainnya. Anda sekarang dapat menggunakan skrip ini untuk menyalin item dari satu tabel DynamoDB ke tabel lain di akun AWS yang sama atau berbeda.


Linux
  1. Cara Menemukan dan Menyalin Jenis File Tertentu Dari Satu Direktori Ke Direktori Lain Di Linux

  2. Bagaimana Cara Menyalin Pengaturan Dari Satu Mesin Ke Mesin Lainnya?

  3. Salin N-baris Terakhir Dari Satu File Ke File Lain?

  1. Cara menyalin atau mengkloning izin dari satu file ke file lain di Linux

  2. Bagaimana cara menghentikan proses dari Python menggunakan pid?

  3. Bagaimana cara meneruskan port dari satu mesin ke mesin lainnya?

  1. Cara mengunduh File dari server SFTP Menggunakan skrip python

  2. Cara menyalin tabel dari satu database mysql ke database mysql lainnya

  3. Bagaimana cara menyalin 10 file terbaru teratas dari satu direktori ke direktori lain?