首页 > 解决方案 > 如何将 IAM 服务帐号连接到 Cloud SQL 实例

问题描述

在 Google Cloud SQL 上,针对 PostgreSQL 的 IAM 数据库身份验证最近普遍可用。

因此,我仔细按照此处的说明进行操作:Cloud SQL IAM 数据库身份验证概述

我想我已经正确配置了我的 Cloud SQL 实例,因为对于用户帐户,它可以正常工作。简而言之:

  1. 我在我的 Google Cloud 项目中使用了自己的用户帐户并将角色添加CloudSQL Instance Viewer到其中
  2. 我将它添加为我的 CloudSQL 实例的用户
  3. 我授予它所有特权到我的数据库的所有表
  4. 使用此处描述的命令:https://cloud.google.com/sql/docs/postgres/iam-logins,我可以登录到我的数据库:
PGPASSWORD=$(gcloud auth print-access-token) psql --host=HOSTNAME \
                                                  --username=EMAIL \
                                                  --dbname=DATABASE_NAME

伟大的 !

但是现在,我真正没有得到的是它应该如何在使用服务帐户运行的应用程序中工作?医生并没有说太多。这是否意味着我必须以gcloud auth print-access-token编程方式执行此操作并将其结果作为连接到我的数据库的密码传递?

标签: postgresqlgoogle-cloud-sqlgoogle-cloud-iam

解决方案


为了在实例上使用 IAM 用户或 IAM 服务帐户用户身份验证,用户或 SA 电子邮件(或我们在本例中处理的 SA 电子邮件片段)在使用数据库进行身份验证时替换了传统的用户名参数。

此外,密码组件也发生了变化,您没有为 IAM 用户设置密码,而是使用 OAuth2 访问令牌,客户端必须通过单独的 API 调用请求该令牌。这些访问令牌仅在过期后的 60 分钟内有效 - 但是,一旦令牌过期,它不会断开客户端连接,但如果该客户端连接断开并且必须重新连接到实例,并且已经超过一个小时,那么新的访问令牌将需要在新的连接尝试中提取和提供。

对于这个用例,即无人值守的应用程序,服务帐户 IAM 用户是最好的选择。您的客户端实现会希望使用API 客户端库(例如 java),它提供了一个便利类,用于通过 JSON 密钥文件(可从您的云控制台为 SA 下载)提取服务帐户凭据,即,

GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json")).createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN)).refreshIfExpired();

请注意,为了获得适当的访问令牌,必须将范围设置为Cloud SQL Admin API - 上面的示例显示了它在上述库和初始化程序的上下文中是如何工作的。请注意,必须在访问令牌可用之前调用“refreshIfExpired()” 。

拥有 GoogleCredential 实例后,您可以通过调用getAccessToken()它来获取访问令牌,然后可以将其作为服务帐户 IAM 用户名的密码提供给您的数据库客户端的连接参数/字符串,即,

AccessToken token = credential.getAccessToken();

不过,您需要在这里强烈考虑的是此流程是否对您的客户端应用程序有意义。如果您的客户端应用程序通过连接池或其他一些连接管理库访问数据库,这些库会自动重试或使用静态凭证设置新连接 - 由于需要生成新的证书,使用 Postgres IAM 用户身份验证可能不合适在没有访问令牌可用(即第一次登录尝试)或访问令牌已过期的每次连接尝试中的“密码”(访问令牌)。这最终意味着在您的客户端代码中承担更多管理连接建立的责任,


推荐阅读