Получение ошибки PERMISSION_DENIED даже внутри экземпляра vc gcp при использовании ведения журнала в стеке с помощью bunyan - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь использовать stackdriver logger внутри приложения nodejs с bunyan logger, я использую его для регистрации запросов graphql, и у меня возникли проблемы с настройкой, я следовал за @ google-cloud / Документация logging-bunyan.

Регистратор настроен так:

import { createLogger } from 'bunyan';
import { LoggingBunyan } from '@google-cloud/logging-bunyan';


const streams = [{ stream: process.stdout, level: 'info' as 'info' }];


if (process.env.ENVIRONMENT === 'staging' || process.env.ENVIRONMENT === 'production') {
  const loggingBunyan = new LoggingBunyan();
  streams.push(loggingBunyan.stream('info'));
}


export const logger = createLogger({
  name: 'backend-logger',
  streams,
});

И использование настроено так:

const logRequests = async (ctx: ParameterizedContext, next: () => Promise<any>) => {
  const auth = await authMiddleware(ctx.request);
  ctx.state.auth = auth;
  const start = Date.now();
  await next();
  const duration = Date.now() - start;


  if (ctx.method === 'POST' && ctx.path === process.env.CLIENT_SERVER_ENDPOINT) {
    const { query } = ctx.request.body;
    const logData = {
      query,
      OrganizationId: auth.user?.OrganizationId,
      UserId: auth.user?.id,
      UserName: auth.user?.name,
      duration,
    };
    if (duration > 200) {
      StackLogger.warn(logData);
    } else {
      StackLogger.info(logData);
    }
  }
};

Регистратор настроен только на постановка, проблема в том, что я получаю только nginx журналы доступа (раньше я этого не получал), но не то, что я пропустил для регистрации. При запуске с PM2 я вижу ошибку, когда она должна регистрироваться

1|api  | {"name":"backend-logger","hostname":"backend","pid":6405,"level":30,"msg":"{ logData:\n   { query:\n      'mutation LoginMutation(\\n  $email: String!\\n  $password: String!\\n) {\\n  login(Email: $email, Password: $password) {\\n    Token\\n  }\\n}\\n',\n     OrganizationId: undefined,\n     UserId: undefined,\n     UserName: undefined,\n     duration: 38 } }","time":"2020-01-09T19:17:45.428Z","v":0}
1|api  |   --> POST /graphql 200 48ms 1.71kb
1|api  | You have triggered an unhandledRejection, you may have forgotten to catch a Promise rejection:
1|api  | Error: 7 PERMISSION_DENIED: The caller does not have permission
1|api  |     at Object.callErrorFromStatus (/home/api/sl_api/node_modules/@grpc/grpc-js/src/call.ts:79:24)
1|api  |     at Http2CallStream.call.on (/home/api/sl_api/node_modules/@grpc/grpc-js/src/client.ts:155:18)
1|api  |     at Http2CallStream.emit (events.js:203:15)
1|api  |     at Http2CallStream.EventEmitter.emit (domain.js:448:20)
1|api  |     at process.nextTick (/home/api/sl_api/node_modules/@grpc/grpc-js/src/call-stream.ts:183:14)
1|api  |     at process._tickCallback (internal/process/next_tick.js:61:11)

Он находится внутри экземпляра виртуальной машины gcloud, поэтому я полагаю, что у меня будет разрешение на вход в стекдрайвер. Поэтому я настраиваю учетную запись службы, и даже в этом случае журналы не отображаются в стекдрайвере с тем же сообщением об ошибке в стекдрайвере.

У кого-нибудь есть идеи, как заставить это работать? спасибо

1 Ответ

0 голосов
/ 10 января 2020

Видя ошибку Error: 7 PERMISSION_DENIED: The caller does not have permission, кажется, вы не используете необходимую служебную учетную запись для вызова API. Согласно странице github предварительными условиями являются

  1. Выбор или создание проекта облачной платформы.
  2. Выбор или создание проекта облачной платформы.
  3. Включите API ведения журнала Stackdriver.
  4. Настройте аутентификацию с учетной записью службы , чтобы вы могли получить доступ к API с локальной рабочей станции.

Вы также упомянули вас включили служебную учетную запись, и я предполагаю, что вы предоставили правильный доступ в соответствии с руководством по управлению доступом .

Итак, я хотел бы ознакомиться с Explict Auth Setup чтобы убедиться, что вы вызываете API для правильного проекта и с правильной учетной записью службы.

ПРИМЕЧАНИЕ. Я публикую это как ответ, так как моя текущая репутация не позволяет мне комментировать ваше сообщение. Пожалуйста, не стесняйтесь, дайте мне знать, если я что-то упустил или это не имеет никакого смысла. Я буду редактировать это соответственно.

...