C# (.NET 8) で DynamoDB に書き込む方法|Windows フォーム + AWS SDK

DynamoDB に書き込む

Visual Studio 2022 + Windows フォームアプリで AWSSDK.DynamoDBv2 を使い、C# (.NET 8) からAWS DynamoDB にデータを書き込む実装例を紹介します。

💡 AWS_ACCESS_KEY_ID などの認証情報をアプリ内でユーザー入力するケースを想定


🔰 前提条件

以下の環境を想定しています:

  • Windows 11 / 10
  • Visual Studio 2022
  • .NET 8(Windows Forms アプリ)
  • AWS IAM ユーザーのアクセスキー保有済み
  • DynamoDB テーブルが作成済み(例:MySampleTable

🛠 NuGet パッケージのインストール

まずは必要な AWS SDK パッケージをインストールしましょう。

1. AWSSDK.DynamoDBv2 の追加

Visual Studio の「ソリューションエクスプローラー」→「NuGet パッケージの管理」→「参照」タブで、以下のパッケージをインストールします:

AWSSDK.DynamoDBv2

またはパッケージマネージャーコンソールで:

Install-Package AWSSDK.DynamoDBv2

🖼 フォームのUI想定

フォームに以下の UI を設置します:

コントロールName備考
TextBoxtxtAccessKeyAWS_ACCESS_KEY_ID
TextBoxtxtSecretKeyAWS_SECRET_ACCESS_KEY
TextBoxtxtSessionTokenAWS_SESSION_TOKEN(省略可)
TextBoxtxtRegionAWS_DEFAULT_REGION
ButtonbtnRun書き込み実行ボタン

※ セキュリティ上、UseSystemPasswordChar = true 推奨

https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html


💻 実装コード例

ボタンクリックで DynamoDB に書き込む処理

using Amazon;
using Amazon.Runtime;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

private async void btnRun_Click(object sender, EventArgs e)
{
    var accessKey = txtAccessKey.Text.Trim();
    var secretKey = txtSecretKey.Text.Trim();
    var sessionToken = txtSessionToken.Text.Trim();
    var regionString = txtRegion.Text.Trim();

    if (string.IsNullOrEmpty(accessKey) || string.IsNullOrEmpty(secretKey) || string.IsNullOrEmpty(regionString))
    {
        MessageBox.Show("必要な情報が入力されていません。");
        return;
    }

    RegionEndpoint region;
    try
    {
        region = RegionEndpoint.GetBySystemName(regionString);
    }
    catch
    {
        MessageBox.Show("リージョン名が不正です。例: ap-northeast-1");
        return;
    }

    AWSCredentials credentials = string.IsNullOrEmpty(sessionToken)
        ? new BasicAWSCredentials(accessKey, secretKey)
        : new SessionAWSCredentials(accessKey, secretKey, sessionToken);

    using var client = new AmazonDynamoDBClient(credentials, region);

    var request = new PutItemRequest
    {
        TableName = "MySampleTable",
        Item = new Dictionary
        {
            { "Id", new AttributeValue { S = Guid.NewGuid().ToString() } },
            { "Name", new AttributeValue { S = "テストユーザー" } }
        }
    };

    try
    {
        var response = await client.PutItemAsync(request);
        MessageBox.Show("DynamoDB に書き込み成功!");
    }
    catch (Exception ex)
    {
        MessageBox.Show("書き込みエラー: " + ex.Message);
    }
}

AWS_ACCESS_KEY_ID 保存場所

今回の例では環境変数を使わずにアプリ内で直接渡しています
そのため .aws/credentials や OSの環境変数には保存されません。


DynamoDB テーブルが存在しないときは?

PutItemAsync 実行時に「ResourceNotFoundException」が発生します。
テーブルが存在することを事前に確認しましょう(または CreateTableAsync を使って自動作成も可能です)。


🔐 セキュリティに関しての注意

この実装では AWS 認証情報を直接テキストボックスから入力しています。本番利用時には認証情報をハードコードしたりログに出力したりしないよう注意してください。


✅ まとめ

C# (.NET 8) + Windows Forms アプリケーションから AWS DynamoDB にデータを書き込むのは、AWSSDK.DynamoDBv2 と適切なクレデンシャルクラスを使うことで簡単に実現できます。


改行・カンマを含むCSVを正しく読み込む2つの方法

DateTimeを日本時間でISO 8601形式に変換する方法

ファイルから重複行を削除する2つの方法

Node.js DynamoDB 全レコード Scan コード例

Node.js DynamoDB 全レコード Scan コード例

Node.jsを使って、 AWSDynamoDB テーブル内をスキャンする

予め、 npm init を完了させて 下↓のコマンドで aws-sdk を インストールしておきます。

npm install aws-sdk

下のコードは シンプルな Scan コード例です

const aws = require('aws-sdk');
const tableName = "テーブル名"
let dynamoDB = new aws.DynamoDB.DocumentClient({
    region: 'ap-northeast-1'
})
let DynamoDBScanAll = async () => {
    return await dynamoDB.scan({TableName: tableName}).promise()
}

Promise.all([DynamoDBScanAll()]).then((threadList) => {
    threadList.forEach(scanAllRes => {
        let res = JSON.stringify(scanAllRes.Items)
        console.log(res)
    })
})

上記コードの場合 「1 回の Scan リクエストで、最大 1 MB のデータを取得」 なので 全件数を 取得できません。

テーブル内の全レコード Scan する場合の コード例

下↓の コード例は、 LastEvaluatedKey == nullになるまで ループし スキャンを続けます。

const aws = require('aws-sdk');
const tableName = "テーブル名"
let dynamoDB = new aws.DynamoDB.DocumentClient({
    region: 'ap-southeast-2'
})
let DynamoDBScanAll = async () => {
    let ScanAll = []
    let LastEvaluatedKey = null;
    let loop = true
    try{
        while(loop){ //ループ開始
            let scanRes = {};
            let param = {TableName: tableName, ExclusiveStartKey: LastEvaluatedKey};
            scanRes = await dynamoDB.scan(param).promise() //スキャン実行
            ScanAll = ScanAll.concat(scanRes.Items) //配列結合
            LastEvaluatedKey =  (scanRes['LastEvaluatedKey'] != null) ? scanRes['LastEvaluatedKey'] : null
            if (LastEvaluatedKey == null) //LastEvaluatedKeyがnullならループ終了
                loop = false
            else
                console.log(JSON.stringify(LastEvaluatedKey))
        }
    
    } catch(e){
        console.log(e)
    }
    return ScanAll
}

Promise.all([DynamoDBScanAll()]).then((threadList) => {
    threadList.forEach(scanAllRes => {
        let res = JSON.stringify(scanAllRes)
        console.log(res)
    })
})

2回目以降のスキャンは、 scanパラメータに ExclusiveStartKeyを含め処理します。

dotnet 6.0 macOS DynamoDBテーブル Describe取得

dotnet 6.0 macOS DynamoDBテーブル Describe取得

.NET6 C#を使って、 DynamoDB テーブルの詳細情報を取得します。

dotnet new console の後、 nugetからAWSSDK.DynamoDBv2パッケージをAddします。

dotnet add package AWSSDK.DynamoDBv2 --version 3.7.3.26

パッケージ内のDescribeTableAsync()を使えば、 テーブルの詳細情報を取り出せます。

DynamoDB上に「test-table」テーブルを作成

DynamoDB テーブル作成

パーティションキー = partition-num
ソートキー = sort-moji

このDynamoDBで作成したテーブルの詳細情報を.NET6 C#を使って取り出します

using Amazon;
using Amazon.DynamoDBv2;

var dynamodb = new AmazonDynamoDBClient("アクセスキー","シークレット", RegionEndpoint.APNortheast1);
try{
    var describeTask = dynamodb.DescribeTableAsync("test-table");
    var describe = describeTask.Result;
    Console.WriteLine("テーブルARN={0}",describe.Table.TableArn);
    foreach (var att in describe.Table.AttributeDefinitions){
        Console.WriteLine("AttributeDefinition KeyName={0} Type={1}",att.AttributeName,att.AttributeType.Value);            
    }
    Console.WriteLine("テーブル作成日={0}", describe.Table.CreationDateTime.ToString());
    Console.WriteLine("総レコード={0}", describe.Table.ItemCount);
    Console.WriteLine("TableSizeBytes={0}", describe.Table.TableSizeBytes);
} catch(Exception _e){
    Console.WriteLine(_e);
}

実行結果

テーブルの、 作成日・総レコード数・テーブルの サイズなども取得できています