Lambda 関数(C#)で DynamoDB にアクセスして GetItem しようとしたのですが、やたらと苦労したのでメモを残しておきます。
まず、DynamoDBのItemId
というテーブルを以下のように作成します。パーティションキーはid
で、_version
はキーではない属性になります。
この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 にログが出力され、正しく値が取得できていることが分かります。
ただ、取得した項目を出力する方法が面倒ですね。
なお、参考にしたサイトは以下のものになります。