![azblob://2023/01/05/eyecatch/2023-01-05-private-connection-between-cognitive-services-for-language-and-cognitive-search-000.jpg](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/2023/01/05/eyecatch/2023-01-05-private-connection-between-cognitive-services-for-language-and-cognitive-search-000.jpg)
誰もがすなるぶろぐといふものを、私もしてみむとてするなり。
はじめに
こんにちは。(おそらく)1年ぶりにブログを書きます。酒井です。
最近縁あってAzure Cognitive Services for Language(以下、Language)とAzure Cognitive Search(以下、Search)を触っております。
聡明な読者の皆様なら既にお気づきかと思います。そうです、QnA Maker(以下、QnA)の後継サービス(どちらかというと機能?)です。
残念ながら、QnAは2025/03/31を持って廃止されてしまいます。悲しいですね。ですが、同じような機能がLanguageのカスタム質問応答機能として提供されます。やったね。
こやつらは、デフォルトでパブリックアクセスが有効になっており、すべてのネットワークからアクセスできてしまいます。APIアクセスにはキーが必要なのですが、あんまりいい気はしないですよね?
はい、ではこちらを見てください。では。
と言いたいところですが、ほんのちょっっっっっとだけ分かりづらく、詰まってしまいがちな部分なので備忘録として残しておきます。
前提
予めLanguageのリソースを作成して、カスタム質問応答機能を有効にしておいてください。(カスタム質問応答を有効にするタイミングでSearchのリソースも一緒に作ることができます。)
このようになっていたらOKです。
(ここから先は動作確認用です。)
また、Language Studioで適当なナレッジベースを作成してデプロイしておいてください。
方法はこちらの記事が大変参考になると思います。
【第二回】Azure Cognitive Services for Language で簡単テキスト分析!~質問応答を使ってみる編~
それでも難しい場合は、千尋の谷に落とされたと思って這い上がってみましょう。
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/image_25.png)
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/image_26.png)
手順
0. 試しにAPIを叩いてみる
まずは、ちゃんとAPIが叩けるか確認してみましょう。
LanguageはQuestion Answering - Get Answersを。
Searchはインデックスの一覧表示 (Azure Cognitive Search REST API)を叩いてみましょう。
Languageはこのようなレスポンスが返ってきます。
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/image_27.png)
Searchはこのようなレスポンスが返ってきます。
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/image_28.png)
ちなみに、APIキーをヘッダーに入れ忘れると、このようになります。
Language
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/image_30.png)
Search
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/image_33.png)
確認できましたね。APIキーはAzure Portalで確認できるので、探してみてください。
それでは、設定していきましょう。
1. LanguageリソースにSearchリソースの「共同作成者」のロールを割り振る
まず、Languageに紐づいたSearchリソースのアクセス制御(IAM)を開きます。
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/2023-01-05-private-connection-between-cognitive-services-for-language-and-cognitive-search-002_0.png)
[+ 追加] > ロールの割り当ての追加と進みます。
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/2023-01-05-private-connection-between-cognitive-services-for-language-and-cognitive-search-003.png)
あとは流れで割り当ててください。
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/2023-01-05-private-connection-between-cognitive-services-for-language-and-cognitive-search-004.png)
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/2023-01-05-private-connection-between-cognitive-services-for-language-and-cognitive-search-005.png)
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/2023-01-05-private-connection-between-cognitive-services-for-language-and-cognitive-search-006_0.png)
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/2023-01-05-private-connection-between-cognitive-services-for-language-and-cognitive-search-007.png)
このようになっていたらOKです。次いきましょ。
2. Searchリソースのパブリックアクセスを無効化する
お次はそのままネットワークを開きます。
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/2023-01-05-private-connection-between-cognitive-services-for-language-and-cognitive-search-008.png)
無効をクリックするとこのようなダイアログが出てくるのでOKを押してください。
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/2023-01-05-private-connection-between-cognitive-services-for-language-and-cognitive-search-009.png)
ちゃんとしばらく時間がかかるので、しばらく待ちます。
(公式ドキュメントによると最大30分かかることがあるとかなんとか)
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/2023-01-05-private-connection-between-cognitive-services-for-language-and-cognitive-search-010.png)
完了したらこのようになります。
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/2023-01-05-private-connection-between-cognitive-services-for-language-and-cognitive-search-011.png)
これでSearchのパブリックアクセスが無効化できました。次いきましょ。
3. Languageリソースにアクセス制限を入れる
いよいよ大詰めです。1つ前の手順とは打って変わって、今度はLanguageのリソースを開きます。
ネットワークを開き、選択したネットワークとプライベートエンドポイントを選びます。
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/2023-01-05-private-connection-between-cognitive-services-for-language-and-cognitive-search-012.png)
するとこのようになるので、お好きな仮想ネットワークを選ぶなりなんなりしてください。
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/2023-01-05-private-connection-between-cognitive-services-for-language-and-cognitive-search-013.png)
Saveを押したらぼちぼち待ちます。
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/2023-01-05-private-connection-between-cognitive-services-for-language-and-cognitive-search-014.png)
ちゃんと更新されたらOKです。
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/2023-01-05-private-connection-between-cognitive-services-for-language-and-cognitive-search-015.png)
そうすると、あらびっくり。Searchリソースにプライベートエンドポイントが生えているではありませんか。良かったですね。
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/2023-01-05-private-connection-between-cognitive-services-for-language-and-cognitive-search-016.png)
4. 制限がかかっていることを確認する
最後に動作確認してみましょう。一番最初と同じようにAPIを叩いてみます。
Languageは同じように叩けますね。
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/2023-01-05-private-connection-between-cognitive-services-for-language-and-cognitive-search-017.png)
しかし、Searchはタイムアウトするようになりました。ちゃんと制限がかかってますね。すばらしい。
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/2023-01-05-private-connection-between-cognitive-services-for-language-and-cognitive-search-018.png)
ちなみに、Languageを別のIPから叩くと、ちゃんとブロックしてくれます。すばらしい。
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/%5Bdate%3Acustom%3AY%5D/%5Bdate%3Acustom%3Am%5D/%5Bdate%3Acustom%3Ad%5D/articleimages/image_39.png)
これでLanguageとSearchがプライベートに接続され、SearchはLanguageからのみアクセスできるようになりました。また、Languageも特定のIPからのみアクセスできるようになりました。
実際にアプリにLanguageを組み込む場合は、特定の仮想ネットワークからのアクセスを許可して使うことになると思います。
えーそれでは良い感じになったので、あとはよしなにやってください。では。