索引(名前順)

Bedrock

最終更新日:2025/08/17

まだまだ情報収集中なので参考程度で・・・

パッケージ

作成したエージェントを呼び出して使う場合は、「AWSSDK.BedrockAgentRuntime」を使用する。
エージェント自体を作成したりするのは多分「AWSSDK.BedrockAgent」の方。

・NuGet
NuGet Gallery | AWSSDK.BedrockAgentRuntime
https://www.nuget.org/packages/AWSSDK.BedrockAgentRuntime/

using Amazon.BedrockAgentRuntime;

エージェント操作

クライアント

クライアントから操作するので生成する。

AmazonBedrockAgentRuntimeClient bedrockAgentClient;
AmazonBedrockAgentRuntimeConfig bedrockAgentConfig = new()
{
    RegionEndpoint = Amazon.RegionEndpoint.APNortheast1
};
bedrockAgentClient = new AmazonBedrockAgentRuntimeClient(bedrockAgentConfig);

呼び出し

とりあえずソースから。

InvokeAgentRequest request = new()
{
    AgentId = "12345",
    AgentAliasId = "ABCDE",
    SessionId = "new-session-2025-08-17-001",
    InputText = "AWSについて教えてください。"
};

using InvokeAgentResponse invokeAgent = await bedrockAgentClient.InvokeAgentAsync(request);

StringBuilder outputText = new();
invokeAgent.Completion.ChunkReceived += (sender, e) =>
{
    outputText.Append(Encoding.UTF8.GetString(e.EventStreamEvent.Bytes.ToArray()));
};

await invokeAgent.Completion.StartProcessingAsync();

return outputText.ToString();

・InvokeAgentRequest
呼び出し用のパラメータ。
「AgentId」はエージェント自体のIDを、「AgentAliasId」にはそのエージェントで作成したエイリアスのIDを設定する。

bedrock_01.png

bedrock_02.png

「SessionId」は会話を識別するID、同じものを指定すればエージェントが過去の会話の履歴を拾ってくれる・・・と思う。(試してないw)
「InputText」はエージェントへの入力文字列。

・bedrockAgentClient.InvokeAgentAsync
エージェントを呼び出すための準備。
このタイミングではエージェントの処理は行われない。

・invokeAgent.Completion.ChunkReceived
チャンク受信イベント。
このイベントにエージェントからの出力が返される。
ChatGPTとかみたいに一定の文字の塊で順々に返ってくるので、上の例ではそのまま結合している。

・invokeAgent.Completion.StartProcessingAsync
これを呼び出すことで実際にエージェントが処理される。
エージェントの処理が完了すると、非同期処理が完了する。

リンク

公式ガイド・・・だけど現状JSしかない。

・AWS SDKs を使用する Amazon Bedrock エージェントのコード例
https://docs.aws.amazon.com/ja_jp/code-library/latest/ug/bedrock-agent_code_examples.html

プレリリースだけどMicrosoftが提供しているパッケージ。
正式リリースになったら試したい。

・セマンティック カーネル BedrockAgent の探索
https://learn.microsoft.com/ja-jp/semantic-kernel/frameworks/agent/agent-types/bedrock-agent?pivots=programming-language-csharp


メインページに戻る


DynamoDB

最終更新日:2025/08/17

NoSQLのテーブル設計って難しいよね

パッケージ

「AWSSDK.DynamoDBv2」を使用する。

・NuGet
NuGet Gallery | AWSSDK.DynamoDBv2
https://www.nuget.org/packages/AWSSDK.DynamoDBv2/

このページで使用するパッケージは以下の2つ。

using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DataModel;

操作用クラス

クライアント

クライアントは様々な操作ができるが、マッピングはなし。
このページではクライアントでの操作方法はないので、知りたい人は公式ガイドを見てね。

AmazonDynamoDBClient dynamoDBClient;
AmazonDynamoDBConfig dynamoDBConfig = new()
{
    RegionEndpoint = Amazon.RegionEndpoint.APNortheast1,
};
dynamoDBClient = new(dynamoDBConfig);

コンテキスト

クライアントに比べてできることは限られているが、マッピングをやってくれる。
やることが読み書きぐらいであれば、コンテキストを使用したほうが楽。

DynamoDBContext dynamoDBContext;
dynamoDBContext = new DynamoDBContextBuilder()
    .WithDynamoDBClient(() => dynamoDBClient)
    .Build();

マッピング

コンテキストによるマッピング用のクラスの作り方。
基本的には属性でテーブルと合うように指定するだけ。
属性や型の詳しい解説は公式ガイドを見てね。

・.NET オブジェクト永続性モデルと DynamoDB の使用
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DotNetSDKHighLevel.html

・.NET オブジェクト永続性モデルからの DynamoDB 属性
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DeclarativeTagsList.html

よく使う属性

・DynamoDBTable属性
対象のテーブル名を指定

・DynamoDBHashKey属性
パーティションキーを指定

・DynamoDBRangeKey属性
ソートキーを指定

・DynamoDBProperty属性
上記以外の項目属性を指定

クラス例

下記のテーブルのマッピング用クラスを作る。
テーブル名は映ってないけど「inventory_table」で定義してある。
dynamodb_01.png

・InventoryTable.cs

[DynamoDBTable("inventory_table")]
public record InventoryTable
{

    [DynamoDBHashKey("item_location")]
    public required string Location { get; set; }

    [DynamoDBRangeKey("item_id")]
    public required string ID { get; set; }

    [DynamoDBProperty("item_name")]
    public required string Name { get; set; }

    [DynamoDBProperty("item_quantity")]
    public required int Quantity { get; set; }

    [DynamoDBProperty("item_history")]
    public List<HistoryInfo> History { get; set; } = [];

}

public record HistoryInfo
{

    [DynamoDBProperty("history_registered_at")]
    public required DateTime RegisteredAt { get; set; }

    [DynamoDBProperty("history_remark")]
    public required string Remark { get; set; }

}

データ読み込み

パーティションキー指定

パーティションキーを指定して読み込む。

IEnumerable<T> items = await dynamoDBContext
    .QueryAsync<T>("パーティションキー")
    .GetRemainingAsync();

パーティションキーとソートキー指定

パーティションキーとソートキーを指定して読み込む。

T item = await dynamoDBContext.LoadAsync<T>("パーティションキー", "ソートキー");

任意の項目属性を指定

Scanはコストが高いからオススメしないよ!
また、指定する項目属性はテーブル上での名称ではなく、マッピングしたクラスの名称を指定すること。
下記であればテーブル上では「item_name」だけど、マッピングしたクラスでは「Name」で定義してあるので、「Name」を指定する必要がある。

// ↓こっちの名称じゃなくて
[DynamoDBProperty("item_name")]
public required string Name { get; set; }
// ↑こっちの名称
List<ScanCondition> conditions =
[
    new("Name", ScanOperator.Equal, "みかん")
];
IEnumerable<T> items = await dynamoDBContext
    .ScanAsync<T>(conditions)
    .GetRemainingAsync();

データ書き込み

単一書き込み

await dynamoDBContext.SaveAsync<T>(item);

複数書き込み(トランザクションあり)

複数のデータをまとめて書き込む場合はこちら。

ITransactWrite<T> transactWrite = dynamoDBContext.CreateTransactWrite<T>();
transactWrite.AddSaveItems(items);
await transactWrite.ExecuteAsync();

データ削除

単一削除

await dynamoDBContext.DeleteAsync<T>(item);

複数削除(トランザクションあり)

複数のデータをまとめて削除する場合はこちら。

ITransactWrite<T> transactWrite = dynamoDBContext.CreateTransactWrite<T>();
transactWrite.AddDeleteItems(items);
await transactWrite.ExecuteAsync();

リンク

公式ガイド

・.NET コード例
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/CodeSamples.DotNet.html


メインページに戻る


Lambda

最終更新日:2025/08/17

ちょっとした処理から複雑なワークフローまで

プロジェクトテンプレート追加

Visual Studioで使用できるプロジェクトのテンプレートを追加する。
なくても大丈夫だけど、あったほうが便利。

dotnet new install Amazon.Lambda.Templates

追加すると新しいプロジェクトの作成でLambda用のプロジェクトテンプレートが選択できるようになる。
lambda_01.png

Lambda用プロジェクトテンプレート選択後に入力する追加情報は、AWS CLIで設定したプロファイルとデプロイするリージョンを入力する。
後で設定できるので入力しなくても大丈夫。

lambda_02.png

こんな感じのプロジェクトが作成される。
lambda_03.png

・Readme.md
デプロイ手順とか書いてある。

・Function.cs
ラムダ関数本体。

・aws-lambda-tools-defaults.json
デプロイするとき用の設定ファイル。
プロジェクト作成時に入力していなかったら、このファイルを修正する。

デプロイ方法

プロジェクトテンプレートで作成した場合、ご丁寧にReadMeにデプロイ方法が書いてある。
下記はプロジェクト名を「Project1」で作成した場合のやり方。

cd "Project1/src/Project1"
dotnet lambda deploy-function

ソースフォルダに移動して、デプロイコマンド打つだけ、かんたん!
・・・なんだけど、初回はラムダ関数名やIAMロールを入力しないといけないので、先にAWSマネジメントコンソール上で作ったほうが楽。

lambda_04.png

2回目以降は、先程のデプロイコマンドに関数名を付ければOK。
下記はラムダ関数名を「myProjectFuntion1」で作ったときのコマンド。

dotnet lambda deploy-function myProjectFuntion1

コード

プロジェクトテンプレートで「Lambda Empty Function」を選んだ場合、下記のソースが自動生成される。

・Function.cs

using Amazon.Lambda.Core;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace Project1
{
    public class Function
    {

        /// <summary>
        /// A simple function that takes a string and does a ToUpper
        /// </summary>
        /// <param name="input">The event for the Lambda function handler to process.</param>
        /// <param name="context">The ILambdaContext that provides methods for logging and describing the Lambda environment.</param>
        /// <returns></returns>
        public string FunctionHandler(string input, ILambdaContext context)
        {
            return input.ToUpper();
        }
    }
}

パラメータ説明

・input
実行時の入力パラメータ。
呼び出し時に型に合わせてJSON文字列を自動的にデシリアライズしてくれる。

・context
コンテキスト。
ラムダ関数情報を見たりロガーを呼び出したりできる。

入出力の型

実装する際、大体は入力する型と出力する型は決まっていると思うので、それに合わせたクラスを作成する。
下記はAWSマネジメントコンソール上でテストするときのデフォルト値に合わせたクラス。
出力側は適当。

・InputParam.cs

using System.Text.Json.Serialization;

namespace Project1
{

    public record InputParam
    {

        [JsonPropertyName("key1")]
        public required string Key1 { get; set; }

        [JsonPropertyName("key2")]
        public required string Key2 { get; set; }

        [JsonPropertyName("key3")]
        public required string Key3 { get; set; }

    }

}

・OutputParam.cs

using System.Text.Json.Serialization;

namespace Project1
{

    public record OutputParam
    {

        [JsonPropertyName("newKey")]
        public required string NewKey { get; set; }

        [JsonPropertyName("count")]
        public required int Count { get; set; }

    }

}

「input」の型と戻り値の型を、作成したクラスに変更する。
処理は適当。

・Function.cs

namespace Project1
{
    public class Function
    {

        /// <summary>
        /// A simple function that takes a string and does a ToUpper
        /// </summary>
        /// <param name="input">The event for the Lambda function handler to process.</param>
        /// <param name="context">The ILambdaContext that provides methods for logging and describing the Lambda environment.</param>
        /// <returns></returns>
        public OutputParam FunctionHandler(InputParam input, ILambdaContext context)
        {
            return new()
            {
                NewKey = $"{input.Key1} {input.Key2} {input.Key3}",
                Count = 12345
            };
        }
    }
}

AWSマネジメントコンソール上、デプロイしたラムダ関数の詳細ページで、テストタブを選択するとラムダ関数をテストすることができる。
今回はデフォルトの入力パラメータに合わせてクラスを作成したので、このままテストボタンをポチッとして実行させる。

lambda_05.png

成功すると、戻り値とか処理結果など表示される。

lambda_06.png

戻り値の返し方については公式ガイドを参照。
なんかいい感じに解釈してくれるっぽい。

・Lambda 関数 URL の呼び出し
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/urls-invocation.html

リンク

公式ガイド

・C# による Lambda 関数の構築
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-csharp.html


メインページに戻る


AWS

最終更新日:2025/08/17

Amazon Web Service

AWS SDK for .NET

C#で各種サービスを操作しよう。

DynamoDB
NoSQLデータベース

Lambda
サーバーレスコード実行環境

Bedrock
生成AI実行環境


コンテンツ一覧へ戻る