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

我如何与micronaut 3和谷歌秘密经理合作?

赏光霁
2023-03-14

目前正在将我的应用程序迁移到Micronaut 3,我遇到了Micronaut gcp的一个问题。尤其是谷歌秘密经理。我正在使用gradle和Kotlin DSL。

实际配置:(不工作,使用插件io.micronaut.libraryversion2.0.4

  • gradle 7.2

以前的配置:(不使用插件,使用micronaut bom)

  • gradle 6.5.1

我知道问题所在

我的目标是将一些秘密作为键/值对加载到属性源中。我按照说使用bootstrap.yml的留档如下:

micronaut:
    config-client:
        enabled: true
gcp:
    secret-manager:
      keys:
        - MY_SECRET

然后在我的课堂上,我应该能够使用@value注释注入这个秘密值。事实上,我是在测试中这样做的。我使用的是jUnit5中的@MicronautTest注释,所以我有如下内容:

@MicronautTest
public class MyClass {
  @Value("${my.secret}")
  private String mySecret;
}

然后出现了问题,当运行任何测试时,它在初始化时失败,原因是:

Error instantiating bean of type  [io.micronaut.gcp.secretmanager.client.DefaultSecretManagerClient]

Message: getTransportChannel() called when needsExecutor() is true
Path Taken: new DistributedPropertySourceLocator(ConfigurationClient configurationClient,Duration readTimeout) --> new DistributedPropertySourceLocator([ConfigurationClient configurationClient],Duration readTimeout) --> new DefaultCompositeConfigurationClient([ConfigurationClient[] configurationClients]) --> new SecretManagerConfigurationClient([SecretManagerClient secretManagerClient],SecretManagerConfigurationProperties configurationProperties) --> new DefaultSecretManagerClient([SecretManagerServiceClient client],Environment environment,GoogleCloudConfiguration googleCloudConfiguration,ExecutorService executorService)
io.micronaut.context.exceptions.BeanInstantiationException: Error instantiating bean of type  [io.micronaut.gcp.secretmanager.client.DefaultSecretManagerClient]

我试过什么?

当我看到这一点时,我在想可能是引导。yaml事情不起作用了,我试图通过注入SecretManagerServiceClient使用较低级别的权限访问secret manager,如下所示:

@MicronautTest
public class MyClass {
  @Inject
  private SecretManagerServiceClient client;

  private void someTest() {
    String mySecret = client.getSecret("MY_SECRET");
  }
}

但得到了相同的错误消息:当needsExecutor()为true时调用getTransportChannel(),路径相同。

我还试图升级到micronaut 3.0.1,但没有做任何改变。

我的解决方案

因为我的问题是在我的ci/cd过程的测试阶段检索一个秘密,因为我正在使用Google Cloud Build。我可以使用我的cloudbuild中的AvailableCrets功能传递秘密。yaml

steps:
 ...
  - name: 'gradle'
    entrypoint: 'bash'
    args: ['./gradlew', 'test']
    secretEnv: ['MY_SECRET']
 ...

availableSecrets:
  secretManager:
  - versionName: projects/PROJECT_ID/secrets/MY_SECRET/versions/latest
    env: 'MY_SECRET'

然后将其传递到我的应用程序中。yml

my:
  secret: ${MY_SECRET}

然后在我的代码中:

@MicronautTest
public class MyClass {
  @Value("${my.secret}")
  private String mySecret;
}

但是我觉得这个解决方案不是很令人满意,因为我发现引导。yaml

如果有人给我一个解决方案或一个想法/建议,我很乐意接受。

祝您有个美好的一天!

共有1个答案

郗缪文
2023-03-14

我去过那个兔子洞。长话短说,通过将google cloud secretmanager依赖项从1.6.4升级到2.0.2,我克服了这个问题

像这样:

    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-secretmanager</artifactId>
      <version>2.0.2</version>
    </dependency>
 类似资料:
  • 将来自Google secret Manager的秘密注入Kubernetes部署的最佳实践是什么?我已将Grafana实例的管理员密码存储到Google Secret Manager中。Grafana实例是使用Google Kubernetes引擎上的helm图表部署的。我确实尝试过使用kube secrets init,这是一个Kubernetes变异的网络钩子,它变异了任何引用秘密Googl

  • 我按照在Spring Boot上使用GCP设置秘密管理器的说明,在Google Cloud中创建了一个秘密,并在application.properties中添加了以下内容 但是,它不起作用,如果我使用,我可以通过

  • 我的应用程序需要一堆秘密来运行:数据库凭据、API凭据等。它在Google App Engine StandardJava11中运行。我需要这些秘密作为环境变量或应用程序的参数,以便我的框架可以拾取它们并相应地建立连接。我的特定框架是Spring Boot,但我相信Django、Rails和许多其他框架使用相同的方法。 最好的方法是什么? 我对这个问题的一个答案是使用谷歌云密钥管理,这看起来很有希

  • 在过去的几个小时里,我一直在谷歌上搜索,看看是否可以从AWS Lambda或我的本地PC等外部服务中使用Google Secret Manager。我找不到任何有用的东西,也找不到一些正确描述执行步骤的东西。 我不想玩API,最终通过OAuth进行身份验证,我希望使用客户端库。我该怎么做呢? 到目前为止,我已经提到了以下链接: https://cloud.google.com/secret-man

  • 我正在构建一个需要访问mysql的数据工作室连接器(应用程序脚本)。 我的所有凭据都存储在GCP Secret Manager中,希望我的应用程序脚本从Secret Manager获取凭据。 我查过了https://developers.google.com/apps-script文档,但找不到访问Secret Manager的相关类。 应用脚本获取存储在秘密管理器中的凭据的最佳方式是什么?

  • 小红书博主@Feng 整理的谷歌产品经理面经 #谷歌# #产品经理# #产品经理面经#