GCP Cloud Run Вызов другой функции Projects Cloud с использованием недолговечных учетных данных через 2 сервисные учетные записи в отдельных проектах - PullRequest
1 голос
/ 07 августа 2020

Я сделал следующее, и все это работает до момента, когда последний токен используется для вызова облачной функции.

Я создал учетную запись службы (SP) в Project 2 с помощью Service- Роли Account-Token-Creator и Cloud-Functions-Invoker. Я также создал другую учетную запись службы (s c) в Project 1 с помощью Service-Account-Token-Creator. Я отредактировал привязки IAM для SP, чтобы позволить S C создавать краткосрочные учетные данные через роль Service-Account-Token-Creator.

Этот код ниже, в Project 1, работает в CloudRun и с учетной записью службы S C в качестве учетной записи службы по умолчанию для данного экземпляра.

Не уверен, что действительно не так, но все, что я пытаюсь сделать, это выдать себя за 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

Ответы [ 2 ]

2 голосов
/ 07 августа 2020

Вы можете просто предоставить сервисный аккаунт S C проекта1 в облачных функциях проекта2. SP бесполезен, олицетворение тоже!

  • Получите адрес электронной почты S C
  • Go на страницу списка облачных функций и выберите свою функцию (флажок)
    • Нажмите «Показать информационную панель» в правом верхнем углу
    • Вставьте электронное письмо S C в раздел для участников
    • Выберите Cloud Functions Invoker в качестве роли. введите описание изображения здесь
  • сохранить

Вот и все. Вы предоставляете S C проекту1 с ролью Function.invoker на уровне облачных функций проекта2

Это определение важно. Если вы создадите другую функцию, S C не сможет ее достичь, потому что вы предоставляете роль только на уровне функции.

Если вы хотите предоставить доступ ко всем функциям облака проекта2 (это не рекомендуется), вы можете сделать это так:

Вместо того, чтобы выбирать свои облачные функции в проекте2, go на странице IAM проекта2 (здесь вы находитесь на уровне проекта) и нажмите Добавьте участника (вверху страницы), вставьте электронное письмо S C и добавьте роль вызывающего объекта CLoud FUnction.

1 голос
/ 07 августа 2020
• 1000 при использовании Inoker IAM вам необходимо использовать OID C ID Token, полученный при вызове

https://cloud.google.com/iam/docs/reference/credentials/rest/v1/projects.serviceAccounts/generateIdToken

...