在 Google Cloud Platform (GCP) 中,如果你希望一个 Cloud Function (CF) 只能被另一个 Cloud Function 调用,你需要配置适当的身份和访问管理 (IAM) 权限。以下是实现这一目标的步骤:
首先,为调用 Cloud Function 的 Cloud Function 创建一个服务账号。
gcloud iam service-accounts create caller-function-sa \
--display-name "Service account for caller Cloud Function"
接下来,为这个服务账号授予调用目标 Cloud Function 的权限。你需要将 roles/cloudfunctions.invoker
角色绑定到目标 Cloud Function。
gcloud functions add-iam-policy-binding TARGET_FUNCTION_NAME \
--member="serviceAccount:caller-function-sa@YOUR_PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/cloudfunctions.invoker"
将 TARGET_FUNCTION_NAME
替换为目标 Cloud Function 的名称,将 YOUR_PROJECT_ID
替换为你的 GCP 项目 ID。
在调用 Cloud Function 的部署过程中,指定使用刚刚创建的服务账号。
gcloud functions deploy CALLER_FUNCTION_NAME \
--runtime RUNTIME \
--trigger-http \
--service-account caller-function-sa@YOUR_PROJECT_ID.iam.gserviceaccount.com
将 CALLER_FUNCTION_NAME
替换为调用 Cloud Function 的名称,将 RUNTIME
替换为你的 Cloud Function 的运行时(例如 nodejs14
),将 YOUR_PROJECT_ID
替换为你的 GCP 项目 ID。
确保目标 Cloud Function 的触发器配置为 HTTP 触发器,并且没有公开访问权限。
gcloud functions deploy TARGET_FUNCTION_NAME \
--runtime RUNTIME \
--trigger-http \
--no-allow-unauthenticated
将 TARGET_FUNCTION_NAME
替换为目标 Cloud Function 的名称,将 RUNTIME
替换为你的 Cloud Function 的运行时。
在调用 Cloud Function 的代码中,使用 HTTP 请求调用目标 Cloud Function。确保在请求中包含适当的身份验证令牌。
以下是一个使用 Node.js 的示例,展示如何从一个 Cloud Function 调用另一个 Cloud Function:
const { google } = require('googleapis');
const fetch = require('node-fetch');
exports.callerFunction = async (req, res) => {
const targetFunctionUrl = 'https://REGION-PROJECT_ID.cloudfunctions.net/TARGET_FUNCTION_NAME';
// 获取身份验证令牌
const auth = new google.auth.GoogleAuth({
scopes: ['https://www.googleapis.com/auth/cloud-platform']
});
const client = await auth.getClient();
const token = await client.getAccessToken();
// 调用目标 Cloud Function
const response = await fetch(targetFunctionUrl, {
method: 'POST',
headers: {
'Authorization': `Bearer ${token.token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ message: 'Hello from caller function!' })
});
const data = await response.json();
res.status(200).send(data);
};
将 REGION
替换为目标 Cloud Function 部署的区域,将 PROJECT_ID
替换为你的 GCP 项目 ID,将 TARGET_FUNCTION_NAME
替换为目标 Cloud Function 的名称。
领取专属 10元无门槛券
手把手带您无忧上云