Cách sao chép các mục từ một DynamoDB sang một bảng DynamoDB khác bằng Python trên AWS

theanh

Administrator
Nhân viên
Bạn có thể sử dụng Python để sao chép các mục từ một bảng DynamoDB sang một bảng khác. Có thể sử dụng cùng một tập lệnh để sao chép các mục giữa các bảng DynamoDB trong các tài khoản khác nhau. Trước khi chúng ta tiến hành bài viết này, chúng tôi giả định rằng bạn đã có hiểu biết cơ bản về Python. Bạn không cần phải tự viết bất cứ thứ gì, bạn chỉ cần thực thi tập lệnh để hoàn tất thao tác sao chép. Nếu bạn cần hiểu tập lệnh và mã được viết trong đó, thì bạn cần có hiểu biết cơ bản về Python.

Bạn có thể thực thi tập lệnh này từ bất kỳ máy nào có quyền truy cập internet và cài đặt Python. Bạn cần cài đặt Python và Boto3 trên hệ thống của mình. Tập lệnh này được thử nghiệm với Python 2.7.16, bạn có thể thử với các phiên bản khác nhau có trong Python 2.7.

Dịch vụ AWS Data Pipeline cũng có thể được sử dụng để sao chép các mục từ một bảng DynamoDB sang bảng khác, nhưng đó là một quá trình hơi tẻ nhạt. Vì vậy, tôi đã tự viết tập lệnh này để đơn giản hóa nhiệm vụ.

Bây giờ, chúng ta hãy bắt đầu.

Điều kiện tiên quyết​

  1. Hiểu biết cơ bản về Python.
  2. Python 2.7.16 và Boto3 được cài đặt trên Máy chủ Linux.
  3. Tài khoản AWS (Tạo nếu bạn chưa có tài khoản).
  4. 'access_key' và 'secret_key' của Người dùng AWS IAM có đủ/đầy đủ quyền trên DynamoDB. (Nhấp vào đây để tìm hiểu cách tạo người dùng IAM với 'access_key' và 'secret_key' trên AWS, )

Chúng ta sẽ làm gì​

  1. Kiểm tra các điều kiện tiên quyết.
  2. Tạo một tập lệnh.
  3. Thực thi tập lệnh.

Kiểm tra các điều kiện tiên quyết​

Kiểm tra Python

python --version



Kiểm tra Pip

pip --version



Kiểm tra Boto3

pip show boto3


Tạo một tập lệnh​

Tạo một tệp mới với mã sau trên hệ thống cục bộ của bạn. Mã này cũng có sẵn trên Github Repo của tôi. Sau đây là liên kết đến mã trên Github.

Liên kết Github:https://github.com/shivalkarrahul/DevOps/blob/master/aws/python/aws-copy-dynamo-db-table/copy-dynamodb-table.py

Tệp:copy-dynamodb-table.py
Mã:
import boto3import osimport sysimport argparseimport datetimeglobal argsparser = argparse.ArgumentParser()parser.add_argument('-sa', '--source_aws_access_key_id', required=True, action="store", dest="source_aws_access_key_id", help="Tài khoản AWS nguồn 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="Tài khoản AWS nguồn 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="Tài khoản AWS đích aws_access_key_id", mặc định=Không có)parser.add_argument('-ds', '--destination_aws_secret_access_key', bắt buộc=Đúng, action="store", dest="destination_aws_secret_access_key", help="Tài khoản AWS đích aws_secret_access_key", mặc định=Không có)parser.add_argument('-st', '--sourceTableName', bắt buộc=Đúng, action="store", dest="sourceTableName", help="Bảng Tài khoản AWS nguồn DyanamoDB", mặc định=Không có)parser.add_argument('-dt', '--destinationTableName', bắt buộc=Đúng, action="store", dest="destinationTableName", help="Bảng Tài khoản AWS đích DyanamoDB", mặc định=Không có)args = parser.parse_args()source_aws_access_key_id = args.source_aws_access_key_idsource_aws_secret_access_key = args.source_aws_secret_access_keydestination_aws_access_key_id = args.destination_aws_access_key_iddestination_aws_secret_access_key = args.destination_aws_secret_access_keysourceTableName=args.sourceTableNamedestinationTableName=args.destinationTableNamesourceTableExists = "false"destinationTableExists = "false"print("Đang in giá trị")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 #Chỉ định tổng số mục cần sao chép tại đây, điều này hữu ích khi cần sao chép một số mục đã chỉ địnhcounter = 1 # Không thay đổi điều nàysource_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', #Chỉ định vùng tại đây aws_access_key_id=source_aws_access_key_id, #Thêm khóa truy cập tài khoản nguồn của bạn tại đây aws_secret_access_key=source_aws_secret_access_key) #Thêm khóa bí mật tài khoản nguồn của bạn tại đâydynamotargetclient = boto3.client('dynamodb', region_name='eu-west-3', #Chỉ định vùng tại đây aws_access_key_id=destination_aws_access_key_id, #Thêm khóa truy cập của tài khoản đích tại đây aws_secret_access_key=destination_aws_secret_access_key) #Thêm khóa bí mật của tài khoản đích tại đây# response = dynamotargetclient.list_tables()# print("Danh sách các bảng", response)dynamopaginator = dynamoclient.get_paginator('scan')def validateTables(sourceTable, destinationTable): print("Bên trong 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: đối với mục trong trang['Mục']: if (counter == item_count): print("exiting") sys.exit() else: print('writing item no', counter) dynamotargetclient.put_item(TableName=destinationTable, Item=item ) counter = counter + 1def backupTable(destTableName, backupTimeStamp): print("Bên trong backupTable") print("Đang sao lưu = ", destTableName) print("Tên sao lưu = ", backupTimeStamp) response = dynamotargetclient.create_backup(TableName=destTableName, BackupName=backupTimeStamp ) print("ARN sao lưu = ", response["BackupDetails"]["BackupArn"])def deleteDestinationTable(destTableName): print("Bên trong deleteDestinationTable") try: dynamotargetclient.delete_table(TableName=destTableName) wait = dynamotargetclient.get_waiter('table_not_exists') wait.wait(TableName=destTableName) print("Bảng đã xóa") except dynamotargetclient.exceptions.ResourceNotFoundException: print("Bảng không tồn tại")def doesNotExist(): print("Bên trong doesNotExist") print("Bảng đích không tồn tại ") print("Thoát khỏi thực thi") # sys.exit()def createDestinationTable(sourceTable): print("Bên trong 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("giá trị của sourceTableExists = ", result['sourceTableExists'])print("giá trị của destinationTableExists = ", result['destinationTableExists'])if (result['sourceTableExists'] == "false" ) và (result['destinationTableExists'] == "false" ): print("Cả hai bảng đều không tồn tại")elif (result['sourceTableExists'] == "false" ) và (result['destinationTableExists'] == "true" ): print("Bảng nguồn không tồn tại")elif (result['sourceTableExists'] == "true" ) và (result['destinationTableExists'] == "false" ): createDestinationTable(sourceTableName) copyTable(sourceTableName, destinationTableName, item_count, counter)elif (result['sourceTableExists'] == "true" ) và (result['destinationTableExists'] == "true" ): backupTable(destinationTableName, backupName) deleteDestinationTable(destinationTableName) createDestinationTable(sourceTableName) copyTable(sourceTableName, destinationTableName, item_count, counter)else: print("Có gì đó không ổn")
Cú pháp:

python copy-dynamodb-table.py -sa <source-account-access-key-here> -ss <source-account-secret-key-here> -da <destination-account-access-key-here> -ds <destination-account-secret-key-here> -st <source-table-name-here> -dt <destination-table-name-here>

Thực thi Script.​

Bạn có thể tham khảo cú pháp trên và truyền các đối số cho script.

Lệnh:

python copy-dynamodb-table.py -sa AKI12345IA5XJXFLMTQR -ssihiHd8+NzLJ567890z4i6EwcN6hbV2A5cMfurscg -daAKI12345IA5XJXFLMTQR -ds ihiHd8+NzLJ567890z4i6EwcN6hbV2A5cMfurscg -st my-source-table -dt my-destination-table

Tại đây,
  • -sa =Khóa truy cập tài khoản AWS nguồn =AKIAQ6GAIA5XJXFLMTQR
  • -ss =Khóa bí mật tài khoản AWS nguồn =ihiHd8+NzLJK5DFfTz4i6EwcN6hbV2A5cMfurscg
  • -da =Khóa truy cập tài khoản AWS đích =AKIAQ6GAIA5XJXFLMTQR
  • -ds =Khóa bí mật tài khoản AWS đích =ihiHd8+NzLJK5DFfTz4i6EwcN6hbV2A5cMfurscg
  • -st =Bảng nguồn =my-source-table
  • -dt =Bảng đích =my-destination-table
Bạn phải sử dụng khóa của mình, các khóa ở đây thuộc về tôi.

Tập lệnh bao gồm 4 trường hợp sử dụng khác nhau
  1. Trường hợp sử dụng 1: Cả hai bảng Nguồn và Đích đều không tồn tại.
  2. Trường hợp sử dụng 2: Bảng Nguồn không tồn tại nhưng bảng Đích tồn tại.
  3. Trường hợp sử dụng 3: Bảng Nguồn tồn tại nhưng bảng Đích không tồn tại.
  4. Trường hợp sử dụng 4: Cả hai bảng Nguồn và Đích đều tồn tại.
Chúng ta hãy xem từng trường hợp sử dụng này.

Trường hợp sử dụng 1: Cả hai bảng Nguồn và Đích đều không tồn tại.

Nếu bạn không có bảng DynamoDB trong tài khoản của mình và vẫn cố gắng thực thi script, script sẽ thoát với thông báo "Cả hai bảng đều không tồn tại".



Trường hợp sử dụng 2: Bảng nguồn không tồn tại nhưng bảng đích tồn tại.

Nếu bạn cố gắng truyền bảng không tồn tại làm bảng nguồn, script sẽ thoát với thông báo "Bảng nguồn không tồn tại".



Trường hợp sử dụng 3: Bảng nguồn tồn tại nhưng bảng đích không tồn tại.

Trong cả hai trường hợp sử dụng trên, không có thao tác nào được thực hiện. Bây giờ, nếu bạn truyền bảng nguồn tồn tại nhưng bảng đích không tồn tại, tập lệnh sẽ tạo một bảng có tên bạn chỉ định làm bảng đích và sao chép các mục từ bảng nguồn sang bảng đích mới tạo.



Trường hợp sử dụng 4: Cả bảng Nguồn và bảng Đích đều tồn tại.

Trong trường hợp này, bản sao lưu của bảng đích được thực hiện trước khi sao chép các mục từ bảng nguồn và sau đó bảng đích sẽ bị xóa. Sau khi bảng bị xóa, một bảng mới có tên bạn chỉ định trong tham số đích sẽ được tạo và sau đó các mục từ bảng nguồn sẽ được sao chép vào bảng đích mới tạo.






Kết luận​

Trong bài viết này, chúng ta đã xem tập lệnh Python để sao chép các mục từ một bảng DynamoDB sang một bảng DynamoDB khác. Tập lệnh này bao gồm bốn trường hợp sử dụng khác nhau có thể phát sinh khi sao chép các mục từ bảng này sang bảng khác. Bây giờ bạn có thể sử dụng tập lệnh này để sao chép các mục từ bảng DynamoDB này sang bảng DynamoDB khác trong cùng một tài khoản AWS hoặc khác nhau.
 
Back
Bên trên