azure-eventgrid-dotnet-v2
Azure.Messaging.EventGrid (.NET)ワークフロースキルです。ユーザーが.NET用のAzure Event Grid SDKを必要とする場合に使用します。Azure Event Gridでイベントを発行・消費するためのクライアントライブラリで、イベント駆動アーキテクチャ、pub/subメッセージング、CloudEvents、EventGridEventsに対応しています。マージまたは引き継ぎの前に、オペレーターはアップストリームワークフロー、コピーされたサポートファイル、および出所情報を保持する必要があります。
description の原文を見る
Azure.Messaging.EventGrid (.NET) workflow skill. Use this skill when the user needs Azure Event Grid SDK for .NET. Client library for publishing and consuming events with Azure Event Grid. Use for event-driven architectures, pub/sub messaging, CloudEvents, and EventGridEvents and the operator should preserve the upstream workflow, copied support files, and provenance before merging or handing off.
SKILL.md 本文
Azure.Messaging.EventGrid (.NET)
概要
この公開インテイクコピーは https://github.com/sickn33/antigravity-awesome-skills から plugins/antigravity-awesome-skills/skills/azure-eventgrid-dotnet をパッケージ化し、その出所を隠さずにネイティブな Omni Skills 編集形式に変換しています。
オペレータがアップストリームワークフロー、サポートファイル、およびリポジトリコンテキストをそのまま保持しながら、公開バリデータと非公開エンハンサーが通常のダウンストリームフローを続行する必要がある場合に使用します。
このインテイクはコピーされたアップストリームファイルをそのまま保持し、metadata.json の external_source ブロックと ORIGIN.md をレビューの出所アンカーとして使用します。
Azure.Messaging.EventGrid (.NET) Azure Event Grid トピック、ドメイン、名前空間にイベントを発行するためのクライアントライブラリ
インポートされたソースセクションのうち、公開見出しにきれいにマップされなかったものは、以下またはサポートファイルに保持されています。注目すべきインポートセクション:環境変数、クライアント階層、認証、イベント発行、プルデリバリー(名前空間)、イベント消費(Azure Functions)。
このスキルを使用する場合
このセクションをトリガーフィルターとして使用します。オペレータがファイルを読み込む、コマンドを実行する、またはプルリクエストを開く前に、活性化の境界を明示するべきです。
- このスキルは、概要で説明されているワークフローまたはアクションを実行するのに適しています。
- リクエストがインポートされたソースの意図と明確に一致する場合に使用します:.NET 用 Azure Event Grid SDK。Azure Event Grid でイベントを発行および使用するためのクライアントライブラリ。イベント駆動型アーキテクチャ、パブ/サブメッセージング、CloudEvents、EventGridEvents に使用します。
- オペレータがプロセスをゼロから書き直すのではなく、アップストリームワークフローの詳細を保持する必要がある場合に使用します。
- 回答、PR、またはレビューパケットに出所を表示したままにする必要がある場合に使用します。
- コピーされたアップストリームの参考資料、例、またはスクリプトが実質的に回答を改善する場合に使用します。
- ワークフローが非公開エンハンサーが担当する前に公開インテイクリポジトリでレビュー可能なままである必要がある場合に使用します。
操作テーブル
| 状況 | ここから始める | なぜそれが重要なのか |
|---|---|---|
| 初回使用 | metadata.json | コピーされたワークフローに触れる前に、external_source ブロックを通じてリポジトリ、ブランチ、コミット、インポートパスを確認します |
| 出所レビュー | ORIGIN.md | レビュアーにインポートされたソースの平文監査証跡を提供します |
| ワークフロー実行 | SKILL.md | 実行を実質的に変更するコピーされた最小ファイルから始めます |
| サポートコンテキスト | SKILL.md | パッケージ全体を読み込まずに、次の最も関連性の高いコピーされたソースファイルを追加します |
| 引き渡し決定 | ## 関連スキル | タスクが異なる方向に進む場合、オペレータがより強力なネイティブスキルに切り替えるのに役立ちます |
ワークフロー
このワークフローは意図的に編集的かつ運用的です。インポートされたソースをオペレータにとって有用に保ちながら、ダウンストリームエンハンサーフローに供給される公開インテイク標準を満たします。
- bash # トピックとドメイン用(プッシュデリバリー)dotnet add package Azure.Messaging.EventGrid # 名前空間用(プルデリバリー)dotnet add package Azure.Messaging.EventGrid.Namespaces # CloudNative CloudEvents 相互運用性用dotnet add package Microsoft.Azure.Messaging.EventGrid.CloudNativeCloudEvents 現在のバージョン:4.28.0(安定版)
- ユーザーの目標、インポートされたワークフローのスコープ、および このスキルがまだタスクの適切なルーターであるかどうかを確認します。
- コピーされたアップストリームサポートファイルを読み込む前に、概要と出所ファイルを読んでください。
- 現在のリクエストの結果を実質的に変更する参考資料、例、プロンプト、またはスクリプトのみを読み込みます。
- アップストリームワークフローを実行しながら、作業ノートで出所とソースの境界を明示的に保ちます。
- アップストリームの期待とコピーされたファイルで指摘できる証拠に対して結果を検証します。
- 作業がこのインポートされたワークフローの中心から外れるときに、関連スキルにエスカレートまたは引き渡してください。
インポートされたワークフローノート
インポート:インストール
# トピックとドメイン用(プッシュデリバリー)
dotnet add package Azure.Messaging.EventGrid
# 名前空間用(プルデリバリー)
dotnet add package Azure.Messaging.EventGrid.Namespaces
# CloudNative CloudEvents 相互運用性用
dotnet add package Microsoft.Azure.Messaging.EventGrid.CloudNativeCloudEvents
現在のバージョン:4.28.0(安定版)
インポート:環境変数
# トピック/ドメインエンドポイント
EVENT_GRID_TOPIC_ENDPOINT=https://<topic-name>.<region>.eventgrid.azure.net/api/events
EVENT_GRID_TOPIC_KEY=<access-key>
# 名前空間エンドポイント(プルデリバリー用)
EVENT_GRID_NAMESPACE_ENDPOINT=https://<namespace>.<region>.eventgrid.azure.net
EVENT_GRID_TOPIC_NAME=<topic-name>
EVENT_GRID_SUBSCRIPTION_NAME=<subscription-name>
例
例 1:アップストリームワークフローを直接要求する
@azure-eventgrid-dotnet-v2 を使用して <task> を処理します。コピーされたアップストリームワークフローから開始し、結果を変更するファイルのみを読み込み、回答に出所を表示したままにしてください。
説明:オペレータがインポートされたワークフローを必要としているが、リポジトリ全体は必要ない場合、これが最も安全な出発点です。
例 2:出所に基づいたレビューを要求する
metadata.json と ORIGIN.md に対して @azure-eventgrid-dotnet-v2 をレビューし、最初に読み込むコピーされたアップストリームファイルとその理由を説明してください。
説明:出所の正確で監査可能な説明が必要な場合、レビューまたはトラブルシューティング前にこれを使用します。
例 3:実行前にコピーされたサポートファイルを絞り込む
@azure-eventgrid-dotnet-v2 を <task> に使用します。結果を変更するコピーされた参考資料、例、またはスクリプトのみを読み込み、進める前にファイルを明示的に名前を付けてください。
説明:これにより、デフォルトでコピーされたパッケージ全体を読み込むのではなく、スキルを段階的開示に合わせたままにします。
例 4:レビュアーパケットを構築する
コピーされたアップストリームファイルと出所を使用して @azure-eventgrid-dotnet-v2 をレビューし、マージ前のギャップを要約してください。
説明:PR が人間のレビューを待っている場合、反復可能な監査パケットが必要な場合に便利です。
ベストプラクティス
生成された公開スキルを、アップストリームリポジトリの周りのレビュー可能なパッケージングレイヤーとして扱います。目標は出所を明示的に保ち、実行を実質的に改善するコピーされたソースマテリアルのみを読み込むことです。
- CloudEvents を使用する — 新しい実装には CloudEvents を推奨します(業界標準)
- イベントをバッチ処理する — 効率のために 1 つの呼び出しで複数のイベントを送信します
- Entra ID を使用する — アクセスキーよりもマネージドアイデンティティを推奨します
- べき等ハンドラー — イベントは複数回配信される可能性があります
- イベント TTL を設定する — 名前空間イベントの有効期限を設定します
- 部分的な失敗を処理する — 個別にイベントを確認/リリースします
- デッドレターを使用する — 失敗したイベント用にデッドレターを設定します
インポートされた運用ノート
インポート:ベストプラクティス
- CloudEvents を使用する — 新しい実装には CloudEvents を推奨します(業界標準)
- イベントをバッチ処理する — 効率のために 1 つの呼び出しで複数のイベントを送信します
- Entra ID を使用する — アクセスキーよりもマネージドアイデンティティを推奨します
- べき等ハンドラー — イベントは複数回配信される可能性があります
- イベント TTL を設定する — 名前空間イベントの有効期限を設定します
- 部分的な失敗を処理する — 個別にイベントを確認/リリースします
- デッドレターを使用する — 失敗したイベント用にデッドレターを設定します
- スキーマを検証する — 処理する前にイベントデータを検証します
トラブルシューティング
問題:オペレータがインポートされたコンテキストをスキップして、あまりに一般的に回答した
兆候:結果が plugins/antigravity-awesome-skills/skills/azure-eventgrid-dotnet のアップストリームワークフローを無視するか、出所を言及しないか、またはコピーされたソースファイルをまったく使用しないかです。
解決策:metadata.json、ORIGIN.md、および最も関連性の高いコピーされたアップストリームファイルを再度開きます。external_source ブロックを最初にチェックしてから、続行する前に出所を再度述べてください。
問題:インポートされたワークフローがレビュー中に不完全に見える
兆候:レビュアーは生成された SKILL.md を見ることができますが、現在のタスクに関連する参考資料、例、またはスクリプトをすばやく判断できません。
解決策:あなたが取った経路を正当化する正確なコピーされた参考資料、例、スクリプト、またはアセットを指し示してください。ギャップがまだ実在する場合は、それを隠すのではなく PR に記録してください。
問題:タスクが別の専門分野にドリフトした
兆候:インポートされたスキルは正しい場所で開始しますが、作業はデバッグ、アーキテクチャ、設計、セキュリティ、またはネイティブスキルがより良く処理するリリースオーケストレーションに変わります。 解決策:関連スキルセクションを使用して意図的に引き渡してください。インポートされた出所を表示したままにして、次のスキルがブラインドで開始する代わりに正しいコンテキストを継承します。
関連スキル
@00-andruia-consultant- このインポートされたスキルがコンテキストを確立した後、作業がそのネイティブ専門分野でより良く処理される場合に使用します。@00-andruia-consultant-v2- このインポートされたスキルがコンテキストを確立した後、作業がそのネイティブ専門分野でより良く処理される場合に使用します。@10-andruia-skill-smith- このインポートされたスキルがコンテキストを確立した後、作業がそのネイティブ専門分野でより良く処理される場合に使用します。@10-andruia-skill-smith-v2- このインポートされたスキルがコンテキストを確立した後、作業がそのネイティブ専門分野でより良く処理される場合に使用します。
追加リソース
このサポートマトリックスと以下のリンクファイルを、このインポートされたスキルのオペレータパケットとして使用します。これらは汎用スキャフォルディングではなく、実際のコピーされたソースマテリアルを反映すべきです。
| リソースファミリー | レビュアーに提供するもの | パス例 |
|---|---|---|
references | アップストリームからコピーされた参考資料、ガイド、または背景マテリアル | references/n/a |
examples | アップストリームからコピーされた実行例または再利用可能なプロンプト | examples/n/a |
scripts | 実行またはバリデーションを変更するアップストリームヘルパースクリプト | scripts/n/a |
agents | インポートされたパッケージの一部である方向またはデリゲーションノート | agents/n/a |
assets | ソースパッケージからコピーされたサポートアセットまたはスキーマ | assets/n/a |
インポートされた参考資料ノート
インポート:キータイプ参考資料
| タイプ | 目的 |
|---|---|
EventGridPublisherClient | トピック/ドメインに発行します |
EventGridSenderClient | 名前空間トピックに送信します |
EventGridReceiverClient | 名前空間サブスクリプションから受信します |
EventGridEvent | Event Grid ネイティブスキーマ |
CloudEvent | CloudEvents 1.0 スキーマ |
ReceiveResult | プルデリバリーレスポンス |
ReceiveDetails | ブローカープロパティ付きイベント |
BrokerProperties | ロックトークン、配信数 |
インポート:参考資料リンク
インポート:クライアント階層
プッシュデリバリー(トピック/ドメイン)
└── EventGridPublisherClient
├── SendEventAsync(EventGridEvent)
├── SendEventsAsync(IEnumerable<EventGridEvent>)
├── SendEventAsync(CloudEvent)
└── SendEventsAsync(IEnumerable<CloudEvent>)
プルデリバリー(名前空間)
├── EventGridSenderClient
│ └── SendAsync(CloudEvent)
└── EventGridReceiverClient
├── ReceiveAsync()
├── AcknowledgeAsync()
├── ReleaseAsync()
└── RejectAsync()
インポート:認証
API キー認証
using Azure;
using Azure.Messaging.EventGrid;
EventGridPublisherClient client = new(
new Uri("https://mytopic.eastus-1.eventgrid.azure.net/api/events"),
new AzureKeyCredential("<access-key>"));
Microsoft Entra ID(推奨)
using Azure.Identity;
using Azure.Messaging.EventGrid;
EventGridPublisherClient client = new(
new Uri("https://mytopic.eastus-1.eventgrid.azure.net/api/events"),
new DefaultAzureCredential());
SAS トークン認証
string sasToken = EventGridPublisherClient.BuildSharedAccessSignature(
new Uri(topicEndpoint),
DateTimeOffset.UtcNow.AddHours(1),
new AzureKeyCredential(topicKey));
var sasCredential = new AzureSasCredential(sasToken);
EventGridPublisherClient client = new(
new Uri(topicEndpoint),
sasCredential);
インポート:イベント発行
EventGridEvent スキーマ
EventGridPublisherClient client = new(
new Uri(topicEndpoint),
new AzureKeyCredential(topicKey));
// 単一イベント
EventGridEvent egEvent = new(
subject: "orders/12345",
eventType: "Order.Created",
dataVersion: "1.0",
data: new { OrderId = "12345", Amount = 99.99 });
await client.SendEventAsync(egEvent);
// イベントのバッチ
List<EventGridEvent> events = new()
{
new EventGridEvent(
subject: "orders/12345",
eventType: "Order.Created",
dataVersion: "1.0",
data: new OrderData { OrderId = "12345", Amount = 99.99 }),
new EventGridEvent(
subject: "orders/12346",
eventType: "Order.Created",
dataVersion: "1.0",
data: new OrderData { OrderId = "12346", Amount = 149.99 })
};
await client.SendEventsAsync(events);
CloudEvent スキーマ
CloudEvent cloudEvent = new(
source: "/orders/system",
type: "Order.Created",
data: new { OrderId = "12345", Amount = 99.99 });
cloudEvent.Subject = "orders/12345";
cloudEvent.Id = Guid.NewGuid().ToString();
cloudEvent.Time = DateTimeOffset.UtcNow;
await client.SendEventAsync(cloudEvent);
// CloudEvents のバッチ
List<CloudEvent> cloudEvents = new()
{
new CloudEvent("/orders", "Order.Created", new { OrderId = "1" }),
new CloudEvent("/orders", "Order.Updated", new { OrderId = "2" })
};
await client.SendEventsAsync(cloudEvents);
Event Grid ドメインに発行する
// イベントはドメインルーティングのために Topic プロパティを指定する必要があります
List<EventGridEvent> events = new()
{
new EventGridEvent(
subject: "orders/12345",
eventType: "Order.Created",
dataVersion: "1.0",
data: new { OrderId = "12345" })
{
Topic = "orders-topic" // ドメイントピック名
},
new EventGridEvent(
subject: "inventory/item-1",
eventType: "Inventory.Updated",
dataVersion: "1.0",
data: new { ItemId = "item-1" })
{
Topic = "inventory-topic"
}
};
await client.SendEventsAsync(events);
カスタムシリアライゼーション
using System.Text.Json;
var serializerOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};
var customSerializer = new JsonObjectSerializer(serializerOptions);
EventGridEvent egEvent = new(
subject: "orders/12345",
eventType: "Order.Created",
dataVersion: "1.0",
data: customSerializer.Serialize(new OrderData { OrderId = "12345" }));
await client.SendEventAsync(egEvent);
インポート:プルデリバリー(名前空間)
名前空間トピックにイベントを送信する
using Azure;
using Azure.Messaging;
using Azure.Messaging.EventGrid.Namespaces;
var senderClient = new EventGridSenderClient(
new Uri(namespaceEndpoint),
topicName,
new AzureKeyCredential(topicKey));
// 単一イベントを送信する
CloudEvent cloudEvent = new("employee_source", "Employee.Created",
new { Name = "John", Age = 30 });
await senderClient.SendAsync(cloudEvent);
// バッチを送信する
await senderClient.SendAsync(new[]
{
new CloudEvent("source", "type", new { Name = "Alice" }),
new CloudEvent("source", "type", new { Name = "Bob" })
});
イベントを受信して処理する
var receiverClient = new EventGridReceiverClient(
new Uri(namespaceEndpoint),
topicName,
subscriptionName,
new AzureKeyCredential(topicKey));
// イベントを受信する
ReceiveResult result = await receiverClient.ReceiveAsync(maxEvents: 10);
List<string> lockTokensToAck = new();
List<string> lockTokensToRelease = new();
foreach (ReceiveDetails detail in result.Details)
{
CloudEvent cloudEvent = detail.Event;
string lockToken = detail.BrokerProperties.LockToken;
try
{
// イベントを処理する
Console.WriteLine($"Event: {cloudEvent.Type}, Data: {cloudEvent.Data}");
lockTokensToAck.Add(lockToken);
}
catch (Exception)
{
// リトライのためにリリースする
lockTokensToRelease.Add(lockToken);
}
}
// 正常に処理されたイベントを確認する
if (lockTokensToAck.Any())
{
await receiverClient.AcknowledgeAsync(lockTokensToAck);
}
// リトライのためにイベントをリリースする
if (lockTokensToRelease.Any())
{
await receiverClient.ReleaseAsync(lockTokensToRelease);
}
イベントを拒否する(デッドレター)
// 処理できないイベントを拒否する
await receiverClient.RejectAsync(new[] { lockToken });
インポート:イベント消費(Azure Functions)
EventGridEvent トリガー
using Azure.Messaging.EventGrid;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.EventGrid;
public static class EventGridFunction
{
[FunctionName("ProcessEventGridEvent")]
public static void Run(
[EventGridTrigger] EventGridEvent eventGridEvent,
ILogger log)
{
log.LogInformation($"Event Type: {eventGridEvent.EventType}");
log.LogInformation($"Subject: {eventGridEvent.Subject}");
log.LogInformation($"Data: {eventGridEvent.Data}");
}
}
CloudEvent トリガー
using Azure.Messaging;
using Microsoft.Azure.Functions.Worker;
public class CloudEventFunction
{
[Function("ProcessCloudEvent")]
public void Run(
[EventGridTrigger] CloudEvent cloudEvent,
FunctionContext context)
{
var logger = context.GetLogger("ProcessCloudEvent");
logger.LogInformation($"Event Type: {cloudEvent.Type}");
logger.LogInformation($"Source: {cloudEvent.Source}");
logger.LogInformation($"Data: {cloudEvent.Data}");
}
}
インポート:イベント解析
EventGridEvent を解析する
// JSON 文字列から
string json = "..."; // Event Grid webhook ペイロード
EventGridEvent[] events = EventGridEvent.ParseMany(BinaryData.FromString(json));
foreach (EventGridEvent egEvent in events)
{
if (egEvent.TryGetSystemEventData(out object systemEvent))
{
// システムイベントを処理する
switch (systemEvent)
{
case StorageBlobCreatedEventData blobCreated:
Console.WriteLine($"Blob created: {blobCreated.Url}");
break;
}
}
else
{
// カスタムイベントを処理する
var customData = egEvent.Data.ToObjectFromJson<MyCustomData>();
}
}
CloudEvent を解析する
CloudEvent[] cloudEvents = CloudEvent.ParseMany(BinaryData.FromString(json));
foreach (CloudEvent cloudEvent in cloudEvents)
{
var data = cloudEvent.Data.ToObjectFromJson<MyEventData>();
Console.WriteLine($"Type: {cloudEvent.Type}, Data: {data}");
}
インポート:システムイベント
// 一般的なシステムイベントタイプ
using Azure.Messaging.EventGrid.SystemEvents;
// ストレージイベント
StorageBlobCreatedEventData blobCreated;
StorageBlobDeletedEventData blobDeleted;
// リソースイベント
ResourceWriteSuccessEventData resourceCreated;
ResourceDeleteSuccessEventData resourceDeleted;
// App Service イベント
WebAppUpdatedEventData webAppUpdated;
// Container Registry イベント
ContainerRegistryImagePushedEventData imagePushed;
// IoT Hub イベント
IotHubDeviceCreatedEventData deviceCreated;
インポート:イベントスキーマの比較
| 機能 | EventGridEvent | CloudEvent |
|---|---|---|
| 標準 | Azure 固有 | CNCF 標準 |
| 必須フィールド |
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- diegosouzapw
- ライセンス
- MIT
- 最終更新
- 2026/5/10
Source: https://github.com/diegosouzapw/awesome-omni-skills / ライセンス: MIT