Lambda 関数(C#)で DynamoDB にアクセスして DeleteItem (データ削除)する方法をメモしておきます。
まず、DynamoDBのItemIdというテーブルを以下のように作成します。パーティションキーはidで、_versionはキーではない属性になります。
項目は以下のように2件登録されていて、CategoryIdの項目を削除対象とします。
また、_version 属性が 1 の場合のみ削除するように条件を付与します。
Lambda 関数(C#)で DeleteItem するには、以下のように記述します。
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.Model; using Amazon.Lambda.Core; [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))] namespace AWSLambda1 { public class Function { public async Task FunctionHandler(object input, ILambdaContext context) { AmazonDynamoDBClient client = new AmazonDynamoDBClient(); string tableName = "ItemId"; try { var request = new DeleteItemRequest { TableName = tableName, Key = new Dictionary<string, AttributeValue>() { { "id", new AttributeValue() { S = "CategoryId" } } }, ExpressionAttributeNames = new Dictionary<string, string>() { { "#v", "_version" } }, ExpressionAttributeValues = new Dictionary<string, AttributeValue>() { { ":version", new AttributeValue() { N = "1" } } }, // 条件式 ConditionExpression = "#v = :version", // Return the entire item as it appeared before the update. ReturnValues = "ALL_OLD" }; var response = await client.DeleteItemAsync(request); var attributeList = response.Attributes; PrintItem(attributeList); Console.WriteLine("Task completed."); } catch (Exception e) { Console.WriteLine(e.Message); } } private void PrintItem(Dictionary<string, AttributeValue> attributeList) { Console.WriteLine("************************************************"); foreach (KeyValuePair<string, AttributeValue> kvp in attributeList) { string attributeName = kvp.Key; AttributeValue value = kvp.Value; Console.WriteLine( attributeName + " " + (value.S == null ? "" : "S=[" + value.S + "]") + (value.N == null ? "" : "N=[" + value.N + "]") + (value.SS == null ? "" : "SS=[" + string.Join(",", value.SS.ToArray()) + "]") + (value.NS == null ? "" : "NS=[" + string.Join(",", value.NS.ToArray()) + "]") ); } Console.WriteLine("************************************************"); } } }
この Lambda 関数を実行すると、以下のログで削除前の項目が出力され、正常に削除が終了していることが分かります。
DynamoDB の項目を確認すると、CotegoryId の項目が正しく削除されていることが分かります。
Lambda 関数を2回実行すると、以下のように例外が発生します。NoSQL はこういうもののようですね。
なお、参考にしたサイトは以下のものになります。