GCP 云 运行 通过单独项目中的 2 个服务帐户使用短期凭据调用另一个项目云功能
GCP Cloud Run Invoke another Projects Cloud function using short-lived credentials via 2 service accounts in separate Projects
我已经完成了下面的操作,并且一切正常,直到最后一个标记被用来调用一个
云函数。
我在项目 2 中创建了一个服务帐户 (SP),具有 Service-Account-Token-Creator 和 Cloud-Functions-Invoker 角色。我还在项目 1 中使用 Service-Account-Token-Creator 创建了另一个服务帐户 (sc)。我编辑了 SP 的 IAM 绑定,以允许 SC 通过 Service-Account-Token-Creator 角色创建短期凭证。
项目 1 中的以下代码在 CloudRun 上 运行 并且使用服务帐户 SC 作为实例的默认服务帐户。
不确定到底哪里出了问题,但我想做的就是模拟 SP,然后能够调用 SP 帐户中的云功能。
任何有关问题的帮助都会有所帮助。
import { Compute } from 'google-auth-library';
const client = new Compute({
// Specifying the service account email is optional.
serviceAccountEmail:
'sc@swaymeebusinessapp.iam.gserviceaccount.com',
});
const res = await client.request<{
accessToken: string;
expireTime: string;
}>({
url:
'https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/sp@<project-di>.iam.gserviceaccount.com:generateAccessToken',
method: 'POST',
data: JSON.stringify({
delegates: [],
scope: ['https://www.googleapis.com/auth/cloud-platform'],
lifetime: '300s',
}),
});
request.http.headers.set(
'Authorization',
`Bearer ${res.data.accessToken}`
);
我在项目2中调用云函数时出现的错误是
https://us-central1-project-2.cloudfunctions.net/project-2-alpha-TestFunction: 401: Unauthorized
您可以简单地在project2 的Cloud Functions 上授予project1 的服务帐户SC。 SP没用,拟人化也!
- 获取SC邮箱
- 转到您的 Cloud Functions 列表页面并 select 您的函数(复选框)
- 点击右上角的“显示信息面板”
- 将 SC 电子邮件粘贴到会员部分
- Select Cloud Functions Invoker 作为角色。
- 保存
就是这样。 您授予项目 1 的 SC,角色 Function.invoker 在项目 2 的 Cloud Functions 级别
这个定义很重要。如果您创建另一个函数,SC 将无法访问它,因为您仅在函数级别授予角色。
如果你想授权访问project2的所有CLoud Function(不推荐),你可以这样做
不要 select 在 project2 中使用您的 Cloud Functions,而是转到 project2 的 IAM 页面(此处您在项目级别)并单击“添加成员”(页面顶部),粘贴SC 电子邮件并添加角色 CLoud FUnction invoker。
我认为至少部分问题是您调用了 IAM 方法:
generateAccessToken
获取您的短期令牌,然后在调用 Cloud Function 时将其用作身份验证 header - 但对于调用者 IAM 使用,您需要使用从对[的调用中检索到的 OIDC ID 令牌=12=]
我已经完成了下面的操作,并且一切正常,直到最后一个标记被用来调用一个 云函数。
我在项目 2 中创建了一个服务帐户 (SP),具有 Service-Account-Token-Creator 和 Cloud-Functions-Invoker 角色。我还在项目 1 中使用 Service-Account-Token-Creator 创建了另一个服务帐户 (sc)。我编辑了 SP 的 IAM 绑定,以允许 SC 通过 Service-Account-Token-Creator 角色创建短期凭证。
项目 1 中的以下代码在 CloudRun 上 运行 并且使用服务帐户 SC 作为实例的默认服务帐户。
不确定到底哪里出了问题,但我想做的就是模拟 SP,然后能够调用 SP 帐户中的云功能。
任何有关问题的帮助都会有所帮助。
import { Compute } from 'google-auth-library';
const client = new Compute({
// Specifying the service account email is optional.
serviceAccountEmail:
'sc@swaymeebusinessapp.iam.gserviceaccount.com',
});
const res = await client.request<{
accessToken: string;
expireTime: string;
}>({
url:
'https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/sp@<project-di>.iam.gserviceaccount.com:generateAccessToken',
method: 'POST',
data: JSON.stringify({
delegates: [],
scope: ['https://www.googleapis.com/auth/cloud-platform'],
lifetime: '300s',
}),
});
request.http.headers.set(
'Authorization',
`Bearer ${res.data.accessToken}`
);
我在项目2中调用云函数时出现的错误是
https://us-central1-project-2.cloudfunctions.net/project-2-alpha-TestFunction: 401: Unauthorized
您可以简单地在project2 的Cloud Functions 上授予project1 的服务帐户SC。 SP没用,拟人化也!
- 获取SC邮箱
- 转到您的 Cloud Functions 列表页面并 select 您的函数(复选框)
- 点击右上角的“显示信息面板”
- 将 SC 电子邮件粘贴到会员部分
- Select Cloud Functions Invoker 作为角色。
- 保存
就是这样。 您授予项目 1 的 SC,角色 Function.invoker 在项目 2 的 Cloud Functions 级别
这个定义很重要。如果您创建另一个函数,SC 将无法访问它,因为您仅在函数级别授予角色。
如果你想授权访问project2的所有CLoud Function(不推荐),你可以这样做
不要 select 在 project2 中使用您的 Cloud Functions,而是转到 project2 的 IAM 页面(此处您在项目级别)并单击“添加成员”(页面顶部),粘贴SC 电子邮件并添加角色 CLoud FUnction invoker。
我认为至少部分问题是您调用了 IAM 方法:
generateAccessToken
获取您的短期令牌,然后在调用 Cloud Function 时将其用作身份验证 header - 但对于调用者 IAM 使用,您需要使用从对[的调用中检索到的 OIDC ID 令牌=12=]