Functions を外部リソースに接続する

デプロイ済み関数は、アプリケーション認証を用いて外部AzureおよびFabricリソースをアプリのアイデンティティとして呼び出します。 関数に必要なオーディエンスを宣言し、プラットフォームが提供するリソーススコープトークンを ctx.Tokensで使用します。

開発者CLIのサインインやオーサリング時のエンドポイント発見は、デプロイされたランタイムアクセスとは別です。 開発者がリソースにアクセスできる場合でも、デプロイされたアプリIDの権限を確認してください。

前提条件

  • 関数が初期化されたFabricアプリです。 セットアップ手順については「Fabric Appsの関数使用」を参照してください。
  • applicationでrayfin/rayfin.ymlに設定されたservices.functions.auth.type 構成の詳細については、 アプリケーション認証を参照してください。
  • アプリのアイデンティティは、関数コードが呼び出す各外部リソースへのアクセスを許可していました。

外部接続を宣言する

RayfinContext注釈でオーディエンスを宣言し、ctx.Tokensからスコープドトークンを読みます。

import {
  UserDataFunctions,
  AudienceType,
  type RayfinContext,
} from '@microsoft/fabric-user-data-functions';

const udf = new UserDataFunctions();

udf.func(
  'accessStorage',
  async (
    ctx: RayfinContext<AppSchema, AudienceType.Storage>,
  ): Promise<string> => {
    const token: string = ctx.Tokens.Storage;
    // Use the token with the resource SDK or REST API.
    return 'ok';
  },
  [],
);

注釈は宣言です。 RayfinContext<Schema, Audiences>にオーディエンスをリストアップすると、接続バインディングが認識されます。 udf.func()の3番目の引数は[]のままにしてください。

ctx.Tokens あなたが宣言した対象者に絞られます。 未宣言のオーディエンはコンパイルエラーを引き起こします:

async (
  ctx: RayfinContext<AppSchema, AudienceType.Sql | AudienceType.Storage>,
) => {
  const sqlToken: string = ctx.Tokens.Sql;
  const storageToken: string = ctx.Tokens.Storage;
};

トークン値は string 型を持ちます。 オーディエンスを宣言することはそのバインディングを登録しますが、トークンの利用可能性やリソースアクセスを保証するものではありません。 ホストが宣言されたトークンを提供しない場合、その ctx.Tokens プロパティを読み取るとエラーが発生します。

スキーマの引数を指定します

RayfinContext まずはアプリのスキーマを取ってください。 RayfinClient<AppSchema> に渡すのと同じスキーマを使用して、オーディエンスを追加するときもデータクライアントの型が維持されるようにします:

async (ctx: RayfinContext<AppSchema, AudienceType.Sql>) => {
  const data = ctx.getDataClient();
  const token = ctx.Tokens.Sql;
};

関数がオーディエンスを必要としているがRayfin DBにアクセスしない場合は、デフォルトのスキーマを明示的に渡します:

async (ctx: RayfinContext<Record<string, any>, AudienceType.Fabric>) => {
  const token = ctx.Tokens.Fabric;
};

支援対象者

AudienceType は支持対象者向けの真実の源です:

外部リソース AudienceType
Fabric lakehouse、warehouse、Fabric内のSQLデータベース、ミラードデータベース、またはAzure SQL Database Sql
Fabric OneLake ファイル、Azure Blob Storage、Azure Table storage、または Azure Queue Storage Storage
Microsoft Fabric REST API Fabric
Azure AI Foundry AzureAI
Azure DevOps ADO

Power BIセマンティックモデルはctx.Tokensでは利用できません。 代わりに fabric-semanticmodel コネクターを使いましょう。 コネクタのガイダンスについては、「Connect to Fabric data」をご覧ください。

デプロイメントメタデータを理解する

型引数は関数を実行する前に消去されます。 npx rayfin up中、TypeScriptコンパイラは宣言されたオーディエンスを解決し、ユニオンをデプロイのメタデータに書き込みます。 関数ワーカーはそのメタデータを使って接続をバインドします。

型エイリアスは、関数プロジェクトに以下の tsconfig.jsonがある場合に機能します:

type SqlAccess = AudienceType.Sql;

async (ctx: RayfinContext<AppSchema, SqlAccess>) => {
  const token = ctx.Tokens.Sql;
};

リテラルな AudienceType.X 値を優先してください。 Functionsプロジェクトに tsconfig.jsonがなければ、CLIはコンパイラを使えず、代わりに注釈構文を読み込みます。 このモードでは、別名は、それが表すオーディエンスではなく、その別名自身の名前に解決されます。 このフォールバックに関するCLI警告は修正すべきエラーとして扱いましょう。

コンテキストパラメータには明示的な RayfinContext<...> 注釈が必要です。 型生成はこの注釈によってコンテキストパラメータを識別します。 これがなければ、パラメータはリクエストボディパラメータとして扱われます。

リソース権限を付与する

現在のFabricアプリでは、アプリのアイデンティティはFabricアプリのアイテムの所有者です。 外部接続はこのアイデンティティとその権限を使用し、関数を呼び出すアプリのユーザーのアイデンティティや権限は使用しません。

Functionsコードが呼び出すすべてのリソースとAPIに必要な権限をアプリに付与します。 オーディエンスを宣言し展開する際、Functionsはトークンバインディングを登録しますが、ターゲットリソースに対して権限は付与しません。

リソーストークンはサーバーに保管してください。 関数結果として返却したり、フロントエンドに送ったりしないでください。

アプリのサインインや関数呼び出しの承認は、アプリIDの外部リソースへのアクセスとは別物です。

レイフィンDB恒等式

Rayfin DBは別の認証パスを使用しています。 ctx.getDataClient() 呼び出しのRayfinトークンを使用するため、データベースアクセスは呼び出し者の身元とデータベース権限を保持します。 Functionsのアプリケーション認証はRayfin DBアクセスをアプリケーションIDに切り替えません。

Azure SDKでトークンを使う

多くのAzure SDKクライアントは生のトークン文字列ではなくTokenCredentialを期待しています。 コンテキストからトークンを返すアダプターを定義します:

import type { TokenCredential, AccessToken } from '@azure/identity';

class ContextTokenCredential implements TokenCredential {
  constructor(private readonly token: string) {}

  async getToken(): Promise<AccessToken> {
    return {
      token: this.token,
      expiresOnTimestamp: Date.now() + 3600_000,
    };
  }
}

認証情報が必要なSDKクライアントに new ContextTokenCredential(ctx.Tokens.Storage) または適切な宣言トークンを渡します。 リソースSDKパッケージはプロジェクトのルートではなく rayfin/functions/package.jsonにインストールしてください。

ローカルでの開発

npx rayfin devそしてnpx rayfin dev functions apply、ローカルのAzure Functionsコアツールホストを立ち上げます。 ローカルのFunctionsホストでは、外部リソーストークンがアプリビルダーがサインインに使用するアカウントのIDと権限を使用します。

デプロイ済み関数は代わりにアプリ識別を使います。 したがって、ローカル通話が成功しても、デプロイされたアプリのIDがリソースへのアクセス権限を持っていることを証明することはできません。 アプリのアイデンティティに必要な権限を付与した後、デプロイされた関数をテストしてください。