Lambda関数(C#)でDynamoDBにアクセスしてGetItemする方法


Lambda 関数(C#)で DynamoDB にアクセスして GetItem しようとしたのですが、やたらと苦労したのでメモを残しておきます。

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

f:id:fnyablog:20181104223615p:plain:w320

このItemIdテーブルのidキーで GetItem するには、C#では以下のように記述します。

この際、属性名称が間違っていると例外が発生するためご注意ください。

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";
          
            var request = new GetItemRequest
            {
                Key = new Dictionary<string, AttributeValue>() { { "id", new AttributeValue { S = "UserId" } } },
                TableName = tableName
            };

            var response = await client.GetItemAsync(request);

            PrintItem(response.Item);
        }

        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 関数を実行すると、以下のように Cloud Watch にログが出力され、正しく値が取得できていることが分かります。

f:id:fnyablog:20181104224155p:plain

ただ、取得した項目を出力する方法が面倒ですね。

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

docs.aws.amazon.com