【问题标题】:Azure Data Lake: This request is not authorized to perform this operationAzure Data Lake:此请求无权执行此操作
【发布时间】:2021-03-28 10:25:16
【问题描述】:

这个问题不是This request is not authorized to perform this operation. Azure blobClient的重复问题

我想从 Azure 函数访问 Azure 数据湖。我使用托管身份,并在我的 Data Lake IAM 选项卡中为此功能分配了“所有者”角色。一切正常,但只有当我在我的数据湖中允许“所有网络”时。一旦我切换到“选定的网络”,即使我将 Azure Function 的所有出站 IP 地址都添加到了数据湖的防火墙规则中,我也会收到“此请求无权执行此操作”。

我在 Azure 函数中添加了对 https://api.ipify.org 的调用,以查看其公共 IP 地址。我还使用socket.gethostbyname() 来获取数据湖主机名的解析 IP 地址(只是为了检查这是否可能被解析为 Microsoft 数据中心内的私有 IP,但不是,它是公共 IP)

我的函数的出站 IP 也出现在我的防火墙规则中:

我还是得到了

错误] 执行“Functions.json-deserialize-eventhub”(失败, Id=10554e46-2f5e-42a7-a9f7-a95dad1b4e30,持续时间=1063ms)结果: FailureException: HttpResponseError: 此请求无权 执行此操作 operation.RequestId:84928ea9-201e-0092-5a97-d46e78000000Time:2020-12-17T17:07:38.2792923ZErrorCode:AuthorizationFailureError:NoneStack: File "/azure-functions-host/workers/python/3.8/LINUX/X64/azure_functions_worker/dispatcher.py", 第 355 行,在 _handle__invocation_requestcall_result = await self._loop.run_in_executor(文件 “/usr/local/lib/python3.8/concurrent/futures/thread.py”,第 57 行,在 运行结果 = self.fn(*self.args, **self.kwargs)文件 "/azure-functions-host/workers/python/3.8/LINUX/X64/azure_functions_worker/dispatcher.py", 第 542 行,在 __run_sync_funcreturn func(**params)File “/home/site/wwwroot/json-deserialize-eventhub/init.py”,第 38 行, 在 maindlc.append_object(obj_converted, data_lake_target_url) 文件中 “/home/site/wwwroot/shared/datalake.py”,第 41 行,在 append_objectfor file_system_containers 中的容器:文件 "/home/site/wwwroot/.python_packages/lib/site-packages/azure/core/paging.py", 第 129 行,在 __next__return next(self._page_iterator)File "/home/site/wwwroot/.python_packages/lib/site-packages/azure/core/paging.py", 第 76 行,在 __next__self._response = self._get_next(self.continuation_token)文件 "/home/site/wwwroot/.python_packages/lib/site-packages/azure/storage/blob/_models.py", 第 401 行,在 _get_next_cbprocess_storage_error(error) 文件中 "/home/site/wwwroot/.python_packages/lib/site-packages/azure/storage/blob/_shared/response_handlers.py", 第 147 行,在 process_storage_errorraise 错误

代码本身比较简单,我基本上只是使用azure.storage.filedatalake模块中的DataLakeServiceClient与数据湖通信。

为什么这不起作用?如何允许我的函数写入/读取数据? VNet 集成目前不是一种选择。

【问题讨论】:

  • 也许您需要数据湖数据所有者?
  • @BowmanZhu - 我试过了,但仍然得到“此请求无权执行此操作”。在数据湖的“网络”菜单中将“选定网络”切换为“所有网络”时,它可以工作...

标签: azure azure-functions azure-storage azure-data-lake azure-virtual-network


【解决方案1】:

There 是一种特殊情况,您将存储帐户配置为允许从特定公共 Internet IP 地址范围进行访问。

与存储帐户部署在同一区域的服务使用 用于通信的私有 Azure IP 地址。因此,您不能 根据公共服务限制对特定 Azure 服务的访问 出站 IP 地址范围。

我还看到您的屏幕截图中有一个私有 IP 172.16.0.5。您可以在与 Azure Data Lake 区域不同的区域中的另一个 Azure 函数中创建相同的函数 APP 来验证这一点。

【讨论】:

  • 观察得非常好,这确实有效!问题是:当我不想为函数使用 VNet 集成路由时,现在如何将这些私有 IP 列入白名单?如果这不起作用,那会很奇怪,我必须走间接路线,将这两种资源放入不同的区域,只是为了强制它们走公共路线,这将是一个更便宜的选择(因为我不需要高级计划 VNet 集成)
  • 很遗憾,IP network rules are only allowed for public internet IP addresses. IP address ranges reserved for private networks (as defined in RFC 1918) aren't allowed in IP rules. 另外,我不认为 Azure 已经为我们暴露了 PaaS 存储帐户的底层基础设施,我们也不知道具体的私有 IP 范围。
  • @christian 您已正确指出,当您的 azure 功能使用消费计划并托管在同一区域时,这将成为一个问题。仅仅为此将功能移动到另一个区域似乎不是一个正确的解决方案。从数据湖 gen2 的角度来看,Azure 函数并未被识别为“受信任的 Azure 服务”,对此感到惊讶。有没有人设法解决这个问题,或者微软是否已经在努力解决这个问题?
【解决方案2】:

从错误中,它说 HTTP response error: This request is not authorized to perform this operation.

因此,除了添加“所有者”RBAC 角色外,还请添加“存储 Blob 数据所有者”RBAC 角色。

【讨论】:

  • 不幸的是,这并不能解决问题。我给了我的函数“存储 Blob 数据所有者”角色,并在网络选项中选择了“选定的网络”:“403 - 此请求无权执行此操作”。一旦我切换到“所有网络”,它就可以工作了。
猜你喜欢
  • 2019-10-01
  • 2020-08-16
  • 2019-07-24
  • 2020-11-29
  • 2020-06-21
  • 1970-01-01
  • 2021-12-27
  • 2023-02-01
  • 1970-01-01
相关资源
最近更新 更多