4

Azure Data Lake / Storage にデータをアップロードおよびダウンロードする必要がある Python で記述された "transformerfunction" という Azure 関数を作成しました。また、システム割り当てマネージド ID を有効にし、ストレージ アカウントで "Storage Blob Data Contributor" ロール アクセス許可を関数に付与しました。

ここに画像の説明を入力

ファイルを認証してダウンロードするには、基本的にこれらのドキュメントに従って、コードのこの部分を使用します。

managed_identity = ManagedIdentityCredential()
credential_chain = ChainedTokenCredential(managed_identity)
client = DataLakeServiceClient(account_url, credential=credential_chain)

file_client = client.get_file_client(file_system_container, file_name)
downloaded_file = file_client.download_file()
downloaded_file.readinto(f)

私の理解が正しければ、Azure は関数の ID を認証に使用する必要があり、この ID にはストレージに対する Storage Blob Data Contributor のアクセス許可があるため、ダウンロードは機能するはずです。

ただし、関数を呼び出してログを確認すると、次のように表示されます。

2020-11-23 20:04:11.396 Function called
2020-11-23 20:04:11.397 ManagedIdentityCredential will use App Service managed identity
2020-11-23 20:04:13.105
Result: Failure Exception: HttpResponseError: This request is not authorized to perform this operation. 
RequestId:1f6a2a1c-b01e-0090-26d3-c1d0c0000000 Time:2020-11-23T20:04:13.0679405Z ErrorCode:AuthorizationFailure Error:None Stack:
File "/azure-functions-host/workers/python/3.6/LINUX/X64/azure_functions_worker/dispatcher.py", line 357, in _handle__invocation_request self.__run_sync_func, invocation_id, fi.func, args)
File "/usr/local/lib/python3.6/concurrent/futures/thread.py", line 56, in run result = self.fn(*self.args, **self.kwargs)
File "/azure-functions-host/workers/python/3.6/LINUX/X64/azure_functions_worker/dispatcher.py", line 542, in __run_sync_func return func(**params)
File "/home/site/wwwroot/shared/datalake.py", line 65, in download downloaded_file = client.download_file()
File "/home/site/wwwroot/.python_packages/lib/python3.6/site-packages/azure/storage/filedatalake/_data_lake_file_client.py", line 593, in download_file downloader = self._blob_client.download_blob(offset=offset, length=length, **kwargs)
File "/home/site/wwwroot/.python_packages/lib/python3.6/site-packages/azure/core/tracing/decorator.py", line 83, in wrapper_use_tracer return func(*args, **kwargs)
File "/home/site/wwwroot/.python_packages/lib/python3.6/site-packages/azure/storage/blob/_blob_client.py", line 674, in download_blob return StorageStreamDownloader(**options)
File "/home/site/wwwroot/.python_packages/lib/python3.6/site-packages/azure/storage/blob/_download.py", line 316, in __init__ self._response = self._initial_request()
File "/home/site/wwwroot/.python_packages/lib/python3.6/site-packages/azure/storage/blob/_download.py", line 403, in _initial_request process_storage_error(error)
File "/home/site/wwwroot/.python_packages/lib/python3.6/site-packages/azure/storage/blob/_shared/response_handlers.py", line 147, in process_storage_error raise error

これは、関数がブロブをダウンロードする権利を持っていないことを明確に示しています。しかし、なぜ?どうすればいいですか?

編集:

問題の原因がわかりました。ネットワーク設定で Data Lake ストレージを次のように制限しました。

ここに画像の説明を入力

私の仮定では、「信頼できる Microsoft サービスにこのストレージ アカウントへのアクセスを許可する」は、Azure で実行されている Functions が、選択されているかどうか、またはどのネットワークが選択されているかに関係なく、常にストレージにアクセスできるようにするというものでした。これは事実ではありません。

4

1 に答える 1