Agent2Agent (A2A) プロトコルは、AI エージェント間のシームレスなコミュニケーションとコラボレーションを可能にするために設計されたオープン標準です。Knative に A2A サーバーをデプロイすることで、オートスケーリング (ゼロへのスケーリングを含む) などの機能を活用でき、オンデマンドのリソース消費と迅速なバージョンイテレーションが可能になります。
仕組み
AI エージェントは推論、計画、メモリの能力を持ち、自律的に学習してユーザーのためのタスクを完了させることができます。一部のプロトコルが大規模言語モデル (LLM) がデータやツールにアクセスするための標準を提供するのと同様に、A2A プロトコルはエージェント間の相互運用性のための標準化されたフレームワークを定義します。
Knative に A2A サーバーをデプロイするには、以下のコアなやり取りが含まれます。
-
ディスカバリー:デプロイ後、サービスは標準の Agent Card を通じてインターフェイスを公開します。これにより、他のエージェントはその スキル (AgentSkill) と 機能 (AgentCapabilities) をクエリできます。
-
コミュニケーション:エージェントは、Knative のゲートウェイとサービスルーティングによって処理される標準の HTTP または gRPC メッセージ交換を通じて通信します。
-
コラボレーション:エージェントは API を通じてタスクをデリゲートし、アクションを調整します。
エージェントコミュニケーションのプロトコルアーキテクチャとそのコアコンセプトについては、A2A 仕様をご参照ください。
前提条件
-
クラスターに Knative をデプロイ済みであること。詳細については、「Knative コンポーネントのデプロイと管理」をご参照ください。
-
ゲートウェイアドレスを取得済みであること。
アドレスは、Knative コンソールの アドオン管理 タブまたは サービス管理 タブで確認できます。

手順1:A2A サーバーのデプロイ
この例では、`helloworld-agent-server` という名前の基本的なエージェントサービスをデプロイします。
-
「
a2a-service.yaml」ファイルを作成します。apiVersion: serving.knative.dev/v1 kind: Service metadata: name: helloworld-agent-server # 要件に応じて名前空間を変更します。 namespace: default annotations: # 迅速な検証のためにワイルドカードドメイン名を使用します。 knative.aliyun.com/serving-ingress: / spec: template: spec: containers: # {region} を実際のリージョン (例:cn-hangzhou) に置き換えます。 - image: registry-{region}-vpc.ack.aliyuncs.com/acs/knative-samples-a2a:v1.0-952c112 name: user-container env: # INVOKE は Agent Card で返される呼び出し URL を定義します。プレースホルダーをサービスのアクセスゲートウェイアドレスに置き換えてください。 - name: INVOKE value: http://<YOUR_GATEWAY_ADDRESS>/invoke ports: - containerPort: 9001 name: http1 protocol: TCP -
サービスをデプロイします。
kubectl apply -f a2a-service.yaml -
Knative サービスの状態を確認します。
kubectl get ksvc helloworld-agent-server期待される出力:
NAME URL LATESTCREATED LATESTREADY READY REASON helloworld-agent-server http://helloworld-agent-server.default.example.com helloworld-agent-server-00001 helloworld-agent-server-00001 True
手順2:サービスの検証と Agent Card の取得
サービスをデプロイした後、A2A プロトコルに準拠した Agent Card が返されることを確認します。
-
ゲートウェイアドレスとサービスのデフォルトドメイン名を取得します。
ACK クラスターページで、クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 をクリックします。
-
サービス管理 タブで、サービスの デフォルトドメイン を取得します。
次の図は、ゲートウェイ と デフォルトドメイン を示しています。

-
サービスのメタデータエンドポイントにアクセスします。
# <GATEWAY_ADDRESS> を取得したゲートウェイアドレスに置き換えます。 curl http://<GATEWAY_ADDRESS>/.well-known/agent-card.json | jq .期待される出力を表示します。
出力には、エージェントの機能(capabilities)、説明(description)、およびスキル(skills)が含まれている必要があります。{ "capabilities": { "streaming": true }, "defaultInputModes": [ "text" ], "defaultOutputModes": [ "text" ], "description": "Just a hello world agent", "name": "Hello World Agent", "preferredTransport": "JSONRPC", "protocolVersion": "", "skills": [ { "description": "Returns a 'Hello, world!'", "examples": [ "hi", "hello" ], "id": "hello_world", "name": "Hello, world!", "tags": [ "hello world" ] } ], "url": "http://XXX/invoke", "version": "" }
手順3:A2A クライアントによるサービスの呼び出し
Go を使用して、デプロイされた A2A サーバーと通信する別のエージェントをシミュレートするクライアントコードを作成します。
-
開発環境を準備します。Go 言語環境をインストールします。
-
`main.go` ファイルを作成し、次のコードを追加します。
package main import ( "context" "flag" "log" // A2A プロトコルのコアライブラリをインポートします。 "github.com/a2aproject/a2a-go/a2a" "github.com/a2aproject/a2a-go/a2aclient" "github.com/a2aproject/a2a-go/a2aclient/agentcard" // gRPC 関連のライブラリをインポートします。 "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) // <GATEWAY_ADDRESS> を実際のゲートウェイアドレスに置き換えます。 var cardURL = flag.String("card-url", "http://<GATEWAY_ADDRESS>", "Base URL of AgentCard client.") func main() { flag.Parse() ctx := context.Background() // サービスをディスカバリーします。 card, err := agentcard.DefaultResolver.Resolve(ctx, *cardURL) if err != nil { log.Fatalf("Failed to resolve an AgentCard: %v", err) } // トランスポートレイヤーを設定します。 withInsecureGRPC := a2aclient.WithGRPCTransport(grpc.WithTransportCredentials(insecure.NewCredentials())) // クライアントを作成します。 client, err := a2aclient.NewFromCard(ctx, card, withInsecureGRPC) if err != nil { log.Fatalf("Failed to create a client: %v", err) } // メッセージを構築します。 msg := a2a.NewMessage(a2a.MessageRoleUser, a2a.TextPart{Text: "Hello, world"}) resp, err := client.SendMessage(ctx, &a2a.MessageSendParams{Message: msg}) if err != nil { log.Fatalf("Failed to send a message: %v", err) } log.Printf("Server responded with: %+v", resp) } -
コードを実行してテストします。
go mod init a2a-demo go mod tidy go run main.go次の出力は、クライアントが Knative サービスに正常に接続し、応答を受信したことを示しています。
2025/11/27 17:24:21 Server responded with: &{ID:019ac4a0-c386-7cdc-9aad-d40fb8f98ae2 ContextID: Extensions:[] Metadata:map[] Parts:[{Text:Hello, world! Metadata:map[]}] ReferenceTasks:[] Role:agent TaskID:}
本番環境に関する推奨事項
-
カスタムドメイン名と HTTPS:本番環境では、テストドメイン名を使用しないでください。カスタムドメイン名を設定し、HTTPS 証明書を有効にしてエージェント間の通信を保護することを推奨します。
-
コールドスタートの最適化:エージェントが頻繁に呼び出されない場合、Knative はインスタンス数をゼロにスケールダウンします。コールドスタートのレイテンシーがユーザーエクスペリエンスに影響を与えるのを防ぐために、最小インスタンス数 (MinScale) を設定するか、リザーブドインスタンスを設定することができます。
課金
Knative 自体に追加費用はかかりません。ただし、Knative の使用中にプロビジョニングされる、コンピューティングリソース (Elastic Compute Service (ECS)) やネットワークリソース (Application Load Balancer) などの基盤となるクラウドリソースの費用はお客様の負担となります。これらのリソースは、各クラウドサービスによって個別に請求されます。料金の詳細については、「クラウドリソース料金」をご参照ください。