首页 > 解决方案 > 无法使用 cloudbuild.yaml 配置机密以部署到 cloudrun 以实现对话流 basicauth

问题描述

我设计了一个简单的对话框流,并尝试通过在代码中提供用户名和密码来启用基本身份验证。它有效。如下所示(参考 check_auth 函数):
app.py 在此处输入图像描述 对话框流在给定的用户名和密码下工作正常。我尝试部署使用 cloudbuild.yaml 通过 CI/CD 运行 cloudrun,它工作正常。

现在,我想使用秘密管理器来存储用户名和密码,而不是在代码中提供。

因此,我在秘密管理器中创建了名称:secret-username、:myuser 和名称:secret-password、:mypassword。此外,我在 cloudrun 中引用了秘密,如下所示: 在此处输入图像描述 秘密管理器屏幕截图如下所示: 在此处输入图像描述 另外,我对代码进行了更改,如下所示(我将秘密名称称为用户名,而不是硬编码我的用户名值): 在此处输入图像描述

它已通过 cloudbuild 成功部署到 cloudrun。但是,Dialogflow 不接受我的用户名和密码。当我没有在 dialogflow 中提供任何预期的凭据时,它会给出未经身份验证的错误。但是,当我将用户名和密码设置为“”myuser”时和 secretmanager 值中提到的“mypassword”,它给出了 webhookcallfailed:error:unavailable,如下所示: 在此处输入图像描述

cloudbuild.yaml 文件如下: 在此处输入图像描述

此外,我已在云构建设置中启用了所有必需的权限(秘密管理员、服务帐户、cloudrun)。你能帮我解决这个问题吗?这与任何权限问题或与代码有关吗?

标签: google-cloud-platformdialogflow-esgoogle-secret-managercloudbuild.yaml

解决方案


你可以用这个替换你的 check_auth 函数吗?

def check_auth(username, password):
    return username == os.getenv('secret-username') and password == os.getenv('secret-password')

编辑 1

您的第一个屏幕截图,清楚地提到了:Exposed as an Environment Variables。因此,您只需将您的秘密作为环境变量读取。在蟒蛇os.getenv('...')

您还可以将机密加载为卷(最后是 Cloud Run 中的文件)。如果这样做,请将您的秘密作为文件读取。

注意:您的错误是我不喜欢 python 的原因之一。您的代码存在未知问题,secret-username并且secret-password,但没问题,您可以部署它,无需检查,无需编译!


推荐阅读