
本文介绍了如何在 Google Cloud Function 中访问位于不同 GCP 项目中的资源,特别是当 Cloud Function 和资源(如 Secret Manager)属于不同项目时。我们将探讨如何正确地配置权限,避免使用不安全的身份验证方法,并确保 Cloud Function 能够安全地访问所需的资源。
访问跨项目资源:授权是关键
在 Google Cloud Platform (GCP) 中,Cloud Functions 通常运行在特定的服务账号下。 当 Cloud Function 需要访问位于不同项目中的资源时,关键在于授予 Cloud Function 的服务账号相应的权限。 这意味着,你无需尝试为 Cloud Function 注入多个服务账号,而是应该确保 Cloud Function 的服务账号具有访问目标资源的权限。
授权步骤详解
假设你的 Cloud Function 运行在项目 com-project-common 中,并且需要访问位于项目 com-project-data 中的 Secret Manager。你需要执行以下步骤:
找到 Cloud Function 的服务账号: Cloud Function 的服务账号通常具有以下格式:PROJECT_ID@appspot.gserviceaccount.com 或 PROJECT_NUMBER-compute@developer.gserviceaccount.com,其中 PROJECT_ID 是 com-project-common。 你可以在 Cloud Function 的详细信息页面找到它的服务账号。
-
在目标项目(com-project-data)中授予权限: 在 com-project-data 项目中,找到 Secret Manager 服务,并授予 Cloud Function 的服务账号访问权限。 这通常涉及到将 Cloud Function 的服务账号添加到具有 Secret Manager Secret Accessor 角色的成员列表中。 具体操作步骤如下:
- 进入 com-project-data 项目的 IAM & Admin 页面。
- 点击 "GRANT ACCESS"。
- 在 "New principals" 字段中,输入 Cloud Function 的服务账号。
- 在 "Select a role" 字段中,选择 "Secret Manager Secret Accessor"。
- 点击 "Save"。
-
代码示例(Python):
from google.cloud import secretmanager def access_secret_version(project_id, secret_id, version_id="latest"): """ Access the payload for the given secret version if one exists. The version defaults to 'latest' if not specified. """ # Create the Secret Manager client. client = secretmanager.SecretManagerServiceClient() # Build the resource name of the secret version. name = f"projects/{project_id}/secrets/{secret_id}/versions/{version_id}" # Access the secret version. response = client.access_secret_version(name=name) payload = response.payload.data.decode("UTF-8") return payload def your_cloud_function(request): project_id = "com-project-data" # 目标项目 ID secret_id = "your-secret-id" # Secret ID secret_value = access_secret_version(project_id, secret_id) print(f"Secret value: {secret_value}") return "Function executed successfully!"注意: 确保你的 Cloud Function 具有访问 Secret Manager 的权限。 如果你的 Cloud Function 位于与 Secret Manager 不同的项目中,请按照上述步骤授予其服务账号访问权限。 在代码中,明确指定 Secret 所在的 project_id。
避免不安全的做法
强烈建议避免使用服务账号密钥文件进行身份验证。 这种方法存在安全风险,因为它将敏感凭据存储在代码或配置文件中。 最佳实践是使用 Cloud Function 的内置服务账号,并按照上述步骤授予其访问权限。
总结
通过正确配置 IAM 权限,你可以安全地允许 Cloud Function 访问位于不同 GCP 项目中的资源。 避免使用服务账号密钥文件,并始终遵循最小权限原则,只授予 Cloud Function 访问其所需资源的权限。 这种方法可以提高安全性,并简化跨项目资源访问的管理。










