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 的处理程序已删除 allUsersCloud 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 但函数处理程序 taskToFireOffus-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