Azure App Service へのデプロイ

Power Portals Proポータルは、どのスタックを選んでも単一の ASP.NET Coreアプリケーションなので、デプロイは普通のApp Serviceへの通常の dotnet publish です。このページでは、作成すべきリソース、ポータルが読み取る設定、デフォルトとして推奨するもの、そしてPower Portals Pro特有のいくつかのステップについて説明しています。これは ASP.NET Coreに特有ではないものです。

展開するもの

両方のテンプレートは1つのウェブアプリケーションと1つの公開出力を生成します。独立したフロントエンドホストは存在せず、静的サイトリソースも、2つ目のApp Serviceも存在しません。

注記

Reactのパブリッシュはnpmに出力されるため、Nodeはdotnet publish動作するマシン、つまりノートパソコンかビルドエージェントにインストールしなければなりません。テンプレートのクライアントはNode ^20.19.0 || >=22.12.0を求めます。App Service自体はNodeを必要としません。ビルドされた出力だけを認識します。

推奨されるデフォルト

ルールではなく出発点ですが、新しい制作ポータルとして選ぶのはこういうことです。

1. アプリサービスの作成

3つのコマンドです。自分の名前を置き換えてください — このページ全体で使われ myportal

ウェブアプリ名は https://myportal.azurewebsites.net になり、グローバルに一意でなければなりません。意図的に選んでください。カスタムドメインを前に付けない限り、ライセンスキーが割り当てられるURLになります。

2. プラットフォームオプションの設定

これらはポータルとしてデフォルトが間違っている人たちです。

3. 構成

App Serviceのアプリケーション設定は環境変数として届き、 appsettings.jsonを上書きします。まさにあなたが望む通りです:ファイルはそのままにして、ここで環境ごとの値を設定してください。

重要

ユーザーの秘密は移動しません。 開発中に保存したすべての dotnet user-secrets はマシン上だけに残ります。それらのキーはすべてアプリケーション設定やKey Vault参照として再作成しなければならず、そうでなければ展開したアプリは起動しません。

セクション区切りにはダブルアンダースコアをつけてください:D365:ClientIdD365__ClientIdになります。コロンフォームはWindows App Serviceでは動作しますがLinuxでは使えないため、__フォームはどこでも使うべきです。

常に必要です

そのサインインプロバイダーを有効にした場合は必須です

オプション

注記

必要なキーは GetRequiredValueで読み取られるため、欠けているキーは起動時にスローされ、最初のDataverse呼び出しで失敗することはありません。App Serviceでは、ログストリームを読み込み、例外でキー名を付けます。

4. ポータルに送信先のアドレスを与える

D365__EmailSenderEmailAddress アカウント確認やパスワードリセットメールの元であり、フレームワークはそのアドレスを持つDataverseユーザーを探し、次に キュー、そしてチームを解析します。 キューを使いましょう。 Exchangeで手を加える必要のない唯一のオプションです。Dataverseがキュー用に作成したメールボックスは組織の既存のExchange Onlineプロファイルを指しており、プロビジョニング用のメールボックスや購入ライセンスがありません。設定を実際の人物に向けると、3つのコストがかかります。

3つのステップで、すべてDataverse内で行われます。 MCPサーバー は最初の2つのステップを1回の通話で実行します create_email_queue:

  1. アドレス(例:noreply@contoso.com)、受信配信なし、送信配信サーバーサイド同期でプライベートキューを作成します。キューの名前は受信者が送信者として認識するものなので、人ではなくポータルの名前で呼びます。
  2. アドレスを承認してください。 2つのフラグが一致しなければならず、それぞれ異なるレコードに存在します:キュー自身のメールアドレス承認と 、O365管理者によるメールボックスの承認です。両方の上で保留中のキューが作成されます。
  3. Power Platform管理センターの設定→メール設定→メール設定→メールボックステスト・有効化してください。これは手作業で行う必要がある一つのステップで、単一のボタンです。

重要

未承認またはテストされていないメールボックスは静かに失敗します。 Dataverseはメールを受け取り、記録し、送信しないとポータル側から見ると送信が成功したと区別がつきません。何も送信が起きず、エラーとして記録されることもなく、問題の最初の兆候はユーザーが確認リンクを受け取っていないと言うことです。登録メールが届かない場合は、まずメールボックスの 送信状況 を確認してください。「 実行しない 」はこのステップが見落とされていることを意味します。

5. 秘密をキーヴォールトに保管すること

アプリに管理されたアイデンティティを与え、ボールトへの読み取り権限を付与し、各シークレットのURIをシークレット自体ではなくアプリ設定に配置してください。App Serviceが参照を解決し、その値は設定ブレードやスクリプト、デプロイログには一切現れません。

クライアントのシークレットが期限切れになったら(Entraはデフォルトで1年)、新しいバージョンをボールトに追加し、アプリを再起動します。アプリ設定自体は変わりません。

MCPサーバーはこの一連の手順を行います。create_managed_identityユーザーが割り当てたアイデンティティを作成し、それをアプリにアタッチenable_managed_identitycreate_key_vaultボールトを作成し、そのアイデンティティに読み込みを付与し、シークレットツールがdestination: "key-vault"を受け入れます。これにより、Entraから新たに作成されたクライアントシークレットが直接ヴォールトに送信され、アプリ設定には参照だけが残ります。その値は文字通りの設定になることはなく、誰かの手を渡ることもありません。

重要

Key Vaultの名前は削除後90日間予約されます。 ソフト削除はデフォルトでオンでオフにできないため、Vaultを削除しても名前が解放されません。同じ名前のウィンドウ内で再作成するには明確なパージが必要で、それ自体が許可が必要で不可逆的です。ここで唯一、安価に取り消せるリソースなので、App Serviceの名前と同じくらい意図的に名前を選んでください。

注記

さらに良いのは、Dataverseクライアントの秘密を完全に削除することです。 管理されたアイデンティティのクライアントIDに D365__ManagedIdentityId 設定すると、ポータルはそのIDとしてDataverseに認証され、秘密はなく、期限切れもありません。環境チェックもビルドスイッチもありません。設定はApp Serviceの設定に存在し、 appsettings.jsonではなく、ローカルには存在し、デプロイ時には存在し、どちらのビルドも正しく動作します。 ユーザー割り当て のIDを使う — システム割り当てのIDはアプリと共に作成・破棄され、デプロイスロットごとに異なるため、アプリを再構築すると新しいIDが作成され、Dataverseアプリケーションユーザーは古いIDを基に構築されてしまいます。アイデンティティは依然としてそのアプリケーションユーザーを必要とし、Azureポータルが最初に表示するプリンシパルIDではなく、 アプリケーション IDから作成されます。

6. 公開

フレームワーク依存のPublishを、出力をzipし、zipをプッシュします。Reactポータルでは同じ dotnet publish がSPAを構築し、 wwwrootにステージ化します。

Zipフォルダーの 内容 はzipで削除してください。フォルダ自体ではなく、App Serviceはアーカイブを直接サイトルートにアンパックするため、入れ子状のトップレベルディレクトリは何もサービスしないサイトを生成します。

Visual Studioの Publish ダイアログもインタラクティブに同じことを行い、GitHub ActionsやAzure Pipelinesのワークフローはプッシュ時に行います。Reactポータルの追加ステップは、ビルドより先行してNodeを設定するステップだけです。なぜなら dotnet publish はnpmに出力されるからです。

7. ライセンスをデプロイされたURLに向ける

ウェブサイトのライセンスはURLにバインドされています。Power Portals Proのモデル駆動アプリで、ライセンスキーを保持した Portal Website レコードを開き(または作成)、その URL を展開したポータルの本番URL( https://myportal.azurewebsites.net、またはカスタムドメインが先にある場合は)に設定してください。

本番環境のURLのみを登録してください。バリデーションは-dev-test-uat-stageの接尾辞ホストも受け入れ、リードサブドメインとして同じ4つも受け入れているため、下位環境は別個のレコードを必要としません。ライセンスページに完全なリストがあります。

重要

トラフィックを送信する前にこれを行ってください。すべてのデータサービングエンドポイントはライセンスを確認するため、レコードが存在しホストと一致するまではポータルはレンダリングしますが、すべてのデータ呼び出しは 402返されます。

8. 生産リダイレクトURIを追加する

ポータルがMicrosoftのサインインを提供している場合、サインインアプリの登録は依然としてローカルホストのリダイレクトURIしか認識しません。そこにデプロイされたURIを追加してください。Entraは複数のURIを受け入れているので、ローカルのURIは動作し続けます:

他のプロバイダーもそれぞれのコールバックパス(/signin-google/signin-facebook)で同じパターンです。環境ごとに1つ、カスタムドメインごとに1つずつ追加してください。

展開枠

ステージングスロットとスワップは、ウォームアップされたアプリと即時のロールバックを提供します。これらはB1を離れる価値のある唯一の理由であり、必要な時に置いておくべき理由でもあります。注意が必要です。

データ保護キーはスロットごとに割り当てられています。 ASP.NET Coreはキーリングをその %HOME%に永続化し、各スロットにはそのコピーがあるため、スワップで置き換えられ、前のスロットで発行された認証クッキーはすべて復号不可能になります。全員がログアウトされます。キーリングを両方のスロット共有する場所に移動させてから、スワッピングに頼る前に:

環境固有の設定をスロット設定としてマーク し、スワップ中も残るようにしてください。Dataverse環境のURLが問題です。URLがなければ、サンドボックスを指すステージングスロットを交換すると、そのサンドボックス接続が本番環境に進みます。

拡大

拡大は必要性を測る際に決めるべきもので、プロビジョニング時ではありません。デフォルトティアの一つのインスタンスは、驚くほど多くのポータルトラフィックを運んでいます。

これらすべてをAIエージェントから行う

Power Portals Pro MCPサーバー はこのページのすべてのステップを実行できます。フォルダを一度、ターミナルでサブスクリプションに割り当ててください。バインドはそのフォルダに属しているので、複数のプロジェクトが同時に異なる顧客をターゲットにでき、マシン全体での変更はありません。

注記

Azureで何かを変更するすべてのツールは、まず確認を求め、回答する前に実際の月額料金を教えてくれます。リテールリストはあなたが持っているエンタープライズ契約や予約を無視しているという注意書きも添えています。読み取りだけのツールはプロンプトを促しません。サーバーはAzureのCLIを使わず、サインイン状態を読み取ったり変更したりすることもありません。

トラブルシューティング