无法使用 cloudbuild.yaml 配置机密以部署到 cloudrun 以实现对话流 basicauth

Posted

技术标签:

【中文标题】无法使用 cloudbuild.yaml 配置机密以部署到 cloudrun 以实现对话流 basicauth【英文标题】:Not able to configure secrets using cloudbuild.yaml to deploy to cloudrun for the purpose of dialogflow basicauth 【发布时间】:2021-10-09 03:13:10 【问题描述】:

我设计了一个简单的对话流程,并尝试通过在代码中提供用户名和密码来启用基本身份验证。它有效。如下所示(参考 check_auth 函数): 应用程序.py 对话框流在给定的用户名和密码下运行良好。我尝试使用 cloudbuild.yaml 通过 CI/CD 部署到 cloudrun,它运行良好。

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

所以,我创建了 name:secret-username,value:myuser 和 name:secret-password,value:mypassword 在秘密管理器中。另外,我在 cloudrun 中引用了秘密,如下所示: 秘密经理截图如下所示: 另外,我对代码进行了如下所示的更改(我将秘密名称引用到用户名而不是硬编码我的用户名值):

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

cloudbuild.yaml 文件如下:

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

【问题讨论】:

你遇到了什么错误? 当我在 dialogflow 中使用给定的用户名和密码进行测试时,我在诊断信息中得到“webhookcallfailed:error:unavailable”。我还更新了 dialogflow 的屏幕截图。@sethvargo @lakshmi 只是为了检查一下,您是否能够在将值传递给 dialogflow 之前打印您的秘密值? 如何获取代码中的秘密值? check_auth 函数很奇怪。 @guillaumeblaquiere 我从有关在对话流中设置基本身份验证的文档中获得了 check_auth,requires_auth,authenticate 函数。但是,如果我像在第一个屏幕截图中添加的那样传递硬编码值,则此代码有效。这是我的 gitlab 链接:gitlab.com/Suchitra1994/dialogflow/-/tree/master。此外,我使用 ngrok 连接到 dialogflow 并将 URL 与用户名和密码一起传递以检查是否它正在工作 【参考方案1】:

你能用这个替换你的 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。因此,您只需将您的秘密作为环境变量读取。在python中os.getenv('...')

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

注意:你的错误是我不喜欢 python 的原因之一。你的代码有未知的secret-usernamesecret-password 有bug,但是没问题,你可以部署它,不用检查,不用编译!

【讨论】:

你能打印日志中的值吗? username 和 os.getenv(...) 比较它们并了解有什么不同 ..非常感谢您抽出宝贵的时间,并感谢您给我代码。实际上您的代码有效。在我上面添加的第二个屏幕截图中,我在左侧给出了“用户名”而不是“秘密用户名”,同时将其引用到秘密用户名:最新...以及您的代码,它有效. 是否也可以提供您提到的任何文档或链接,或者您能否解释一下我们为什么在这里使用 os.getenv...我遇到了 os.getenv 但我认为我们当我们创建一个单独的 .env 文件时必须使用。 我编辑了我的答案。没有 Cloud Run 特定的东西,它只是一个运行时配置。你必须遵守它。如果您需要更多,请告诉我。很乐意提供帮助:)

以上是关于无法使用 cloudbuild.yaml 配置机密以部署到 cloudrun 以实现对话流 basicauth的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Cloud Build 访问 GSM 机密并传递给 Cloud Function

cloudbuild.yaml 包含不同的云构建器配置

cloudbuild.yaml 上的错误:(gcloud.builds.submit)将 cloudbuild.yaml 解释为构建配置:“列表”对象没有属性“项目”

无法使用 Google Cloud 构建从 cloudbuild.yaml 运行 Sonarqube 分析

有啥方法可以从 docker hub 提取图像并使用 cloudbuild.yaml 部署到云运行

Cloudbuild 无法从我的 Vue 应用程序中找到我的 package.json