コミートム合同会社

コミートム合同会社

DynamoDBからデータをまとめて消す

AppSync BatchDelete DynamoDB 1. DynamoDB 2. DynamoDB 3. DynamoDB AppSync API 4. AppSync BatchDelete.5 BatchDelete AppSync API 6. AppSync 7. Python BatchDelete This post describes how to use AppSync's BatchDelete to delete specific large amounts of data from a DynamoDB table. Here are the steps1. Create a DynamoDB table.2. Write data to the DynamoDB table.3. Create an AppSync API from the DynamoDB table.4. Add a policy to the AppSync role to enable BatchDelete.5. Set BatchDelete to the AppSync API.6. Check the operation on the AppSync console.7. Call BatchDelete from Python.
by JanitorAug 19, 2023
DynamoDBからデータをまとめて消す方法です。下の図のように、AppSyncのBatchDeleteを使っています。既存のDyanamoDBからAppSyncのAPIを作成してBatchDeleteの設定を行い、pythonのThreadからそのBatchDeleteを呼び出します。既存のDynamoDBのレコードを大量に消す必要がある方の参考になれば幸いです。
DynamoDBからデータをまとめて消す方法です。下の図のように、AppSyncのBatchDeleteを使っています。既存のDyanamoDBからAppSyncのAPIを作成してBatchDeleteの設定を行い、pythonのThreadからそのBatchDeleteを呼び出します。既存のDynamoDBのレコードを大量に消す必要がある方の参考になれば幸いです。

Jump Links

1.DynamoDBテーブル作成(すでにある方は不要です)
2.DynamoDBにデータを書き込み(すでにある方は不要です)
3.AppSyncを作成
4.AppSyncにポリシーを追加
5.AppSyncにBatchDeleteを設定
6.AppSyncのコンソールで動作確認
7.PythonからBatchDeleteを呼ぶ
8.おわりに
1.DynamoDBテーブル作成(すでにある方は不要です)
1.DynamoDBテーブル作成(すでにある方は不要です)
下記コマンドでテーブル作成を行いました。
下記コマンドでテーブル作成を行いました。
コマンドプロンプト aws dynamodb create-table ^ --table-name existingTable ^ --attribute-definitions ^ AttributeName=id,AttributeType=S ^ --key-schema ^ AttributeName=id,KeyType=HASH ^ --billing-mode PAY_PER_REQUEST
コマンドプロンプト aws dynamodb create-table ^ --table-name existingTable ^ --attribute-definitions ^ AttributeName=id,AttributeType=S ^ --key-schema ^ AttributeName=id,KeyType=HASH ^ --billing-mode PAY_PER_REQUEST
2.DynamoDBにデータを書き込み(すでにある方は不要です)
2.DynamoDBにデータを書き込み(すでにある方は不要です)
下記のスクリプトを作成してデータを1000件書き込んでいます。書き込んでいるデータはidとdataのみで、dataには1~100までのランダムな数値をセットしています。後でまとめて削除する際に、dataが25より小さいレコードのみまとめて削除します。
下記のスクリプトを作成してデータを1000件書き込んでいます。書き込んでいるデータはidとdataのみで、dataには1~100までのランダムな数値をセットしています。後でまとめて削除する際に、dataが25より小さいレコードのみまとめて削除します。
putItems.py import json import uuid import boto3 import numpy as np db = boto3.client( 'dynamodb' ) def main(): randomNums = np.random.randint( 1, 100, 1000 ) for randomNum in randomNums: partitionId = uuid.uuid4() data = db.put_item( TableName = 'existingTable', Item = { 'id':{ 'S': str( partitionId ) }, 'data': { 'N': str( randomNum ) } } ) if __name__ == '__main__': main()
putItems.py import json import uuid import boto3 import numpy as np db = boto3.client( 'dynamodb' ) def main(): randomNums = np.random.randint( 1, 100, 1000 ) for randomNum in randomNums: partitionId = uuid.uuid4() data = db.put_item( TableName = 'existingTable', Item = { 'id':{ 'S': str( partitionId ) }, 'data': { 'N': str( randomNum ) } } ) if __name__ == '__main__': main()
3.AppSyncを作成
3.AppSyncを作成
DynamoDBからAppSyncのGraphqlを作成していきます。 AppSync -> APIを作成 -> GraphQL APIs、DynamoDBからインポートを選択 -> DynamoDBテーブル名で既存のテーブルを選択 -> フィールドの設定のように進めることができます。
DynamoDBからAppSyncのGraphqlを作成していきます。 AppSync -> APIを作成 -> GraphQL APIs、DynamoDBからインポートを選択 -> DynamoDBテーブル名で既存のテーブルを選択 -> フィールドの設定のように進めることができます。
4.AppSyncにポリシーを追加
4.AppSyncにポリシーを追加
下記のURLに記載されているように、BatchDeleteができるようにポリシーを作成してAppSyncのロールにアタッチします。 https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/tutorial-dynamodb-batch.html AppSyncのロールは作成したAppSync -> Data soucesから確認し、そのロールにポリシーを追加します。
下記のURLに記載されているように、BatchDeleteができるようにポリシーを作成してAppSyncのロールにアタッチします。 https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/tutorial-dynamodb-batch.html AppSyncのロールは作成したAppSync -> Data soucesから確認し、そのロールにポリシーを追加します。
5.AppSyncにBatchDeleteを設定
5.AppSyncにBatchDeleteを設定
スキーマを修正してリゾルバーをアタッチします。ここも参考URL通りで、テーブル名を変更するくらいで済みです。Cognitoの認証が入る場合は、リクエストマッピングテンプレートに多少追記が入りますが、今回の場合はAPIKeyを使うため不要となっています。
スキーマを修正してリゾルバーをアタッチします。ここも参考URL通りで、テーブル名を変更するくらいで済みです。Cognitoの認証が入る場合は、リクエストマッピングテンプレートに多少追記が入りますが、今回の場合はAPIKeyを使うため不要となっています。
6.AppSyncのコンソールで動作確認
6.AppSyncのコンソールで動作確認
AppSync -> 作成したAppSyncのAPI -> クエリの画面で、リストから「Mutation」を選択して「+」を押すと、設定したBatchDeleteが出てきます。試しに3件ほど消してみて正しく設定されていることを確認します。
AppSync -> 作成したAppSyncのAPI -> クエリの画面で、リストから「Mutation」を選択して「+」を押すと、設定したBatchDeleteが出てきます。試しに3件ほど消してみて正しく設定されていることを確認します。
7.PythonからBatchDeleteを呼ぶ
7.PythonからBatchDeleteを呼ぶ
下のようなスクリプトを作成しました。やっていることは、 ・dataが25より小さいデータを取得 ・そのレコードのidを取得 ・25件づつスレッドから削除リクエストを送っています。
下のようなスクリプトを作成しました。やっていることは、 ・dataが25より小さいデータを取得 ・そのレコードのidを取得 ・25件づつスレッドから削除リクエストを送っています。
callBatchDelete.py import boto3 from boto3.dynamodb.conditions import Attr import requests import queue import threading from string import Template dynamoDB = boto3.resource("dynamodb") appSyncEndPoint = "エンドポイントURL" appSyncApiKey = "APIキー" def threadFunc( que ): idsValue = que.get() t = Template('mutation MyMutation { batchDeleteExistingTable( ids: [ ${ids} ] ) { id } }') headers = { 'Content-Type': 'application/graphql', 'x-api-key': appSyncApiKey } response = requests.post( appSyncEndPoint, json = { "query": t.substitute( ids = idsValue ) }, headers = headers) print( response ) que.task_done() def main(): table = dynamoDB.Table( "existingTable" ) response = table.scan( FilterExpression = Attr( 'data' ).lt( 25 ) ) delItems = response.get( 'Items', [] ) print( "Batch delete item num: ", len( delItems ) ) que = queue.Queue() delItemids = [ item.get( 'id' ) for item in delItems ] batchLimit = 24 for i in range( 0, len( delItemids ), batchLimit ): idArr = delItemids[ i: i + batchLimit ] queArg = "" for id in idArr: queArg = queArg + '"' + id + '",' que.put( queArg ) for _ in range( que.qsize() ): thread = threading.Thread( target = threadFunc, args = ( que, ) ) thread.start() que.join() if __name__ == '__main__': main()
callBatchDelete.py import boto3 from boto3.dynamodb.conditions import Attr import requests import queue import threading from string import Template dynamoDB = boto3.resource("dynamodb") appSyncEndPoint = "エンドポイントURL" appSyncApiKey = "APIキー" def threadFunc( que ): idsValue = que.get() t = Template('mutation MyMutation { batchDeleteExistingTable( ids: [ ${ids} ] ) { id } }') headers = { 'Content-Type': 'application/graphql', 'x-api-key': appSyncApiKey } response = requests.post( appSyncEndPoint, json = { "query": t.substitute( ids = idsValue ) }, headers = headers) print( response ) que.task_done() def main(): table = dynamoDB.Table( "existingTable" ) response = table.scan( FilterExpression = Attr( 'data' ).lt( 25 ) ) delItems = response.get( 'Items', [] ) print( "Batch delete item num: ", len( delItems ) ) que = queue.Queue() delItemids = [ item.get( 'id' ) for item in delItems ] batchLimit = 24 for i in range( 0, len( delItemids ), batchLimit ): idArr = delItemids[ i: i + batchLimit ] queArg = "" for id in idArr: queArg = queArg + '"' + id + '",' que.put( queArg ) for _ in range( que.qsize() ): thread = threading.Thread( target = threadFunc, args = ( que, ) ) thread.start() que.join() if __name__ == '__main__': main()
8.おわりに
8.おわりに
responseが200を返してきていれば成功です。1回目の実行では、200 ~ 300件の削除アイテムがあるかと思いますが、2回目の実行では0になっているのではないでしょうか。
responseが200を返してきていれば成功です。1回目の実行では、200 ~ 300件の削除アイテムがあるかと思いますが、2回目の実行では0になっているのではないでしょうか。

DynamoDBからデータをまとめて消す

AppSync BatchDelete DynamoDB 1. DynamoDB 2. DynamoDB 3. DynamoDB AppSync API 4. AppSync BatchDelete.5 BatchDelete AppSync API 6. AppSync 7. Python BatchDelete This post describes how to use AppSync's BatchDelete to delete specific large amounts of data from a DynamoDB table. Here are the steps1. Create a DynamoDB table.2. Write data to the DynamoDB table.3. Create an AppSync API from the DynamoDB table.4. Add a policy to the AppSync role to enable BatchDelete.5. Set BatchDelete to the AppSync API.6. Check the operation on the AppSync console.7. Call BatchDelete from Python.
by JanitorAug 19, 2023
DynamoDBからデータをまとめて消す方法です。下の図のように、AppSyncのBatchDeleteを使っています。既存のDyanamoDBからAppSyncのAPIを作成してBatchDeleteの設定を行い、pythonのThreadからそのBatchDeleteを呼び出します。既存のDynamoDBのレコードを大量に消す必要がある方の参考になれば幸いです。
DynamoDBからデータをまとめて消す方法です。下の図のように、AppSyncのBatchDeleteを使っています。既存のDyanamoDBからAppSyncのAPIを作成してBatchDeleteの設定を行い、pythonのThreadからそのBatchDeleteを呼び出します。既存のDynamoDBのレコードを大量に消す必要がある方の参考になれば幸いです。

Jump Links

1.DynamoDBテーブル作成(すでにある方は不要です)
2.DynamoDBにデータを書き込み(すでにある方は不要です)
3.AppSyncを作成
4.AppSyncにポリシーを追加
5.AppSyncにBatchDeleteを設定
6.AppSyncのコンソールで動作確認
7.PythonからBatchDeleteを呼ぶ
8.おわりに
1.DynamoDBテーブル作成(すでにある方は不要です)
1.DynamoDBテーブル作成(すでにある方は不要です)
下記コマンドでテーブル作成を行いました。
下記コマンドでテーブル作成を行いました。
コマンドプロンプト aws dynamodb create-table ^ --table-name existingTable ^ --attribute-definitions ^ AttributeName=id,AttributeType=S ^ --key-schema ^ AttributeName=id,KeyType=HASH ^ --billing-mode PAY_PER_REQUEST
コマンドプロンプト aws dynamodb create-table ^ --table-name existingTable ^ --attribute-definitions ^ AttributeName=id,AttributeType=S ^ --key-schema ^ AttributeName=id,KeyType=HASH ^ --billing-mode PAY_PER_REQUEST
2.DynamoDBにデータを書き込み(すでにある方は不要です)
2.DynamoDBにデータを書き込み(すでにある方は不要です)
下記のスクリプトを作成してデータを1000件書き込んでいます。書き込んでいるデータはidとdataのみで、dataには1~100までのランダムな数値をセットしています。後でまとめて削除する際に、dataが25より小さいレコードのみまとめて削除します。
下記のスクリプトを作成してデータを1000件書き込んでいます。書き込んでいるデータはidとdataのみで、dataには1~100までのランダムな数値をセットしています。後でまとめて削除する際に、dataが25より小さいレコードのみまとめて削除します。
putItems.py import json import uuid import boto3 import numpy as np db = boto3.client( 'dynamodb' ) def main(): randomNums = np.random.randint( 1, 100, 1000 ) for randomNum in randomNums: partitionId = uuid.uuid4() data = db.put_item( TableName = 'existingTable', Item = { 'id':{ 'S': str( partitionId ) }, 'data': { 'N': str( randomNum ) } } ) if __name__ == '__main__': main()
putItems.py import json import uuid import boto3 import numpy as np db = boto3.client( 'dynamodb' ) def main(): randomNums = np.random.randint( 1, 100, 1000 ) for randomNum in randomNums: partitionId = uuid.uuid4() data = db.put_item( TableName = 'existingTable', Item = { 'id':{ 'S': str( partitionId ) }, 'data': { 'N': str( randomNum ) } } ) if __name__ == '__main__': main()
3.AppSyncを作成
3.AppSyncを作成
DynamoDBからAppSyncのGraphqlを作成していきます。 AppSync -> APIを作成 -> GraphQL APIs、DynamoDBからインポートを選択 -> DynamoDBテーブル名で既存のテーブルを選択 -> フィールドの設定のように進めることができます。
DynamoDBからAppSyncのGraphqlを作成していきます。 AppSync -> APIを作成 -> GraphQL APIs、DynamoDBからインポートを選択 -> DynamoDBテーブル名で既存のテーブルを選択 -> フィールドの設定のように進めることができます。
4.AppSyncにポリシーを追加
4.AppSyncにポリシーを追加
下記のURLに記載されているように、BatchDeleteができるようにポリシーを作成してAppSyncのロールにアタッチします。 https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/tutorial-dynamodb-batch.html AppSyncのロールは作成したAppSync -> Data soucesから確認し、そのロールにポリシーを追加します。
下記のURLに記載されているように、BatchDeleteができるようにポリシーを作成してAppSyncのロールにアタッチします。 https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/tutorial-dynamodb-batch.html AppSyncのロールは作成したAppSync -> Data soucesから確認し、そのロールにポリシーを追加します。
5.AppSyncにBatchDeleteを設定
5.AppSyncにBatchDeleteを設定
スキーマを修正してリゾルバーをアタッチします。ここも参考URL通りで、テーブル名を変更するくらいで済みです。Cognitoの認証が入る場合は、リクエストマッピングテンプレートに多少追記が入りますが、今回の場合はAPIKeyを使うため不要となっています。
スキーマを修正してリゾルバーをアタッチします。ここも参考URL通りで、テーブル名を変更するくらいで済みです。Cognitoの認証が入る場合は、リクエストマッピングテンプレートに多少追記が入りますが、今回の場合はAPIKeyを使うため不要となっています。
6.AppSyncのコンソールで動作確認
6.AppSyncのコンソールで動作確認
AppSync -> 作成したAppSyncのAPI -> クエリの画面で、リストから「Mutation」を選択して「+」を押すと、設定したBatchDeleteが出てきます。試しに3件ほど消してみて正しく設定されていることを確認します。
AppSync -> 作成したAppSyncのAPI -> クエリの画面で、リストから「Mutation」を選択して「+」を押すと、設定したBatchDeleteが出てきます。試しに3件ほど消してみて正しく設定されていることを確認します。
7.PythonからBatchDeleteを呼ぶ
7.PythonからBatchDeleteを呼ぶ
下のようなスクリプトを作成しました。やっていることは、 ・dataが25より小さいデータを取得 ・そのレコードのidを取得 ・25件づつスレッドから削除リクエストを送っています。
下のようなスクリプトを作成しました。やっていることは、 ・dataが25より小さいデータを取得 ・そのレコードのidを取得 ・25件づつスレッドから削除リクエストを送っています。
callBatchDelete.py import boto3 from boto3.dynamodb.conditions import Attr import requests import queue import threading from string import Template dynamoDB = boto3.resource("dynamodb") appSyncEndPoint = "エンドポイントURL" appSyncApiKey = "APIキー" def threadFunc( que ): idsValue = que.get() t = Template('mutation MyMutation { batchDeleteExistingTable( ids: [ ${ids} ] ) { id } }') headers = { 'Content-Type': 'application/graphql', 'x-api-key': appSyncApiKey } response = requests.post( appSyncEndPoint, json = { "query": t.substitute( ids = idsValue ) }, headers = headers) print( response ) que.task_done() def main(): table = dynamoDB.Table( "existingTable" ) response = table.scan( FilterExpression = Attr( 'data' ).lt( 25 ) ) delItems = response.get( 'Items', [] ) print( "Batch delete item num: ", len( delItems ) ) que = queue.Queue() delItemids = [ item.get( 'id' ) for item in delItems ] batchLimit = 24 for i in range( 0, len( delItemids ), batchLimit ): idArr = delItemids[ i: i + batchLimit ] queArg = "" for id in idArr: queArg = queArg + '"' + id + '",' que.put( queArg ) for _ in range( que.qsize() ): thread = threading.Thread( target = threadFunc, args = ( que, ) ) thread.start() que.join() if __name__ == '__main__': main()
callBatchDelete.py import boto3 from boto3.dynamodb.conditions import Attr import requests import queue import threading from string import Template dynamoDB = boto3.resource("dynamodb") appSyncEndPoint = "エンドポイントURL" appSyncApiKey = "APIキー" def threadFunc( que ): idsValue = que.get() t = Template('mutation MyMutation { batchDeleteExistingTable( ids: [ ${ids} ] ) { id } }') headers = { 'Content-Type': 'application/graphql', 'x-api-key': appSyncApiKey } response = requests.post( appSyncEndPoint, json = { "query": t.substitute( ids = idsValue ) }, headers = headers) print( response ) que.task_done() def main(): table = dynamoDB.Table( "existingTable" ) response = table.scan( FilterExpression = Attr( 'data' ).lt( 25 ) ) delItems = response.get( 'Items', [] ) print( "Batch delete item num: ", len( delItems ) ) que = queue.Queue() delItemids = [ item.get( 'id' ) for item in delItems ] batchLimit = 24 for i in range( 0, len( delItemids ), batchLimit ): idArr = delItemids[ i: i + batchLimit ] queArg = "" for id in idArr: queArg = queArg + '"' + id + '",' que.put( queArg ) for _ in range( que.qsize() ): thread = threading.Thread( target = threadFunc, args = ( que, ) ) thread.start() que.join() if __name__ == '__main__': main()
8.おわりに
8.おわりに
responseが200を返してきていれば成功です。1回目の実行では、200 ~ 300件の削除アイテムがあるかと思いますが、2回目の実行では0になっているのではないでしょうか。
responseが200を返してきていれば成功です。1回目の実行では、200 ~ 300件の削除アイテムがあるかと思いますが、2回目の実行では0になっているのではないでしょうか。
© 2023 - Comytom LLC