
Visual Studio
イベント
該当するコンテンツが見つかりませんでした
マガジン

技術ブログ
みなさん、こんにちは。AWS ソリューションアーキテクトの木村です。 9 月も半ばに差し掛かり、朝晩は少しずつ秋の気配を感じられるようになってきました。 re:Invent 2026 のセッションカタログ も公開され、年末に向けた楽しみが増えてきましたね。 お昼休みの 30 分で最新情報を知れる「 もぐもぐAWS 」では、AI をテーマにした会が 9 月 / 10 月に予定されていますので是非ご参加ください。 「 AWS ジャパン生成 AI 実用化推進プログラム 」も引き続き募集中ですのでよろしくお願いします。 それでは、9 月 7 日週の生成 AI with AWS界隈のニュースを見ていきましょう。 さまざまなニュース AWS生成AI国内事例ブログ「Umios(旧マルハニチロ) が時系列基盤モデル Chronos-2 で実現する販売計画 AI – 作業4,200時間削減への裏側」を公開 Umios 株式会社様 (旧マルハニチロ) は、創業 146 年の歴史を持つ冷凍食品中心の食品メーカーです。全国の営業担当者が毎月手作業で行う販売計画の入力に、業務用流通事業部全体で年間約 4,200 時間を要するという課題がありました。Amazon SageMaker JumpStart 上の時系列基盤モデル Chronos-2 を中核とした販売計画 AI を構築し、経験と勘に依存していた予測の属人性を排除しました。特徴量エンジニアリングを重ねた結果、定番品の年累計総計ベースで 95% の予測精度を達成し、年間 4,200 時間の作業削減を見込んでいます。今後は Amazon Bedrock AgentCore を用いた予測結果の説明エージェントの構築や、対象商品の拡大を計画しています。 AWS生成AI国内事例ブログ「CODAS によるデータ秘匿性を考慮した産業特化型 AI 基盤の研究開発と実装検証に関する取り組み」を公開 一般社団法人 AI データ主権共創機構 (CODAS) は、データ秘匿性を基盤とした産業特化型 AI の研究開発・実装・実証に取り組む共創組織です。この記事では、金融領域を最優先とした産業特化型 LLM の学習・評価の取り組みと、それを支える p5en.48xlarge 72 台の AWS ParallelCluster ベースの大規模学習基盤の設計を紹介しています。大規模 GPU クラスターを複数チームで安全に共同利用するための実践知が詰まった内容です。 ブログ記事「第 8 回 AWS ジャパン 生成 AI Frontier Meetup ~学びと繋がりの場~【開催報告】」を公開 生成 AI 実用化推進プログラムの参加企業などが一堂に会する「生成 AI Frontier Meetup」の第 8 回が 2026 年 8 月 27 日に開催されました。Weights & Biases 様による LLM 評価のトレンド解説に加え、みずほフィナンシャルグループ様、Sapeet 様、rh labo 様、BTM 様による生成 AI・エージェント活用の取り組みが紹介されています。次回は 11 月 10 日開催予定ですので、興味のある方はぜひプログラムへの参加をご検討ください。 ブログ記事「単一のアクションを越えてエージェントの振る舞いとコストを制御する: Amazon Bedrock AgentCore の新機能」を公開 AI エージェントは自ら実行パスを決めるため、個々のアクションは正当でも全体としては危険な振る舞いになることがあります。この記事では、一連のアクションを評価してポリシー違反をブロックする時系列ポリシー (オープンソースのポリシー言語 Dogwood が基盤) と、ゲートウェイでのレート制限という Amazon Bedrock AgentCore の新機能を紹介しています。エージェントのコードを変えずに、インフラ側で振る舞いとコストの上限を強制できるのがポイントです。 ブログ記事「AWS AI セキュリティフレームワーク: レイヤーとフェーズに応じた適切なセキュリティコントロール」を公開 AI ワークロードのセキュリティを「インフラストラクチャ」「アイデンティティとデータ」「AI アプリケーション」の 3 レイヤーに整理し、Foundational / Enhanced / Advanced の 3 フェーズで段階的に強化する AWS AI Security Framework の解説記事です。プロトタイプから本番、スケールまで、どのフェーズでどのコントロールを適用すべきかが体系的にまとまっています。セキュリティリーダーと開発チームの共通言語として使える内容です。 ブログ記事「エージェンティックセキュリティ: マシンスピードでの検出と対応」を公開 自律型 AI エージェントの台頭は、セキュリティポスチャにとってクラウド移行以来最大の変化と言われています。この記事では、SANS Institute と共同執筆した eBook の章から、エージェントのアイデンティティとガバナンス、振る舞い監視による検出の進化、段階的な自動対応、マルチエージェントエコシステムへの備えという 4 つの基礎領域を紹介しています。エージェント時代のセキュリティ運用を考える出発点になる内容です。 ブログ記事「AI の投資収益率 (ROI) を算出する」を公開 AI 投資の効果をどう測ればよいのかは、多くの企業に共通する悩みです。この記事では、AI のユースケースを分類し、TCO を算出してコストを配分し、ビジネス価値指標と対応付けて「成果当たりコスト」を求める実践的な方法論を解説しています。Amazon Bedrock で使えるコスト帰属メカニズムの使い分けも紹介されており、AI の FinOps に取り組む方の出発点になる内容です。 ブログ記事「AI を活用したスキャフォールディングで、フルスタックの AWS アプリケーションを数分で構築する」を公開 AI アシスタントで作ったアプリケーションを本番品質に固めるには、セキュリティや可観測性などのレビューと修正の繰り返しが必要でした。このギャップを埋める Nx Plugin for AWS バージョン 1.0 がリリースされ、AI を活用したスキャフォールディングで本番相当のフルスタック AWS アプリケーションを数分で構築できるようになりました。プロトタイプ止まりに悩んでいる方はぜひ試してみてください。 ブログ記事「クラウドでのエージェンティックエンジニアリング:Kiro Web とクラウドセッションが一般提供に」を公開 Kiro Web とクラウドセッションが 2026 年 9 月 3 日に一般提供 (GA) になりました。ブラウザから作業を依頼してエージェントに任せきりにしたり、Spec で作業を形にして進めたりと、エンジニアリング作業のより多くをクラウドで実行できるようになります。あわせて、構築済みの Steering やカスタムエージェントといった設定をローカルとクラウドの両方のセッションで使える cloud configuration も提供されています。 ブログ記事「Kiro が ISO/IEC 27001:2022 のカバレッジに対応」を公開 Kiro が AWS の ISO/IEC 27001:2022 認証の適用範囲に含まれました。開発ツールはソースコードや社内ドキュメントなどの機密情報とともに使われるため、組織がツールを承認する際には情報セキュリティリスク管理の明確なエビデンスが求められます。調達・セキュリティ・ベンダーリスクの各チームが第三者による独立検証済みのエビデンスを利用できるようになり、企業での Kiro 導入を進めやすくなりました。 ブログ記事「1 年間無料の Kiro を、世界中の学生へ」を公開 Kiro を 1 年間無料で利用できる Kiro Students プログラムが、新たに 16 か国 121 の大学へ拡大されました。対象の学生は毎月 1,000 クレジットが付与され、プレミアムモデルや Kiro Web といった有料機能にもフルアクセスできます。クレジットカードの登録もトライアル期限もなしとのことなので、対象大学の学生の方はこの機会にぜひ触ってみてください。 ブログ記事「【開催報告】Girls Meet STEM in AWS 2026 を開催しました」を公開 2026 年 8 月 21 日、中高生女子向けプログラム「Girls Meet STEM」の一環として、麻布台ヒルズの新オフィスで生成 AI 体験ワークショップやオフィスツアー、パネルディスカッションを開催しました。ワークショップでは 34 名の参加者が Generative AI Use Cases (GenU) のユースケースビルダーを使い、コードを書かずに自分のアイデアを AI アプリとして形にしました。AI を「使う」側から「作る」側への一歩を体験いただいた様子をレポートしています。 ブログ記事「AWS Certified AI Business Strategist のご紹介 ~ AI をスケールさせる人々のために ~」を公開 AI 導入をビジネス側から推進する方向けの新しい AWS 認定、AWS Certified AI Business Strategist (AIB) が発表されました。技術的な実装ではなく、AI 戦略の立案やビジネスケースの構築、ガバナンス整備といったビジネス判断力を検証する試験です。ベータ試験は 2026 年 9 月 29 日から英語と日本語で受験でき、2027 年 2 月 15 日までに取得するとアーリーアドプターバッジも付与されます。 ブログ記事「AWS 認定資格 (MLA、SAP、DVA) に関するアップデート: 2026 年 9 月」を公開 AWS Certified Machine Learning Engineer – Associate (MLA-C02)、Solutions Architect – Professional (SAP-C03)、Developer – Associate (DVA-C03) の 3 つの認定試験が更新されます。いずれも生成 AI・エージェンティック AI の実装や AI 支援開発といった、今日のクラウドエンジニアに求められるスキルが出題範囲に加わります。MLA-C02 のベータ登録はすでに開始しており、SAP-C03 と DVA-C03 は 2026 年 10 月 27 日に登録開始予定です。 サービスアップデート OpenAI GPT-6 Astra が Amazon Bedrock で一般提供開始 OpenAI 社の最新かつ最高性能のモデル GPT-6 Astra が Amazon Bedrock で一般提供開始されました。より深い推論と判断力、プロフェッショナル品質の文章作成・デザイン、高度なコンピュータ・ブラウザ操作能力を備え、最大 100 万トークンの入力コンテキストウィンドウをサポートします。Amazon Bedrock の API から直接呼び出せるほか、ChatGPT Work や Codex から Bedrock 上のモデルを使う構成も可能です。詳細は こちらのドキュメント をご参照ください。 Amazon Bedrock Managed Knowledge Base が TwelveLabs Marengo 3.0 による動画・音声・画像のマルチモーダル埋め込みをサポート Amazon Bedrock Managed Knowledge Base の埋め込みモデルとして TwelveLabs Marengo 3.0 が利用可能になりました。従来の文字起こしベースのメディア検索と異なり、映像シーンや音声、映像上の手がかりを直接埋め込みに変換するため、文字起こしでは捉えられない意味まで自然言語で検索できます。検索結果にはセグメントの開始・終了時刻が含まれるため、動画内の該当シーンへ直接ジャンプするアプリケーションを構築できます。スポーツ映像の分析やメディア、教育などでの活用が期待できます。 Amazon Bedrock Managed Knowledge Base が Confluence Data Center をネイティブデータソースコネクタとしてサポート フルマネージド RAG サービスである Amazon Bedrock Managed Knowledge Base で、セルフホスト型の Confluence Data Center をデータソースとして利用できるようになりました。これまで独自のインジェストパイプラインの構築が必要でしたが、認証情報を設定するだけでクロール、メタデータ抽出、増分同期まで自動で行われます。Confluence 上のエンジニアリングドキュメントやランブックに根ざした社内アシスタントを構築しやすくなります。 Amazon Bedrock Managed Knowledge Base がドキュメントレベルアクセス制御のデバッグ用 API とコンソール機能を追加 Amazon Bedrock Managed Knowledge Base に、ドキュメントレベルのアクセス制御をデバッグするための CheckIngestedDocumentAcl / GetIngestedDocumentAcl API とコンソール機能が追加されました。特定ユーザーがドキュメントにアクセスできるかの確認や、ドキュメントに付与された ACL 全体の監査ができ、検索結果に期待するドキュメントが出てこない原因をサポートケースを起票せずに自己解決できます。 Amazon Bedrock AgentCore Memory が長期記憶への直接取り込みをサポート Amazon Bedrock AgentCore Memory に、コンテンツを短期記憶イベントとして保存せずに長期記憶へ直接取り込める IngestData API が追加されました。これまで長期記憶への抽出には短期記憶イベントとしての保存が必須でしたが、今回のアップデートで長期記憶だけを独立して利用できます。会話形式のペイロードに加えて行動ログなどの JSON ペイロードにも対応しており、取り込んだ記憶は既存の検索 API からそのまま利用できます。AgentCore Memory が利用可能な全リージョンで提供されています。 Amazon SageMaker HyperPod が推論の高速なオートスケーリングを実現するモデルキャッシュをサポート Amazon SageMaker HyperPod で、モデルの重みとコンテナイメージをクラスターノードに事前ロードしておくモデルキャッシュがサポートされました。大規模 LLM の推論ではスケールアウト時のモデルダウンロードがボトルネックでしたが、ローカル NVMe からの読み込みとイメージの事前取得により、ポッドを数分ではなく数秒で起動できます。57〜145 GB のモデルを使ったベンチマークでは約 60% 高速なスケールアウトを実現しています。詳細は こちらのドキュメント をご参照ください。 Amazon Quick デスクトップアプリが macOS と Windows で一般提供開始 Amazon Quick のデスクトップアプリが macOS と Windows で一般提供開始されました。ローカルファイルを直接扱いながらカレンダーやメール、ビジネスアプリとバックグラウンドで連携し、会話・コンテキスト・エージェントはデスクトップとモバイルの間で同期されます。エージェントは PC を閉じた後もクラウドで動き続けるため、退社前に開始した長時間タスクの結果を帰宅後にレビューする、といった使い方ができます。東京リージョンを含む 7 リージョンで利用可能です。 Amazon Quick が常時稼働エージェント、強化されたフィード、エンタープライズ管理機能を追加 Amazon Quick に、業務の整理・組織的なガバナンス・回答の信頼性を高める一連の新機能が追加されました。スケジュールタスクや監視エージェントがクラウド上で実行され、PC を閉じていても結果がフィードに届くようになったほか、アクティビティフィードのフィルターや 1 日 3 回更新のデイリーブリーフィングも加わりました。管理者向けにはモバイルデバイス管理、ユーザーごとのカスタム権限、Microsoft Purview の DLP 統合が提供されます。また、月あたりのエージェント時間が Professional で 4 時間から 8 時間、Enterprise で 8 時間から 18 時間に拡大されています。 Amazon Quick のアクティビティフィードが iOS と Android のモバイルデバイスで利用可能に Amazon Quick のアクティビティフィードが iOS / Android のモバイルアプリでも利用可能になりました。社内のコミュニケーションやツールを横断して対応が必要な項目を 1 つの優先度付きビューで確認でき、アプリを切り替えずにその場でアクションを実行できます。デスクトップとモバイルでコンテキストが引き継がれるため、外出先でも作業の続きをそのまま進められます。 AWS DevOps Agent が Slack との双方向コミュニケーションをサポート AWS DevOps Agent のインシデント調査を Slack 上で完結できるようになりました。接続したプライベートチャンネルで AWS DevOps Agent をメンションするだけで調査を開始・誘導でき、チームが提供したコンテキスト、エージェントの調査結果、推奨アクションが 1 つのスレッドに集約されます。障害対応時にコミュニケーションツールと調査ツールを行き来する必要がなくなり、オンコール対応の負荷を軽減できます。 AWS Transform の .NET モダナイゼーションが CLI で一般提供開始 AWS Transform custom の AWS マネージド変換として、.NET モダナイゼーションを 1 行の CLI コマンドで実行できるようになりました。対話的に実行できるほか、既存のパイプラインやワークフローに組み込んで自律的に実行することも可能です。東京リージョンを含む 8 リージョンで利用でき、無料のエージェント実行時間が毎月 50,000 分が含まれます。 AWS Transform for .NET がモダナイズしたコードのユニットテストを生成可能に AWS Transform for .NET が、モダナイズ後のコードに対するユニットテストを自動生成できるようになりました。これまで .NET Framework から最新 .NET への移行後のテスト整備は手作業でしたが、移行と同じジョブの中でテスト対象クラスの分析からテストコード生成までが行われ、テストが揃った状態で移行を完了できます。Visual Studio 向け AWS Toolkit 拡張でオプトインして利用できます。 AWS Lambda durable functions が Pydantic AI と統合 AWS Lambda durable functions が、Python 製の AI エージェントフレームワーク Pydantic AI と統合されました。エージェントのモデル呼び出しやツール呼び出しが耐久性のある実行ステップとして保存されるため、タイムアウトなどで中断しても完了済みのステップを繰り返さずに再開できます。チェックポイントやリトライのロジックを自分で書くことなく、トークンの二重消費や顧客への二重請求といった副作用を防げます。 Amazon OpenSearch Serverless が v0 by Vercel で利用可能に AI アプリ開発プラットフォームの v0 by Vercel で、Amazon OpenSearch Serverless が利用可能になりました。自然言語のプロンプトで作りたいものを記述するだけで、v0 がフルスタックアプリケーションを生成し、OpenSearch Serverless コレクションのプロビジョニングからデータのインデックス作成まで自動で行います。全文検索や RAG 向けのベクトル検索を備えたアプリを数分で立ち上げられ、東京・大阪リージョンにも対応しています。 Kiro CLI 2.21.4 がセッション検索の対象範囲設定と V2 ハーネスフラグを追加 Kiro CLI 2.21.4 がリリースされました。/sessions のセッション検索の対象を「プロンプトのみ」と「プロンプトとエージェントの応答」から選べるようになり、自分が聞いた内容だけでなく Kiro が答えた内容からも過去のセッションを探せます。また、–v2 フラグでデフォルト設定を変えずにその 1 回だけ V2 エージェントハーネスで実行できるようになりました。 今週は以上です。それでは、また来週お会いしましょう! 著者について 木村 直登(Naoto Kimura) AWS Japan のソリューションアーキテクトとして、製造業のお客様に対しクラウド活用の技術支援を行なっています。最近は AI Agent と毎日戯れており、AI Agent 無しでは生きていけなくなっています。好きなうどんは’かけ’です。
私はC#が好きなのですが、デリゲートを使ったことがないと気付きました。 昔やったプロジェクトでデリゲートを見たことはありますし、先輩が使っているのを見たこともあります。しかし自分自身が使ったことはなくて、食わず嫌いしていたかもと思えてきました。 そこでデリゲートをコードを書きながら学ぼうと考えたのが今回の記事です。私が書いて動かしたコードで解説していきます。 デリゲート(delegate)とは # デリゲートとは委譲という意味です。 委譲とはコトバンクによると「権利・権限などを他の人・機関に譲って任せること」となっています。つまり自分がやることを他人に任せることです。例えば上司が部下に仕事を振ることなどはいい例でしょう。 https://kotobank.jp/word/%E5%A7%94%E8%AD%B2-432326 ならばプログラミングにおいてはやることは処理です。処理の実行を他の機能に任せるということになります。 しかしこれだけだとなんのこっちゃか分かりません。そこでもう少し具体的に言うと、処理(メソッド)の参照を代入して、値ではなく処理(メソッド)を渡すことで、他の機能(クラス)から処理(メソッド)を実行できるようにするとなります。 例えばある処理が完了したらコールバック処理を呼び出してもらうときに使えます。 事前準備 # この記事のサンプルコードを動かすにはVisual StudioまたはVisual Studio CodeでC#開発ができるようセットアップを行ってください。Visual Studio Codeでのセットアップはこちらの記事を参照してください。 VS Codeで始める!わかる&できるC#開発環境の構築【2025年版マニュアル】 IDEのセットアップができたら、次はコンソールアプリのプロジェクトを作成してください。この記事のサンプルコードは手軽に動作確認するためにコンソールアプリで作っています。 デリゲートの基本をサンプルコードで解説 # デリゲートの基本的な書き方 # 早速ですがコードを書いて動きを確認していきます。 動かせるサンプルコードを掲載します。 DelegateSample というクラスを作り、以下のコードを書いてください。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DelegateApp { internal class DelegateSample { // デリゲートを宣言 // デリゲート型のメソッドを宣言しているようなもの delegate void SampleDelegate(string message); // サンプルの実行 public void ExecSample() { // 宣言したデリゲートを型としてメソッドを引数に渡す // 違和感ある書き方だが、メソッド型のインスタンスを作ってメソッドを代入しているようなイメージ SampleDelegate sampleDelegate = new SampleDelegate(Console.WriteLine); // 試しにメッセージを出してみる // Console.WriteLineを代入したので、デリゲートを実行するとConsole.WriteLineが実行される sampleDelegate("テストメッセージです"); // 次は独自に作ったメソッド(コンソールに文字列を出すだけだが)を代入してみる sampleDelegate = TestMessage; sampleDelegate("カレーとサラダ"); Console.WriteLine(); } void TestMessage(string message) { Console.WriteLine($"今夜の夕食は{message}の予定です。"); } } } そして Program.cs には以下のように書いてください。 using DelegateApp; using DelegateApp.Models; Console.WriteLine("デリゲートを開始します"); DelegateSample delegateSample = new DelegateSample(); delegateSample.ExecSample(); このコードを実行すると、次のようにメッセージが表示されます。 デリゲート初心者には分かりづらいとか違和感があると感じたかもしれません。 デリゲートの宣言は delegate 型のメソッドを定義することです。そして次に宣言したメソッドを型としたインスタンスを作成します。型がメソッドだなんて一瞬意味が分からなく感じますよね。 そして delegate 型のインスタンスにはメソッドを代入できます。メソッドを実行するための仕組みなので、このようになります。メソッドを代入するということ自体が慣れない行為ですよね。 でもここまで見てみると、引数さえ合っていれば、色んなメソッドを代入して実行可能だろうと分かりますね。 複数のメソッドをまとめるマルチキャストデリゲートというものもあります。例えば先ほどの DelegateSample クラスに次のようにコードを追加してみましょう。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DelegateApp { internal class DelegateSample { // デリゲートを宣言 // デリゲート型のメソッドを宣言しているようなもの delegate void SampleDelegate(string message); // サンプルの実行 public void ExecSample() { // 宣言したデリゲートを型としてメソッドを引数に渡す // 違和感ある書き方だが、メソッド型のインスタンスを作ってメソッドを代入しているようなイメージ SampleDelegate sampleDelegate = new SampleDelegate(Console.WriteLine); // 試しにメッセージを出してみる // Console.WriteLineを代入したので、デリゲートを実行するとConsole.WriteLineが実行される sampleDelegate("テストメッセージです"); // 次は独自に作ったメソッド(コンソールに文字列を出すだけだが)を代入してみる sampleDelegate = TestMessage; sampleDelegate("カレーとサラダ"); Console.WriteLine(); // ここから追加 // 実はメソッドの追加が可能 sampleDelegate += TestMessageLunch; sampleDelegate("カレーとサラダ"); Console.WriteLine(); // 追加済みメソッドの削除も可能 sampleDelegate -= TestMessage; sampleDelegate("カレーとサラダ"); // ここまで } void TestMessage(string message) { Console.WriteLine($"今夜の夕食は{message}の予定です。"); } // 昼食用のメソッドを追加 void TestMessageLunch(string message) { Console.WriteLine($"今夜の昼食は{message}でした。"); } } } Program.cs を実行すると以下のようになります。 このコードにはデリゲートに対してメソッドを加算及び減算しています。 なんと delegate 型のインスタンスには複数のメソッドの追加や追加したメソッドの削除ができるのです。 これをマルチキャストデリゲートと呼びます。 デリゲートの進化の歴史を知る # 実は先ほど書いたデリゲートのやり方は昔ながらのやり方でした。それがもう少し進化し、C# 2.0の時代には匿名メソッドが使えるようになりました。 匿名メソッドのサンプルコードを掲載します。 DelegateSampleAnonymous というクラスを作り、以下のコードを書いてください。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DelegateApp { internal class DelegateSampleAnonymous { // デリゲートを宣言 // デリゲート型のメソッドを宣言しているようなもの delegate void SampleDelegate(string message); // サンプルの実行 public void ExecSample() { // 次は独自に作ったメソッド(コンソールに文字列を出すだけだが)を代入してみる // 定義されたメソッドだけでなく、匿名メソッドも代入可能 SampleDelegate sampleDelegate = delegate(string message) { Console.WriteLine($"今夜の夕食は{message}の予定です。"); }; sampleDelegate("カレーとサラダ"); Console.WriteLine(); // 匿名メソッドを追加してみる sampleDelegate += delegate(string message) { Console.WriteLine($"今夜の昼食は{message}でした。"); }; sampleDelegate("カレーとサラダ"); Console.WriteLine(); // ちなみに匿名メソッドで追加すると削除できない // このように一度別のインスタンスに入れてから追加する必要がある SampleDelegate workDelegate = delegate(string message) { Console.WriteLine($"今夜の朝食は{message}でした。"); }; sampleDelegate += workDelegate; sampleDelegate("カレーとサラダ"); Console.WriteLine(); sampleDelegate -= workDelegate; sampleDelegate("カレーとサラダ"); } } } そして Program.cs には以下のように書いてください。 using DelegateApp; using DelegateApp.Models; Console.WriteLine("デリゲートを開始します"); Console.WriteLine(); Console.WriteLine("匿名メソッドのサンプルです"); Console.WriteLine(); DelegateSampleAnonymous delegateSampleAnonymous = new DelegateSampleAnonymous(); delegateSampleAnonymous.ExecSample(); 実行すると以下のようになります。 ここでちょっと厄介なことは、匿名メソッドを使った場合は追加したメソッドの削除ができないことです。どうしても削除したければ、一度インスタンスに入れてから追加する必要があるのです。 上記のサンプルで言うと workDelegate が該当します。 現在はラムダ式を使うのが主流となっています。ラムダ式を使うサンプルコードを掲載します。 DelegateSampleLambda というクラスを作り、以下のコードを書いてください。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DelegateApp { internal class DelegateSampleLambda { // デリゲートを宣言 // デリゲート型のメソッドを宣言しているようなもの delegate void SampleDelegate(string message); // サンプルの実行 public void ExecSample() { // 次は独自に作ったメソッド(コンソールに文字列を出すだけだが)を代入してみる // 定義されたメソッドだけでなく、ラムダ式も代入可能 SampleDelegate sampleDelegate = (string message) => { Console.WriteLine($"今夜の夕食は{message}の予定です。"); }; sampleDelegate("カレーとサラダ"); Console.WriteLine(); // ラムダ式を追加してみる sampleDelegate += (string message) => { Console.WriteLine($"今夜の昼食は{message}でした。"); }; sampleDelegate("カレーとサラダ"); Console.WriteLine(); // ちなみにラムダ式で追加すると削除できない // このように一度別のインスタンスに入れてから追加する必要がある SampleDelegate workDelegate = (string message) => { Console.WriteLine($"今夜の朝食は{message}でした。"); }; sampleDelegate += workDelegate; sampleDelegate("カレーとサラダ"); Console.WriteLine(); sampleDelegate -= workDelegate; sampleDelegate("カレーとサラダ"); } } } そして Program.cs には以下のように書いてください。 using DelegateApp; using DelegateApp.Models; Console.WriteLine("デリゲートを開始します"); Console.WriteLine(); Console.WriteLine("ラムダ式のサンプルです"); Console.WriteLine(); DelegateSampleLambda delegateSampleLambda = new DelegateSampleLambda(); delegateSampleLambda.ExecSample(); 実行すると以下のようになります。 ラムダ式になるともはや delegate という記述すらなくなります。一番シンプルな書き方です。 FuncとActionを使えば宣言不要 # 戻り値がない処理ならAction # ここまでのやり方は delegate 型のメソッドを宣言して、そのインスタンスにメソッドを代入するというものでした。わざわざ宣言しているので、用途別にデリゲートを作成する必要がありました。 そこで汎用型として戻り値がない場合は Action 、戻り値がある場合は Func というものが登場しました。 Action を使ったサンプルコードを掲載します。 DelegateSampleAction というクラスを作り、以下のコードを書いてください。 このようにジェネリックで引数の型を指定します。わざわざ delegate 型のメソッドを宣言する必要がないので、コードもシンプルになります。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DelegateApp { internal class DelegateSampleAction { public void ExecSample() { // Actionデリゲートを使用するサンプル // Actionデリゲートは戻り値がvoidで、引数の型を指定できる Action<string> actionDelegate = (message) => { Console.WriteLine($"今夜の夕食は{message}の予定です。"); }; actionDelegate("カレーとサラダ"); } } } そして Program.cs には以下のように書いてください。 using DelegateApp; using DelegateApp.Models; Console.WriteLine("デリゲートを開始します"); Console.WriteLine(); Console.WriteLine("Actionのサンプルです"); Console.WriteLine(); DelegateSampleAction delegateSampleAction = new DelegateSampleAction(); delegateSampleAction.ExecSample(); 実行すると以下のようになります。 ちなみにメソッドの追加や削除については delegate を使う場合と同様に+や-などの演算子を使ってください。また匿名メソッドやラムダ式では削除ができないことも同様ですので、削除したいときは一度インスタンスに入れてから追加してください。 戻り値がある処理ならFunc # Func を使ったサンプルコードを掲載します。 DelegateSampleFunc というクラスを作り、以下のコードを書いてください。ジェネリックの型指定で、<引数の型, 戻り値の型>というように指定します。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DelegateApp { internal class DelegateSampleFunc { public void ExecSample() { // Actionデリゲートを使用するサンプル // Actionデリゲートは戻り値がvoidで、引数の型を指定できる Func<int, string> funcDelegate = (num) => { return $"入力された値は{num}です。"; }; Console.WriteLine(funcDelegate(5)); } } } そして Program.cs には以下のように書いてください。 using DelegateApp; using DelegateApp.Models; Console.WriteLine("デリゲートを開始します"); Console.WriteLine(); Console.WriteLine("Funcのサンプルです"); Console.WriteLine(); DelegateSampleFunc delegateSampleFunc = new DelegateSampleFunc(); delegateSampleFunc.ExecSample(); 実行すると以下のようになります。 Func もメソッドの追加や削除については delegate を使う場合と同様です。 デリゲートの本当の使い道 # コールバック処理 # コールバック処理のサンプルコードを掲載します。 DelegateSampleAction というクラスを作り、以下のコードを書いてください。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DelegateApp { internal class CallbackSample { // コールバックのサンプル // ここでは、処理が終わった後に呼び出されるメソッドをデリゲートとして渡す // デリゲートを使うことで、処理が終わった後に呼び出されるメソッドを自由に変更できる public void ExecSample(string message, Action<string> callback) { Console.WriteLine($"処理中: {message}"); // 処理が終わった後にコールバックを呼び出す callback?.Invoke($"処理が完了しました: {message}"); } } } そして Program.cs には以下のように書いてください。 using DelegateApp; using DelegateApp.Models; Console.WriteLine("デリゲートを開始します"); Console.WriteLine(); Console.WriteLine("コールバックのサンプルです"); Console.WriteLine(); CallbackSample callbackSample = new CallbackSample(); callbackSample.ExecSample("カレーとサラダ", (result) => { Console.WriteLine(result); }); 実行すると以下のようになります。 このようにメソッドの引数に Func や Action を定義することで処理を受け取ります。そして Invoke メソッドで処理を実行します。 条件に応じた処理の差し替え # 実はLINQの Where は引数が Func になっています。つまり Where メソッドの中ではデリゲートを使っているのです。 では Func の内容次第で結果が異なる例を作ってみましょう。 DelegateSampleLinq というクラスを作り、以下のコードを書いてください。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DelegateApp { internal class DelegateSampleLinq { public void ExecSample() { List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // まずは偶数だけを抽出してみる var evenNumbers = FilterNumbers(numbers, (num) => num % 2 == 0); Console.WriteLine("偶数のリスト:"); Console.WriteLine(evenNumbers.Count > 0 ? string.Join(", ", evenNumbers) : "該当する値はありません。"); // 続いて奇数を抽出してみる var oddNumbers = FilterNumbers(numbers, (num) => num % 2 != 0); Console.WriteLine("奇数のリスト:"); Console.WriteLine(oddNumbers.Count > 0 ? string.Join(", ", oddNumbers) : "該当する値はありません。"); } /// <summary> /// 引数として渡されたFuncを実行し、条件に一致する値だけを返す /// </summary> /// <param name="numbers"></param> /// <param name="predicate"></param> /// <returns></returns> static List<int> FilterNumbers(List<int> numbers, Func<int, bool> predicate) { List<int> resultList = new List<int>(); foreach (var number in numbers) { if (predicate(number)) { resultList.Add(number); } } return resultList; } } } そして Program.cs には以下のように書いてください。 using DelegateApp; using DelegateApp.Models; Console.WriteLine("デリゲートを開始します"); Console.WriteLine(); Console.WriteLine("条件を切り替えるサンプルです"); Console.WriteLine(); DelegateSampleLinq delegateSampleLinq = new DelegateSampleLinq(); delegateSampleLinq.ExecSample(); 実行すると以下のようになります。 デリゲートの脆弱性を補うためのevent # ここまでデリゲートの使い方について色々と見てきました。 しかし便利な反面、危険も伴います。何せ代入次第で何とでも処理内容を変えられます。また Invoke メソッドによって好きなところで実行が可能です。脆弱な面があることは否めません。 下手すると不具合の元になるのはもちろん、セキュリティ面での脆弱性も怖いところです。 そこで event というキーワードを付けることで、外部クラスからの代入や実行ができなくなります。 event を使ったサンプルコードを掲載します。 DelegateSampleEvent というクラスを作り、以下のコードを書いてください。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DelegateApp { internal class DelegateSampleEvent { // パブリックだから他のクラスからアクセス可能 public event Func<int, string> SampleEvent; } internal class DelegateSampleExternal { public void ExecSample() { DelegateSampleEvent sample = new DelegateSampleEvent(); // 外部クラスからのデリゲートの代入は不可 sample.SampleEvent = (int x) => $"入力された値は{x}です。"; // 外部クラスからのデリゲートの追加と削除は可能 sample.SampleEvent += (int x) => $"入力された値は{x}です。"; Func<int, string> func = (int x) => $"今日はコーヒーを{x}杯飲みました。"; sample.SampleEvent += func; sample.SampleEvent -= func; // 外部クラスからの実行は不可 sample.SampleEvent.Invoke(99); } } } 上記のようにコードを書くと、以下のスクリーンショットのように代入と Invoke メソッドのところでコンパイルエラーが発生します。 ひとまず先ほどのコードでコンパイルエラーが出ている個所はコメントアウトしてください。 フードコートでの注文を例にデリゲートを試す # デリゲートのやり方が分かったところで、現実世界をイメージして練習してみたいと思います。そこでフードコードのスイーツ屋をテーマに扱います。ただ文字の表示や計算をするよりは楽しい内容になるし、委譲をイメージしやすいと考えたためです。 業務フローは以下の図のようになります。 ここではコードをかなり端折って解説します。本当は注文内容だって明細を持てるようにしたり、注文内容も動的に変えられるようにしたりする必要がありますが、今回はそこが主題でないため簡易的なメッセージで済ませます。 それではソースコードを掲載します。 Models というフォルダに作って、その中に以下の5つのクラスを作成してください。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DelegateApp.Models { internal class Buzzer { public int No { get; set; } public Buzzer(int no) { No = no; } public void Ring() { Console.WriteLine($"ピー!ピー!ピー!{No}番のブザーが鳴っています!"); } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DelegateApp.Models { internal class Cook { public void CookOrder(Order order) { Console.WriteLine($"料理人が注文を受け取りました: {order.OrderContent}"); Console.WriteLine("料理を作っています..."); Console.WriteLine("料理が完成しました!"); } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DelegateApp.Models { internal class Customer { private Buzzer Buzzer { get; set; } public Order MakeOrder() { Console.WriteLine("お客様が注文しました。"); return new Order("パンケーキとコーヒーのセット"); } public void Pay() { Console.WriteLine("お会計を済ませました。"); } public void PickUpBuzzer(Buzzer buzzer) { Buzzer = buzzer; Console.WriteLine($"お客様が{buzzer.No}番のブザーを受け取りました。"); } public void PickUpFood() { Console.WriteLine($"お客様が{Buzzer.No}番のブザーを渡しました。"); Console.WriteLine("お客様が料理を受け取りました。"); } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DelegateApp.Models { internal class Order { public string? OrderContent { get; set; } public Order(string? orderContent) { OrderContent = orderContent; } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DelegateApp.Models { internal class Staff { private delegate void BuzzerRingHandler(); private IDictionary<int, BuzzerRingHandler> _buzzerHandlers = new Dictionary<int, BuzzerRingHandler>(); public void TakeOrder(Order order) { Console.WriteLine($"スタッフが注文を受け取りました: {order.OrderContent}"); Console.WriteLine("お会計は1,500円になります。"); } public Buzzer HandOverBuzzer(int no) { Buzzer buzzer = new Buzzer(no); Console.WriteLine($"スタッフが{no}番のブザーを渡しました。"); _buzzerHandlers.Add(no, buzzer.Ring); return buzzer; } public void RingBuzzer(int no) { if (_buzzerHandlers.TryGetValue(no, out var buzzer)) { buzzer.Invoke(); _buzzerHandlers.Remove(no); } } } } そして Program.cs には以下のように書いてください。 using DelegateApp; using DelegateApp.Models; Console.WriteLine("デリゲートを開始します"); Console.WriteLine(); Console.WriteLine("フードコートで料理が出来たらブザーを鳴らすサンプルです"); Console.WriteLine(); Customer customer = new Customer(); Staff staff = new Staff(); Cook cook = new Cook(); Order order = customer.MakeOrder(); // 注文とお会計 staff.TakeOrder(order); customer.Pay(); // ブザーを渡す int no = 1; Buzzer buzzer = staff.HandOverBuzzer(no); customer.PickUpBuzzer(buzzer); // 調理 cook.CookOrder(order); // ブザーを鳴らして料理を渡す staff.RingBuzzer(no); customer.PickUpFood(); 実行すると以下のようになります。 ポイントとしては店員がどのお客さんに何番のブザーを渡したかを管理しているということです。 プログラムとしては Staff クラスが Dictionary で番号とブザーを鳴らすメソッドの組み合わせを持っています。 こうすることで、料理ができたときに店員が顧客の手元にあるブザーを鳴らせるようにできます。 おわりに # コードを書いて動かしてみることで、デリゲートとは何かが少し分かりました。やっぱり書いて動かしてみるのが一番ですね。 デリゲートが分からないという方はこの記事のフードコートみたいなものを作ってみてください。
本記事は 2026 年 4 月 30 日に公開された Ankit Sharma、Brian Beach による “ Amazon Q Developer end-of-support announcement ” を翻訳したものです。 私たちが Amazon Q Developer を立ち上げたときの目標は、AI による支援を開発者の作業の流れに直接組み込むことでした。お客様は VS Code、JetBrains、Eclipse、Visual Studio にわたって Q Developer を導入し、コード生成やデバッグ、チャットベースのガイダンスに活用してきました。Q Developer は、AI が日々の開発サイクルに欠かせない存在であることを証明しました。 この 1 年で私たちが学んだのは、もっともインパクトのある AI 開発者体験はコード生成や補完にとどまらないということです。開発者には、プロジェクト全体 —— アーキテクチャ、要件、テスト、そしてコードの背後にある意図 —— を理解する AI が必要です。そのためには、専用に設計された環境が必要になります。それこそが、私たちが Kiro を構築した理由です。 Kiro とは 、仕様駆動開発(spec-driven development)のためにゼロから構築されたエージェント型の開発環境(IDE、CLI)です。個別のプロンプトに反応するのではなく、構造化された仕様をもとに計画・実装・検証をコードベース全体にわたって進めます。主な機能は次のとおりです。 Specs —— 構築したいものを構造化された自然言語の要件として定義し、Kiro がそれをもとに実装を最初から最後まで進めます。 Hooks —— ファイル保存やコミットなどのイベント発生時に自動で実行されるトリガーです。手動での操作なしに、標準の適用、テストの実行、ドキュメントの更新を行います。 Steering files —— プロジェクト単位の設定ファイルで、アーキテクチャや規約、制約についての永続的なコンテキストを Kiro に提供します。 Custom subagents —— セキュリティレビュー、API 契約の検証、インフラのプロビジョニングなど、ドメイン固有のタスクのために自分で定義できる専用の AI エージェントです。 Powers —— Kiro のエージェント的な振る舞いを自分の開発プロセスに合わせて拡張できる、組み合わせ可能な機能モジュールです。 Kiro には、現在の Q Developer で開発者が活用している機能もすべて含まれています。エージェント型コーディング、インラインチャット、ターミナル統合、そして MCP サポートです。 何が変わるのか Amazon Q Developer の IDE プラグインと有償サブスクリプションは、2027 年 4 月 30 日にサポートを終了します。お客様には Kiro への移行期間として 12 か月が用意されています。 2026 年 5 月 15 日以降、新規サインアップを受け付けなくなります。 IDE プラグインから Builder ID を用いた Q Developer 無料利用枠アカウントの新規作成、および AWS コンソールからの Q Developer サブスクリプションの新規作成はブロックされます。 モデルが変更されます。 2026 年 5 月 29 日より、Q Developer Pro では Opus 4.6 が利用できなくなります。Opus 4.5 やその他の既存モデルは引き続き利用できます。Opus 4.7 を含む最新のコーディングモデルは Kiro でのみ利用できます。 既存のお客様はアクセスを維持できます。 Q Developer Pro サブスクリプションまたは Kiro サブスクリプションを通じて Q Developer をご利用の場合、2027 年 4 月 30 日までは引き続き Q Developer の IDE プラグインにアクセスできます。2026 年 5 月 15 日の変更は、Q Developer アカウントおよびサブスクリプションの新規サインアップにのみ影響します。 IDE プラグインの掲載は継続します。 Q Developer のプラグインは、4 つの IDE マーケットプレイスすべてで引き続き公開され、ユーザーを Kiro へ案内する非推奨の通知が表示されます。移行期間中は、既存ユーザー向けに重要なバグ修正の配信が継続されます。 何が変わらないのか AWS マネジメントコンソールおよび AWS ファーストパーティの体験(AWS マーケティングサイト、AWS ドキュメントサイト、AWS Console Mobile App、チャットアプリ向け Amazon Q Developer —— Slack および Microsoft Teams)における Amazon Q Developer は、今回のサポート終了の影響を受けず、引き続き AWS のお客様にご利用いただけます。これらのプロダクトで Q Developer をお使いのお客様は、現在のサブスクリプションの特典と機能を引き続きご利用いただけます。 お客様にお願いしたいこと 今日から Kiro を試してみてください。 kiro.dev から Kiro をダウンロードし、次のプロジェクトで仕様駆動開発を体験してみてください。 ご利用の IDE に合わせた 移行ガイド をご確認ください。 移行についてご質問がある場合は、担当の AWS アカウントチームまでお問い合わせください。 私たちは AI を活用した開発の未来にわくわくしており、すべてのお客様にとってこの移行ができる限りスムーズなものとなるよう取り組んでいきます。 翻訳は App Dev Consultant の宇賀神が担当しました。









