拡張機能の追加

機能は、カスタム コマンドの追加からデプロイ ライフサイクルへのフックまで、Azure Developer CLI (azd) 拡張機能で実行できることを定義します。 この記事では、サンプル 拡張機能のビルド クイック スタートから Contoso Resource Tagger サンプル拡張機能に機能を追加する方法について説明します。 任意の拡張機能に同じパターンを適用できます。

各機能には、capabilities配列内のエントリと、拡張機能コード内の対応する実装の 2 つのものが必要です。

Note

azd 拡張機能は現在ベータ版です。

使用可能な機能

azd 拡張機能では、次の機能を宣言できます。

  • custom-commands: 拡張機能の名前空間の下の azd に新しいコマンドとコマンド グループを追加します。 たとえば、サンプル拡張機能は azd tagger showを追加します。 この機能を使用して、ユーザーがコマンド ラインから直接実行するタスクを公開します。
  • lifecycle-events: azd の実行中に発生する preprovisionpostprovisionpostdeploy などのイベントを購読します。 拡張機能は、ユーザーが直接呼び出すことなく、これらのポイントでカスタム ロジックを実行します。 たとえば、サンプル拡張機能では、リソースが作成される前に、 preprovision で必要なタグがチェックされます。
  • service-target-provider: 新しいデプロイ ターゲットを登録 azd 、すぐにはサポートされていないホストにサービスをパッケージ化してデプロイする方法を認識します。 サービス ターゲットは、hostazure.yaml値にマップされます。 たとえば、サードパーティのプラットフォームまたは内部ホスティング環境にサービスをデプロイするプロバイダーを追加できます。
  • framework-service-provider: 言語またはフレームワークのサポートを登録 azd 、そのプロジェクトの種類を復元、ビルド、パッケージ化する方法を認識します。 これは、azure.yaml 内の language 値に対応します。 たとえば、既定では認識されない azd 言語のビルド サポートを追加できます。
  • provisioning-provider: azdazd provision および azd up中にインフラストラクチャをプロビジョニングする方法を置き換えます。 組み込みの Bicep または Terraform のフローの代わりに、拡張機能が動作を定義します。 たとえば、別のコードとしてのインフラストラクチャ ツールやカスタム デプロイ API を統合できます。
  • validation-provider: プロジェクトまたは環境に対して実行される azd 検証パイプラインにチェックを提供します。 たとえば、デプロイを進める前に、名前付け規則、必要なタグ、またはセキュリティ設定が設定されていることを確認できます。
  • mcp-server: GitHub Copilotなどの AI エージェントが検出して呼び出すことができるモデル コンテキスト プロトコル (MCP) ツールとして拡張機能の機能を公開します。 たとえば、サンプル拡張機能では、 suggest_tags ツールを公開できます。 詳細については、「 MCP サーバーを拡張機能に追加する」を参照してください。
  • metadata: azd が拡張機能を記述するために使用する、詳細なコマンド説明や、ヘルプ出力や IntelliSense に表示される構成設定のヒントなど、より豊富なコマンドおよび構成メタデータを提供します。

この記事では、カスタム コマンドとライフサイクル イベントという 2 つの最も一般的な機能について説明します。 mcp-server機能については、「MCP サーバーを拡張機能に追加する」を参照してください。 プロバイダーの機能の詳細については、 拡張機能フレームワークのリファレンスを参照してください。

カスタム コマンドを追加する

custom-commands機能を使用すると、拡張機能で新しいコマンドを azd の名前空間に登録できます。 このサンプル拡張機能では、 azd tagger show コマンドにこの機能が既に使用されています。

  1. extension.yamlで機能を宣言します。

    capabilities:
      - custom-commands
    
  2. azdext.NewExtensionRootCommand ヘルパーを使用してコマンドをビルドします。このヘルパーでは、標準のazd フラグと環境変数の処理が登録されるため、手動で宣言する必要はありません。

    import "github.com/azure/azure-dev/cli/azd/pkg/azdext"
    
    func NewRootCommand() *cobra.Command {
        rootCmd, extCtx := azdext.NewExtensionRootCommand(azdext.ExtensionCommandOptions{
            Name:  "tagger",
            Use:   "tagger <command> [options]",
            Short: "Standardize and report Azure resource tags.",
        })
    
        rootCmd.AddCommand(newShowCommand(extCtx))
        // Add other subcommands here.
        return rootCmd
    }
    

    ヘルパーは、*ExtensionContextEnvironmentなど、標準フラグの解決された値を公開するOutputFormatを返します。 標準フラグを再宣言するのではなく、サブコマンドにコンテキストを渡し、 RunE ハンドラー内でコンテキストを読み取ります。

ライフサイクル イベントをサブスクライブする

lifecycle-events機能を使用すると、preprovisionpostdeployなどのプロジェクトおよびサービス ライフサイクル イベント中に、拡張機能でカスタム ロジックを実行できます。 このサンプル拡張機能では、 preprovision イベントを使用して、リソースをプロビジョニングする前に必要なタグ azd 設定されていることを確認します。

  1. extension.yamlで機能を宣言します。

    capabilities:
      - custom-commands
      - lifecycle-events
    
  2. listen コマンドを拡張機能に追加します。 azd は、このコマンドを呼び出して、イベントに使用される双方向接続を確立します。 azdext.NewExtensionHost ビルダーを使用して、イベント ハンドラーを登録します。

    func newListenCommand() *cobra.Command {
        return &cobra.Command{
            Use:    "listen",
            Short:  "Starts the extension and listens for azd events.",
            Hidden: true,
            RunE: func(cmd *cobra.Command, args []string) error {
                ctx := azdext.WithAccessToken(cmd.Context())
    
                azdClient, err := azdext.NewAzdClient()
                if err != nil {
                    return fmt.Errorf("failed to create azd client: %w", err)
                }
                defer azdClient.Close()
    
                host := azdext.NewExtensionHost(azdClient).
                    WithProjectEventHandler(
                        "preprovision",
                        func(ctx context.Context, args *azdext.ProjectEventArgs) error {
                            fmt.Printf("Verifying required tags for project: %s\n", args.Project.Name)
                            // Add your tag validation logic here.
                            return nil
                        },
                    )
    
                // Run blocks until azd closes the connection.
                if err := host.Run(ctx); err != nil {
                    return fmt.Errorf("failed to run extension: %w", err)
                }
    
                return nil
            },
        }
    }
    
  3. ルート コマンドに listen コマンドを登録します。

    rootCmd.AddCommand(newListenCommand())
    

ユーザーが azd provision または azd upを実行すると、 azd は拡張機能を呼び出し、リソースをプロビジョニングする前に preprovision ハンドラーを呼び出します。

サービス イベントをフィルター処理する

サービス イベント ハンドラーではオプションのフィルター処理がサポートされているため、特定のサービスの種類のみを処理できます。 たとえば、prepackage イベントは、Pythonコンテナー アプリ サービスに対してのみ処理できます。

host := azdext.NewExtensionHost(azdClient).
    WithServiceEventHandler(
        "prepackage",
        func(ctx context.Context, args *azdext.ServiceEventArgs) error {
            fmt.Printf("Packaging service: %s\n", args.Service.Name)
            return nil
        },
        &azdext.ServiceEventOptions{
            Host:     "containerapp",
            Language: "python",
        },
    )

リビルドとテスト

機能を追加したら、拡張機能をリビルドし、新しい動作をテストします。

  1. ウォッチャーを使用している場合は、変更が自動的に再構築されます。 それ以外の場合は、手動でビルドします。

    azd x build
    
  2. 機能をテストします。 ライフサイクル イベントの場合は、 azd provisionなどのイベントをトリガーするコマンドを実行します。