
在 Google Cloud Functions 中访问不同项目中的资源,关键在于理解服务账户及其权限管理。Cloud Functions 本身拥有一个服务账户,该账户代表了 Cloud Functions 的身份。你需要授予这个服务账户访问其他项目资源的权限,而不是尝试为 Cloud Functions 分配多个身份。
核心概念:服务账户和权限
服务账户是一种特殊的 Google 账户,由应用程序而非个人使用。Cloud Functions 默认使用一个服务账户,其名称格式通常为:PROJECT_ID@appspot.gserviceaccount.com。 你可以通过 Google Cloud Console 查看和修改 Cloud Functions 使用的服务账户。
权限控制的核心在于授予 Cloud Functions 服务账户访问其他项目资源的权限。例如,如果你的 Cloud Functions 位于项目 com-project-common 中,需要访问项目 com-project-data 中的 Secret Manager 密钥,则需要执行以下步骤:
找到 Cloud Functions 的服务账户: 在 Google Cloud Console 中,找到你的 Cloud Function,并查看其服务账户。
在 com-project-data 项目中授予权限: 在 com-project-data 项目的 IAM (Identity and Access Management) 页面,添加 Cloud Functions 的服务账户,并授予其访问 Secret Manager 密钥的权限。 例如,可以授予 "Secret Manager Secret Accessor" 角色。
具体步骤示例:访问 Secret Manager 密钥
假设 Cloud Functions 位于项目 com-project-common,需要访问项目 com-project-data 中名为 my-secret 的 Secret Manager 密钥。
获取 Cloud Functions 的服务账户: 假设 Cloud Functions 的服务账户为 com-project-common@appspot.gserviceaccount.com。
-
在 com-project-data 项目中授予权限:
- 进入 com-project-data 项目的 IAM 页面。
- 点击 "GRANT ACCESS"。
- 在 "New principals" 字段中输入 com-project-common@appspot.gserviceaccount.com。
- 在 "Select a role" 字段中选择 "Secret Manager Secret Accessor"。
- 点击 "SAVE"。
现在,Cloud Functions 就可以访问 com-project-data 项目中的 my-secret 密钥了。
代码示例:使用 Python 访问 Secret Manager 密钥
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.
"""
client = secretmanager.SecretManagerServiceClient()
name = f"projects/{project_id}/secrets/{secret_id}/versions/{version_id}"
response = client.access_secret_version(name=name)
payload = response.payload.data.decode("UTF-8")
return payload
def main(request):
project_id = "com-project-data" # 密钥所在的 Project ID
secret_id = "my-secret" # 密钥的名称
secret_value = access_secret_version(project_id, secret_id)
return f"Secret value: {secret_value}"注意事项:
- 最小权限原则: 始终遵循最小权限原则,仅授予 Cloud Functions 服务账户访问所需资源的最小权限。
- 避免使用服务账户密钥文件: 强烈不建议使用服务账户密钥文件进行身份验证,因为这会带来安全风险。 应该始终使用 Cloud Functions 提供的服务账户。
- IAM 角色: 仔细选择合适的 IAM 角色。 "Secret Manager Secret Accessor" 角色允许访问 Secret Manager 密钥,但如果需要管理密钥,则需要更高的权限,例如 "Secret Manager Admin"。
- 环境变量: 不要将敏感信息(例如密钥)硬编码到代码中。 使用环境变量或 Secret Manager 来存储和管理敏感信息。
总结:
通过正确配置 Cloud Functions 的服务账户权限,可以安全地访问位于不同 GCP 项目中的资源。 避免使用不安全的身份验证方式,例如服务账户密钥文件。 遵循最小权限原则,并仔细选择合适的 IAM 角色。 通过 Secret Manager 安全地管理敏感信息。 理解并应用这些原则,可以构建安全、可维护的 Google Cloud Functions 应用程序。










