当前位置: 首页 > 知识库问答 >
问题:

GCP-无法在Cloud Run中使用Google Secret Manager(@google-cloud/Secret-Manager)

杭柏
2023-03-14

我在我的节点应用程序中使用了@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函数时似乎会引发异常。看起来好像秘密管理器插件无法检索当前服务帐户,是因为我在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

有关信息,我的机密可以通过云运行自定义服务帐户读取,它们都具有机密管理器机密访问器的访问权限。

非常感谢你的帮助!

共有1个答案

盖向荣
2023-03-14

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

运行gcloud run部署命令时使用自定义服务号解决了问题。我的部署步骤现在如下所示:

  - 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

谢谢你们的帮助

 类似资料:
  • 我正在尝试从dataproc spark job获取GCP机密管理器机密。但我得到了错误“线程中的异常”main“java.lang.NoClassDefFoundError:com/google/cloud/secretmanager/v1/AccessSecretVersionResponse”。我在dataproc spark作业依赖项中添加了jar“google-cloud-secretm

  • 我使用GCP秘密管理器来存储密码使用google-Cloud的客户端库(Java)。客户端库期望环境变量中gcp项目的服务号键(json)文件路径。我可以为单个项目这样做,但是当我试图访问多个GCP项目的秘密管理器时,我不知道如何在环境变量中为不同的项目设置密钥。需要在环境中设置键的帮助,或者有一种方法可以使用java代码设置它。 我正在使用这个maven依赖项 https://cloud.goo

  • 我为特勤局经理配置了所需的角色,但当我尝试通过python 3.7代码访问它们时,我收到错误403访问被拒绝: 如果我使用命令行访问它们,它会起作用: 这是python代码:

  • 如果我想发送消息到谷歌PubSub并使用它的消息。您建议使用Spring cloud GCP库还是只使用Google cloud Java API。 有人能区分这两者吗?或者与谷歌云pubsub库相比,Spring Cloud gcp提供了哪些功能。

  • 试图连接到本地谷歌PubSub模拟器从Spring启动应用程序进行测试。 在8085上成功启动本地仿真程序,并设置 注意:当连接到实际的谷歌PubSub主题时,一切都很好。

  • 我想知道你是否能帮我回答以下问题。KMS和GCP中的秘密管理员有什么区别?提前谢谢你。https://cloud.google.com/secret-manager/docs/血红蛋白