Cloud Task 功能未触发 - 任何需要 App Engine 的资源只能在 App Engine 区域中 created/updated
Cloud Task function not firing -Any resource that needs App Engine can only be created/updated in the App Engine region
我名为 taskToFireOff 的处理程序已删除 allUsers
,Cloud Tasks Enqueuer
委托人的名称设置为 ServiceAccountEmail
,其角色已设置至 Invoker
(未显示)
创建post时,我使用.onCreate
创建任务。 任务已创建,但 http 请求连接到的函数从未触发。我在这里 https://console.cloud.google.com/cloudtasks/queue/ 看到那里有 2 个任务(我试了两次)。
当我转到控制台中的 Cloud Task 页面 > 单击任务 > 任务 > Method / URL
时,它显示
POST https://us-east1-myProjectId.cloudfunctions.net/taskToFireOff
但是当我转到任务 > 日志 > 查看 > 建议 > 查询详细信息时它说
New error group seen in onCreateData: Error: 3 INVALID_ARGUMENT: Any
resource that needs App Engine can only be created/updated in the App
Engine region. Location must equal us-east1 because the App
这是一个奇怪的错误,因为上面的 url 以 us-east1 开头,在我的 index.js 文件中,我使用 us-east1
exports.onCreateData = functions.database.ref('/posts/{postId}').onCreate(async (snapshot, context) => {
const payload = {"postId": context.params.postId};
const project = JSON.parse(process.env.FIREBASE_CONFIG!).projectId;
const location = 'us-east1';
const queue = 'ttl-task';
const serviceAccountEmail = 'yaddayadda@myProjectId.iam.gserviceaccount.com';
const queuePath = tasksClient.queuePath(project, location, queue);
const url = `https://${location}-${project}.cloudfunctions.net/taskToFireOff`
const task = {
httpRequest: {
httpMethod: 'POST',
url,
oidcToken: {
serviceAccountEmail
},
body: Buffer.from(JSON.stringify(payload)).toString('base64'), // JSON.parse(JSON.stringify(payloadData));
headers: {
'Content-Type': 'application/json',
},
},
scheduleTime: {
seconds: // ...
}
}
const [response] = await tasksClient.createTask({ parent: queuePath, task });
// ...
});
exports.taskToFireOff = functions.https.onRequest((request, response) => {
// ...
});
同样在控制台内,当我单击任务本身并查看负载时,所有正确的信息都在那里。
当我创建我的 RealTimeDatabase 时,我得到了 us-central1
但是当我创建存储桶时,我 select 编辑了 us-east1
。在 Firestore 数据库的底部,它说
.
当我输入 $ gcloud app describe
时,它说 locationId 是 us-east1
问题可能是 Cloud Task 在 us-east1
而 Cloud Functions 在 us-central1
?
运行 $ gcloud functions list
列出了我在 us-central1
地区的所有 Cloud Functions
顺便说一句,我创建了另一个项目只是为了查看 select我在创建存储桶时得到的消息。对于存储,无法 select us-central1。有一个默认值 Multi-region nam5(us-central
),但没有 us-central1
的特定区域。我 selected us-east1
因为我在纽约。
问题是 App Engine 在 us-east1
但函数处理程序 taskToFireOff 在 us-central1
。错误是说与 App Engine/Cloud Task 关联的函数需要一起在同一个区域中。简而言之,我需要更改该特定云功能的区域。
为了解决这个问题,我必须创建一个非常简单的新处理程序。我遵循了这个 answer which led me to this link 特别是 Change a function's regions or regions 部分。
第一航站楼 I 运行:
$ gcloud app describe
// use whatever appears for the locationId which for me was us-east1
2nd- 我将这个新函数添加到 index.js 文件中:
// whatever appeared for the locationId I put inside the region param
exports.newTaskToFireOff = functions.region('us-east1').https.onRequest((request, response) => {
// ... in here I c+p all of the code from my initial taskToFireOff function
});
3rd- 我 运行 在终端中用新功能更新 gcloud
$ firebase deploy --only functions:newTaskToFireOff
4th- 我 运行 在终端中删除 gcloud 中的旧函数:
$ firebase functions: delete taskToFireOff
5th- 我进入我的 index.js 文件并手动删除了整个 taskToFireOff。您不需要旧函数,只需要其中的代码
// I deleted this old function
exports.taskToFireOff = functions.https.onRequest((request, response) => {
// ... I took this code and c+p inside the newTaskToFireOff before I deleted this function
});
7-
当我转到控制台的 Cloud Functions page 时,旧的 taskToFireOff 不再存在,而 newTaskToFireOff 与区域 us-east1
完成这些步骤后,请不要忘记第 2 步中的新功能,您必须转到云控制台(使用上面的 link)并更改其 Permissions
。将角色设置为 Invoker
并将其主体角色名称设置为使用您为 Cloud Task 的 ServiceAccountEmail
设置的任何名称,否则它仍然无法工作。你也应该删除 allUsers
。
我名为 taskToFireOff 的处理程序已删除 allUsers
,Cloud Tasks Enqueuer
委托人的名称设置为 ServiceAccountEmail
,其角色已设置至 Invoker
(未显示)
创建post时,我使用.onCreate
创建任务。 任务已创建,但 http 请求连接到的函数从未触发。我在这里 https://console.cloud.google.com/cloudtasks/queue/ 看到那里有 2 个任务(我试了两次)。
当我转到控制台中的 Cloud Task 页面 > 单击任务 > 任务 > Method / URL
时,它显示
POST https://us-east1-myProjectId.cloudfunctions.net/taskToFireOff
但是当我转到任务 > 日志 > 查看 > 建议 > 查询详细信息时它说
New error group seen in onCreateData: Error: 3 INVALID_ARGUMENT: Any resource that needs App Engine can only be created/updated in the App Engine region. Location must equal us-east1 because the App
这是一个奇怪的错误,因为上面的 url 以 us-east1 开头,在我的 index.js 文件中,我使用 us-east1
exports.onCreateData = functions.database.ref('/posts/{postId}').onCreate(async (snapshot, context) => {
const payload = {"postId": context.params.postId};
const project = JSON.parse(process.env.FIREBASE_CONFIG!).projectId;
const location = 'us-east1';
const queue = 'ttl-task';
const serviceAccountEmail = 'yaddayadda@myProjectId.iam.gserviceaccount.com';
const queuePath = tasksClient.queuePath(project, location, queue);
const url = `https://${location}-${project}.cloudfunctions.net/taskToFireOff`
const task = {
httpRequest: {
httpMethod: 'POST',
url,
oidcToken: {
serviceAccountEmail
},
body: Buffer.from(JSON.stringify(payload)).toString('base64'), // JSON.parse(JSON.stringify(payloadData));
headers: {
'Content-Type': 'application/json',
},
},
scheduleTime: {
seconds: // ...
}
}
const [response] = await tasksClient.createTask({ parent: queuePath, task });
// ...
});
exports.taskToFireOff = functions.https.onRequest((request, response) => {
// ...
});
同样在控制台内,当我单击任务本身并查看负载时,所有正确的信息都在那里。
当我创建我的 RealTimeDatabase 时,我得到了 us-central1
但是当我创建存储桶时,我 select 编辑了 us-east1
。在 Firestore 数据库的底部,它说
当我输入 $ gcloud app describe
时,它说 locationId 是 us-east1
问题可能是 Cloud Task 在 us-east1
而 Cloud Functions 在 us-central1
?
运行 $ gcloud functions list
列出了我在 us-central1
地区的所有 Cloud Functions
顺便说一句,我创建了另一个项目只是为了查看 select我在创建存储桶时得到的消息。对于存储,无法 select us-central1。有一个默认值 Multi-region nam5(us-central
),但没有 us-central1
的特定区域。我 selected us-east1
因为我在纽约。
问题是 App Engine 在 us-east1
但函数处理程序 taskToFireOff 在 us-central1
。错误是说与 App Engine/Cloud Task 关联的函数需要一起在同一个区域中。简而言之,我需要更改该特定云功能的区域。
为了解决这个问题,我必须创建一个非常简单的新处理程序。我遵循了这个 answer which led me to this link 特别是 Change a function's regions or regions 部分。
第一航站楼 I 运行:
$ gcloud app describe
// use whatever appears for the locationId which for me was us-east1
2nd- 我将这个新函数添加到 index.js 文件中:
// whatever appeared for the locationId I put inside the region param
exports.newTaskToFireOff = functions.region('us-east1').https.onRequest((request, response) => {
// ... in here I c+p all of the code from my initial taskToFireOff function
});
3rd- 我 运行 在终端中用新功能更新 gcloud
$ firebase deploy --only functions:newTaskToFireOff
4th- 我 运行 在终端中删除 gcloud 中的旧函数:
$ firebase functions: delete taskToFireOff
5th- 我进入我的 index.js 文件并手动删除了整个 taskToFireOff。您不需要旧函数,只需要其中的代码
// I deleted this old function
exports.taskToFireOff = functions.https.onRequest((request, response) => {
// ... I took this code and c+p inside the newTaskToFireOff before I deleted this function
});
7-
当我转到控制台的 Cloud Functions page 时,旧的 taskToFireOff 不再存在,而 newTaskToFireOff 与区域 us-east1
完成这些步骤后,请不要忘记第 2 步中的新功能,您必须转到云控制台(使用上面的 link)并更改其 Permissions
。将角色设置为 Invoker
并将其主体角色名称设置为使用您为 Cloud Task 的 ServiceAccountEmail
设置的任何名称,否则它仍然无法工作。你也应该删除 allUsers
。