gpt4 book ai didi

python - 为什么这个来自 Google Secret Manager API 的 gRPC 调用在 Apache 运行时挂起?

转载 作者:行者123 更新时间:2023-12-04 17:14:28 24 4
gpt4 key购买 nike

简而言之:
我有一个由 Apache 在 Google Compute Engine VM 上提供的 Django 应用程序。
我想在我的 Python 代码中访问来自 Google Secret Manager 的 secret (在 Django 应用程序初始化时)。
当我执行 'python manage.py runserver' 时, secret 被成功检索。但是,当我让 Apache 运行我的应用程序时,它会在向 secret 管理器发送请求时挂起。
太多细节:
我跟着这个问题的答案GCP VM Instance is not able to access secrets from Secret Manager despite of appropriate Roles .我已经创建了一个服务帐户(不是默认的),并赋予它“云平台”范围。我还在 Web 控制台中为其授予了“Secret Manager Admin”角色。
在最初遇到问题后,我从 Web 控制台下载了服务帐户的 json key ,并将 GOOGLE_APPLICATION_CREDENTIALS env-var 设置为指向它。
当我直接在 VM 上运行 django 服务器时,一切正常。当我让Apache运行应用程序时,我可以从日志中看到服务帐户凭据json加载成功。
但是,当我通过 google.cloud.secretmanager.SecretManagerServiceClient.list_secret_versions 进行第一次 API 调用时,应用程序挂起。我什至没有在我的浏览器中收到 500 错误,只是一个永恒的加载图标。我跟踪了执行过程:
grpc._channel._UnaryUnaryMultiCallable._blocking,第 926 行:'call = self._channel.segregated_call(...'
它永远不会越过那条线。我无法弄清楚那个电话的去向,所以我无法进一步检查它。
想法
我不太了解 GCP 服务帐户/API 访问。我不明白为什么 django 开发服务器和 apache 之间会出现这种差异,因为它们都使用来自 json 的相同服务帐户凭据。我也很惊讶应用程序只是卡在 google 库中而不是抛出异常。发送请求时甚至还有一个超时选项,但更改它没有任何区别。
我想知道这是否与我在自己的帐户下运行 django 服务器的事实有某种关系,但是 apache 使用的是它使用的任何用户帐户?
更新
我尝试更改 apache 运行的用户/组以匹配我自己的用户/组。没变化。
我启用了 logging for gRPC itself .我在 apache 和 django 开发服务器上运行时有明显的区别。
在 Django :
secure_channel_create.cc:178] grpc_secure_channel_create(creds=0x17cfda0,target=secretmanager.googleapis.com:443,args=0x7fe254620f20,reserved=(nil))
init.cc:167] grpc_init(void)
client_channel.cc:1099] chand=0x2299b88:为 channel 堆栈 0x2299b18 创建 client_channel
...
timer_manager.cc:188] 休眠 1001 毫秒
...
client_channel.cc:1879] chand=0x2299b88 calld=0x229e440:创建的调用
...
call.cc:1980] grpc_call_start_batch(call=0x229daa0, ops=0x20cfe70, nops=6, tag=0x7fe25463c680, reserved=(nil))
call.cc:1573] ops[0]: SEND_INITIAL_METADATA ...
call.cc:1573] ops[1]: SEND_MESSAGE ptr=0x21f7a20
...
因此,创建了一个 channel ,然后创建了一个调用,然后我们看到 gRPC 开始执行该调用的操作(据我所知)。
在 Apache 上:
secure_channel_create.cc:178] grpc_secure_channel_create(creds=0x7fd5bc850f70,target=secretmanager.googleapis.com:443,args=0x7fd583065c50,reserved=(nil))
init.cc:167] grpc_init(void)
client_channel.cc:1099] chand=0x7fd5bca91bb8:为 channel 堆栈 0x7fd5bca91b48 创建 client_channel
...
timer_manager.cc:188] 休眠 1001 毫秒
...
timer_manager.cc:188] 休眠 1001 毫秒
...

所以,我们创建了一个 channel ……然后什么都没有。没有电话,没有操作。所以 python 代码就在那里等待 gRPC 发出这个调用,它从来没有这样做过。

最佳答案

问题似乎是 Apache 的 fork 行为以某种方式破坏了 gRPC。我无法确定确切的原因,但在我开始怀疑是 fork 问题后,我找到了 this old gRPC issue这表明 fork 是一个有点棘手的领域。
我尝试重新配置 Apache 以使用不同的“多处理模块”,但由于我在这方面的经验有限,我无法让 gRPC 在其中任何一个下工作。
最后,我改用 nginx/uwsgi 而不是 Apache/mod_wsgi,我没有遇到同样的问题。如果您正在尝试解决这样的问题并且必须使用 Apache,我建议您进一步研究 Apache fork 、gRPC 如何处理 fork 以及可用于 Apache 的不同 MPM。

关于python - 为什么这个来自 Google Secret Manager API 的 gRPC 调用在 Apache 运行时挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68933205/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com