1

我一直在我的 Node 应用程序中使用 @google-cloud/secret-manager 插件,该插件以前托管在 Google App Engine 上。

在我将代码移至 Cloud Run 之前,它一直运行良好。我现在收到以下错误:错误:

错误:500 未定义:从插件获取元数据失败并出现错误:无法刷新访问令牌:响应状态代码不成功。

这是我的代码示例:

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访问权限。

非常感谢你的帮助!

4

1 回答 1

5

正如 John Hanley 所说,我在部署 Docker 映像时没有指定任何特定的服务帐户。xxx-compute@developer.gserviceaccount.com默认服务帐户是我的公司为防止出现安全问题而禁用的 Compute Engine 帐户 ( )。

在运行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

谢谢大家的帮助

于 2020-08-12T15:24:00.223 回答