チュートリアル: トリガーとバインドでシークレットの代わりに ID ベースの接続を使用する
このチュートリアルでは、関数アプリの設定に格納されているシークレットの代わりにマネージド ID を使用して Azure Service Bus キューに接続するように Azure Functions を構成する方法について説明します。 このチュートリアルは、「既定のストレージ シークレットが定義に含まれない関数アプリを作成する」チュートリアルの続きです。 ID ベースの接続の詳細については、「ID ベースの接続を構成する」を参照してください。
ここで示す手順は一般にすべての言語で動作しますが、このチュートリアルで現在サポートされているのは特に Windows 上の C# クラス ライブラリ関数です。
このチュートリアルでは、次の作業を行う方法について説明します。
- Service Bus の名前空間とキューを作成します。
- マネージド ID を使用して関数アプリを構成します。
- Service Bus キューから読み取るためのアクセス許可をその ID に付与するロールの割り当てを作成します。
- Service Bus トリガーを使用して関数アプリを作成してデプロイする
- Service Bus への ID ベースの接続を検証します。
前提条件
前のチュートリアル「ID を使用して Azure サービスに接続する関数アプリを作成する」を完了します。
Service Bus の名前空間とキューを作成する
Azure portal で、 [リソースの作成] (+) を選びます。
[リソースの作成] ページで、[Service Bus] を検索して選択し、[作成] を選択します。
[基本] ページで、次の表を使用して Service Bus 名前空間の設定を構成します。 残りのオプションについては既定値を使用します。
オプション 推奨値 説明 サブスクリプション 該当するサブスクリプション リソースが作成されるサブスクリプション。 リソース グループ myResourceGroup 関数アプリで作成したリソース グループ。 名前空間名 グローバルに一意の名前 関数をトリガーするインスタンスの名前空間。 名前空間はパブリックにアクセスできるため、Azure 全体でグローバルに一意の名前を使用する必要があります。 また、名前の長さは 6 から 50 文字で、英数字とダッシュのみを含める必要があり、数字で始めることはできません。 場所 myFunctionRegion 関数アプリを作成したリージョン。 価格レベル Basic 基本の Service Bus サービス レベル。 [Review + create](レビュー + 作成) を選択します。 検証が終了したら、 [作成] を選択します。
デプロイが完了したら、[リソースに移動] を選択します。
新しい Service Bus 名前空間で、 [+ キュー] を選択してキューを追加します。
新しいキューの名前として「myinputqueue」と入力し、[作成] を選択します。
キューが作成されたので、関数アプリのマネージド ID にロールの割り当てを追加できます。
マネージド ID を使用して Service Bus トリガーを構成する
ID ベースの接続で Service Bus トリガーを使用するには、Azure Service Bus のデータ受信者ロールの割り当てを関数アプリのマネージド ID に追加する必要があります。 このロールは、マネージド ID を使用して Service Bus 名前空間からトリガーする場合に必要です。 このロールに独自のアカウントを追加することもできます。これにより、ローカル テスト時に Service Bus 名前空間に接続できます。
Note
ID ベースの接続を使用するためのロール要件は、サービスと、それに接続する方法によって異なります。 ニーズは、トリガー、入力バインド、出力バインドによって異なります。 特定のロール要件の詳細については、サービスのトリガーとバインドに関するドキュメントを参照してください。
作成した Service Bus 名前空間で、[アクセス制御 (IAM)] を選択します。 このページで、リソースにアクセスできるユーザーを表示および構成できます。
[+ 追加] を選択し、[ロールの割り当ての追加] を選択します。
[Azure Service Bus のデータ受信者] を検索し、それを選択して、[次へ] を選択します。
[メンバー] タブの [アクセスの割り当て先] で、 [マネージド ID] を選びます
[メンバーの選択] を選択して、[マネージド ID の選択] パネルを開きます。
[サブスクリプション] が、前にリソースを作成したものであることを確認します。
[マネージド ID] セレクターで、 [システム割り当てマネージド ID] カテゴリから [関数アプリ] を選びます。 [関数アプリ] ラベルの横のかっこ内に、サブスクリプション内でシステム割り当て ID を持っているアプリの数を示す値が含まれている場合があります。
入力フィールドの下の一覧に、自分のアプリが表示されているはずです。 表示されていない場合は、 [選択] ボックスを使って、アプリの名前で結果をフィルター処理できます。
アプリケーションを選択します。 下の [選択したメンバー] セクションにそれが移動します。 [選択] を選択します。
[ロールの割り当てを追加] 画面に戻り、[レビューと割り当て] を選択します。 構成を確認し、[レビューと割り当て] を選択します。
マネージド ID を使用して、関数アプリに、Service Bus 名前空間へのアクセスを許可しました。
関数アプリで Service Bus に接続する
portal で、前のチュートリアルで作成した関数アプリを検索するか、 [関数アプリ] ページで参照します。
関数アプリで、[設定] を展開し、[環境変数] を選びます。
[アプリ設定] タブで [+ 追加] を選択して設定を作成します。 次の表の情報を使用して、新しい設定の [名前] と [値] を入力します。
名前 値 説明 ServiceBusConnection__fullyQualifiedNamespace <SERVICE_BUS_NAMESPACE>.servicebus.windows.net この設定により、シークレットの代わりに ID ベースの接続を使用して、関数アプリが Service Bus に接続されます。 [適用] を選択し、[適用]、[確認] の順に選択して変更内容を保存し、アプリ関数を再起動します。
Note
Azure App Configuration または Key Vault を使用してマネージド ID 接続の設定を指定する場合、名前の設定に __
の代わりに :
や /
などの有効なキー区切り記号を使用して、名前が正しく解決されるようにしなければなりません。
たとえば、ServiceBusConnection:fullyQualifiedNamespace
のようにします。
マネージド ID を使用して Service Bus 名前空間に接続する関数アプリを準備したので、Service Bus トリガーを使用する新しい関数をローカル プロジェクトに追加できます。
Service Bus でトリガーされる関数を追加する
次のように
func init
コマンドを実行して、特定のランタイムを含んだ LocalFunctionProj という名前のフォルダーに関数プロジェクトを作成します。func init LocalFunctionProj --dotnet
プロジェクト フォルダーに移動します。
cd LocalFunctionProj
ルート プロジェクト フォルダーで、次のコマンドを実行します。
dotnet add package Microsoft.Azure.WebJobs.Extensions.ServiceBus --version 5.2.0
このコマンドによって、Service Bus 拡張パッケージの既定のバージョンが、マネージド ID をサポートするバージョンに置き換えられます。
次のコマンドを実行して、Service Bus によってトリガーされる関数をプロジェクトに追加します。
func new --name ServiceBusTrigger --template ServiceBusQueueTrigger
このコマンドによって、新しい Service Bus トリガーのコードと拡張パッケージへの参照が追加されます。 このトリガーの Service Bus 名前空間接続設定を追加する必要があります。
新しい ServiceBusTrigger.cs プロジェクト ファイルを開き、
ServiceBusTrigger
クラスを次のコードに置き換えます。public static class ServiceBusTrigger { [FunctionName("ServiceBusTrigger")] public static void Run([ServiceBusTrigger("myinputqueue", Connection = "ServiceBusConnection")]string myQueueItem, ILogger log) { log.LogInformation($"C# ServiceBus queue trigger function processed message: {myQueueItem}"); } }
このコード サンプルでは、キュー名が
myinputqueue
に更新されます。これは、前に作成したキューと同じ名前です。 また、Service Bus 接続の名前がServiceBusConnection
に設定されます。 この名前は、ID ベースの接続で使用される Service Bus 名前空間 (portal で構成したServiceBusConnection__fullyQualifiedNamespace
) です。
Note
この時点では、func start
を使用して関数を実行しようとすると、エラーが発生します。 これは、ID ベースの接続をローカルで定義していないためです。 関数をローカルで実行する場合は、[前のセクション](#connect-to-the service-bus-in-your-function-app) で行ったように、local.settings.json
でアプリ設定の ServiceBusConnection__fullyQualifiedNamespace
を設定します。 さらに、ロールを開発者 ID に割り当てる必要があります。 詳細については、「ID ベースの接続によるローカル開発」を参照してください。
Note
Azure App Configuration または Key Vault を使用してマネージド ID 接続の設定を指定する場合、__
の代わりに :
や /
などの有効なキー区切り記号を使用して、名前が正しく解決されるようにしなければなりません。
たとえば、「 ServiceBusConnection:fullyQualifiedNamespace
」のように入力します。
更新したプロジェクトを公開する
次のコマンドを実行して、展開パッケージに必要なファイルをローカルに生成します。
dotnet publish --configuration Release
\bin\Release\netcoreapp3.1\publish
サブフォルダーを参照し、その内容から .zip ファイルを作成します。次のコマンドを実行して .zip ファイルを公開し、必要に応じて
FUNCTION_APP_NAME
、RESOURCE_GROUP_NAME
、PATH_TO_ZIP
パラメーターを置き換えます。az functionapp deploy -n FUNCTION_APP_NAME -g RESOURCE_GROUP_NAME --src-path PATH_TO_ZIP
新しいトリガーで関数アプリを更新したので、ID を使用して機能することを確認できます。
変更を検証する
portal の [サービス] で、
Application Insights
を検索し、 [Application Insights] を選択します。[Application Insights] で、名前付きインスタンスを参照または検索します。
インスタンスで、 [調査] の下の [ライブ メトリック] を選択します。
前のタブを開いたままにし、新しいタブで Azure portal を開きます。新しいタブで、Service Bus 名前空間に移動し、左側のメニューから [キュー] を選択します。
myinputqueue
という名前のキューを選択します。左側のメニューから [Service Bus エクスプローラー] を選択します。
テスト メッセージを送信します。
開いている [ライブ メトリック] タブを選択し、Service Bus キューの実行を確認します。
お疲れさまでした。 これで、マネージド ID を使用して Service Bus キュー トリガーが正常に設定されました。
リソースをクリーンアップする
前の手順では、リソース グループ内に Azure リソースを作成しました。 これらのリソースが将来必要になると思わない場合は、リソース グループを削除してリソースを削除できます。
Azure portal メニューまたは [ホーム] ページから、 [リソース グループ] を選択します。 次に、 [リソース グループ] ページで [myResourceGroup] を選択します。
[myResourceGroup] ページで、一覧表示されたリソースが、削除しようとするリソースであることを確認します。
[リソース グループの削除] を選択し、確認のためテキスト ボックスに「myResourceGroup」と入力して、 [削除] を選択します。
次のステップ
このチュートリアルでは、ID ベースの接続を使用して関数アプリを作成しました。
ID を管理する方法については、次の記事に進んでください。