Lambda関数(C#)でDynamoDBにDeleteItem(データ削除)する方法


Lambda 関数(C#)で DynamoDB にアクセスして DeleteItem (データ削除)する方法をメモしておきます。

まず、DynamoDBのItemIdというテーブルを以下のように作成します。パーティションキーはidで、_versionはキーではない属性になります。

項目は以下のように2件登録されていて、CategoryIdの項目を削除対象とします。

また、_version 属性が 1 の場合のみ削除するように条件を付与します。

f:id:fnyablog:20181112180041p:plain:w320

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 関数を実行すると、以下のログで削除前の項目が出力され、正常に削除が終了していることが分かります。

f:id:fnyablog:20181112180333p:plain:w640

DynamoDB の項目を確認すると、CotegoryId の項目が正しく削除されていることが分かります。

f:id:fnyablog:20181112180434p:plain:w320

Lambda 関数を2回実行すると、以下のように例外が発生します。NoSQL はこういうもののようですね。

f:id:fnyablog:20181112180551p:plain:w640

なお、参考にしたサイトは以下のものになります。

docs.aws.amazon.com