Tech Room 兎丸の技術部屋

クラウドエンジニアによる技術ノート・日記

Request originated from client IP * through public internet. This is blocked by your Cosmos DB account firewall settings.

背景:

サービス エンドポイントもしくはプライベート エンドポイント経由で Azure Cosmos アカウントに接続する際に発生したエラーです。

KeyWord

Azure Cosmos DB

原因:

Azure Cosmos アカウントのファイアウォールはインターネットからアクセスをブロックしました。

解決方法

  1. ファイアウォール設定を見直し、接続元の Vnet からのアクセスを許可します。
  2. プライベート エンドポイントを使っている場合、nslookup コマンドで全てのプライベート エンドポイントへの名前解決ができていることを確認します。 (注:DNS の代わりに Hosts ファイルを使っている場合、各エンドポイントのレコードが Hosts ファイルに追加されていることを確認します。)
# グローバル エンドポイント
$ nslookup {databaseaccount}.azure.com
Server:     168.63.129.16
Address:    168.63.129.16#53

Non-authoritative answer:
{databaseaccount}.documents.azure.com   canonical name = {databaseaccount}.privatelink.documents.azure.com.
Name:   {databaseaccount}.privatelink.documents.azure.com
Address: 10.0.0.5 
#リージョン エンドポイント
$ nslookup {databaseaccount}-{region}.azure.com
Server:     168.63.129.16
Address:    168.63.129.16#53

Non-authoritative answer:
{databaseaccount}-{region}.documents.azure.com  canonical name = {databaseaccount}-{region}.privatelink.documents.azure.com.
 Name:  {databaseaccount}-{region}.privatelink.documents.azure.com
Address: 10.0.0.6

The request failed because the client was unable to establish connections to * endpoints across * regions.

背景:

Cosmos データ移行ツールもしくはSDKを使って大量なデータを処理する際に起きたエラーです。

KeyWord

Azure Cosmos DB

原因:

  1. CPU使用率が高い(CPU 測定値が 70% を超える場合、CPU の枯渇によりタイムアウト発生する可能性がございます。) docs.microsoft.com

  2. 直接接続モードに必要なポートがファイアウォールによってブロックされている docs.microsoft.com

    • パブリック/サービス エンドポイントを使用する場合: 10000 から 20000 の範囲のポート
    • プライベート エンドポイントを使用する場合: 0 から 65535 の範囲のポート

原因 1 の場合、ツール、SDK がインストールされている VM をスケールアップ、もしくはクエリで入力データのサイズを減らすことで解決できます。

原因 2 の場合、必要なポートを開くか、ゲートウェイ モード接続を使用することで解決できます。

// Create a new instance of the Cosmos Client in Gateway mode
  this.cosmosClient = new CosmosClient(EndpointUri, PrimaryKey, new CosmosClientOptions()
         {
             ConnectionMode = ConnectionMode.Gateway
         });

注:直接接続モードを使用する場合、TCP プロトコルを介した接続がサポートされ、ネットワーク ホップ数が減るため、ゲートウェイ モード接続よりパフォーマンスが良いので、ご注意ください。

The function 'length' expects its parameter to be an array or a string. The provided value is of type 'Object'.

背景:

こちらのマニュアルで Azure Data Factory を試していた時に起きたエラーです。 docs.microsoft.com

KeyWord

Azure Data Factory, Lookup(検索/参照) Activity

原因:

以下の原因が考えられます。

  1. [First row only](先頭行のみ) フィールドのチェック ボックスをオフにしていません。
  2. [動的なコンテンツの追加] を設定する際、テーブルリストの値を「@activity('LookupTableList').output.value」にしていません。

上記のいずれかの設定が足りなかったことで、期待されるデータ型(ArrayもしくはString)と異なる型のデータが入力されて、Lookup(検索/参照) Activity 内部で使用されている length 関数が実行失敗しました。

上記設定が公式のマニュアルに書いてありますが、結構見落としやすいので、設定する際注意してください。