GCP - Невозможно использовать Google Secret Manager (@ google-cloud / secret-manager) внутри Cloud Run

Я использую плагин @ google-cloud / secret-manager в своем приложении Node, ранее размещенном на Google App Engine.

Он работал отлично, пока я не переместил свой код в Cloud Run. Теперь я получаю следующую ошибку: ошибка:

Ошибка: 500 undefined: не удалось получить метаданные из плагина с ошибкой: не удалось обновить токен доступа: код состояния неуспешного ответа.

Вот пример моего кода:

import { SecretManagerServiceClient } from '@google-cloud/secret-manager';

const SECRET = {
  FOO_KEY: 'foo_key',
  BAR_KEY: 'bar_key',
};

const buildSecretName = keyName => {
  const project = process.env.PROJECT_ID;
  return `projects/${project}/secrets/${keyName}/versions/latest`;
};

const accessSecret = async keyName => {
  const client = new SecretManagerServiceClient();
  const name = buildSecretName(keyName);
  
  const [version] = await client.accessSecretVersion({
    name,
  });

  return version.payload.data.toString('utf8');
};

const accessFooKey = async () => {
  const secret = await accessSecret(SECRET.FOO_KEY);
  return secret;
};

После отладки при запуске функции accessSecretVersion возникает исключение. Похоже, плагин secret-manager не может получить текущую учетную запись службы, потому что я запускаю свой код внутри образа Docker?

Вот содержимое моего Dockerfile

FROM node:12

ARG NODE_ENV=production
ENV NODE_ENV ${NODE_ENV}

ARG PROJECT_ID=my-project
ENV PROJECT_ID ${PROJECT_ID}

WORKDIR /usr/src

COPY package.json ./
COPY yarn.lock ./

RUN yarn

COPY . .

RUN yarn api:clean
RUN yarn api:build

EXPOSE 3000
CMD ["yarn", "api:start"]

Он развертывается с помощью триггерной сборки с использованием следующего файла cloudbuild.yaml.

steps:
  - id: build API image
    name: gcr.io/cloud-builders/docker
    args:
      - build
      - -t
      - eu.gcr.io/${_TARGET_PROJECT_ID}/${_SERVICE_NAME}
      - .

  - id: publish API image
    name: gcr.io/cloud-builders/docker
    args:
      - push
      - eu.gcr.io/${_TARGET_PROJECT_ID}/${_SERVICE_NAME}

  - id: deploy
    name: gcr.io/google.com/cloudsdktool/cloud-sdk
    args:
      - gcloud
      - run
      - deploy
      - ${_SERVICE_NAME}
      - --image=eu.gcr.io/${_TARGET_PROJECT_ID}/${_SERVICE_NAME}
      - --project=${_TARGET_PROJECT_ID}
      - --platform=${_RUN_PLATFORM}
      - --region=${_REGION}

images:
  - eu.gcr.io/${_TARGET_PROJECT_ID}/${_SERVICE_NAME}

timeout: 1200s

Для информации, мои секреты доступны для чтения Cloud Run пользовательской учетной записью службы, все они имеют право доступа Secret Manager Secret Accessor.

Спасибо большое за вашу помощь!


person rguerin    schedule 12.08.2020    source источник
comment
Можете ли вы поделиться своим Dockerfile и остальным кодом? Как вы называете accessSecret? Как вы развернули свой сервис в Cloud Run?   -  person sethvargo    schedule 12.08.2020
comment
Я отредактировал свой ответ, указав информацию, которую вы спросили, спасибо за ваше время   -  person rguerin    schedule 12.08.2020
comment
Еще раз проверьте учетную запись службы, назначенную Cloud Run.   -  person John Hanley    schedule 12.08.2020


Ответы (1)


Как заявил Джон Хэнли, я не указывал какую-либо конкретную учетную запись службы при развертывании моего образа Docker. Учетная запись службы по умолчанию - это учетная запись Compute Engine ([email protected]), которая была отключена моей компанией для предотвращения проблем с безопасностью.

Использование пользовательской учетной записи службы при выполнении команды gcloud run deploy решило проблему. Мой deploy шаг теперь выглядит так:

  - id: deploy
    name: gcr.io/google.com/cloudsdktool/cloud-sdk
    args:
      - gcloud
      - run
      - deploy
      - ${_SERVICE_NAME}
      - --image=eu.gcr.io/${_TARGET_PROJECT_ID}/${_SERVICE_NAME}
      - --project=${_TARGET_PROJECT_ID}
      - --platform=${_RUN_PLATFORM}
      - --region=${_REGION}
      - --service-account=custom-service@my-project.iam.gserviceaccount.com

Спасибо за вашу помощь

person rguerin    schedule 12.08.2020