CloudFoundry CLI - 获取绑定凭证

问题描述

有没有办法从 PCF CLI 获取绑定凭据? 例如,我想获取数据库凭据。

更多详情:

当您使用 Redis、cloudsql 等服务时,在 manifest.yml 文件中,pcf 会绑定这些服务并生成凭据,然后应用程序使用它们。如果我想让凭证在本地使用,我需要登录 PCF 并转到服务以获取这些凭证。相反,我希望能够从 cli 获取这些凭据,而无需登录 pcf UI。 cf env <service> 显示 VCAP_SERVICES json。但是对于数据库,它不显示凭据。不过,它显示为 Redis。对于数据库,我必须转到 Web 和服务,然后转到数据库服务以获取凭据。

解决方法

鉴于缺乏细节,这有点猜测,但是,服务将其凭据存储在 CredHub 中而不是将它们存储在 Cloud Controller 中的情况越来越普遍。如果您按照评论中的建议查看环境变量,则会在 VCAP_SERVICES 中看到占位符条目。

如果这就是您所看到的,您需要更进一步来检索凭据(这是服务执行此操作的确切点,它使破坏服务的凭据变得更加困难)。

  1. cf ssh 进入您的应用容器
  2. 运行curl -vv -i -H 'Content-Type: application/json' --cert /etc/cf-instance-credentials/instance.crt --key /etc/cf-instance-credentials/instance.key -d "$VCAP_SERVICES" 'https://credhub.service.cf.internal:8844/api/v1/interpolate' | jq .

这看起来很神奇,所以我会分解它。

a.) 它使用 curl 查询 CredHub 的 /api/v1/interpolate 端点。此 API 接收带有占位符的 VCAP_SERVICES 的内容,并返回一个没有占位符的版本。 b.) -d "$VCAP_SERVICES" 会将请求的正文设置为 $VCAP_SERVICES 的内容。这正是 API 调用所期望的。 c.) 您告诉 curl 使用 /etc/cf-instance/credentials.key/etc/cf-instance/credentials.crt 处的证书和密钥执行双向 TLS。这允许您使用 Credhub 进行身份验证。 d.) 结果是 JSON,所以 jq . 只是漂亮地打印响应。这是可选的。

您可以使用以相同方式配置的 HTTP 客户端,以您选择的编程语言实现相同的功能。不过,您必须从容器内部执行此操作,因为 CredHub 只能从那里获得,而且因为这是您可以获得向 CredHub 进行身份验证所需的证书/密钥的唯一地方。