【问题标题】:How to change credentials for a given service in Cloud Foundry如何更改 Cloud Foundry 中给定服务的凭据
【发布时间】:2019-04-19 11:16:01
【问题描述】:

我想知道如何(以及是否可以)从 Cloud Foundry 中的服务更改 URI 凭据。更具体地说,来自 Pivotal Cloud Foundry 的 mLab 服务(免费计划)。


背景

我创建了一个 nodejs 应用并将其推送到 Pivotal Cloud Foundry。

此应用使用免费计划绑定到 mLab 服务。

使用 Pivotal 网站创建 mLab 服务时,它会自动创建一个包含用户名和密码的数据库。

在 Pivotal 网站中打开应用程序设置,我可以看到以下环境变量。请注意 credentials 内的 mongo uri 和 mLab 内的 name

{
  "staging_env_json": {},
  "running_env_json": {},
  "system_env_json": {
    "VCAP_SERVICES": {
      "mlab": [
        {
          "label": "mlab",
          "provider": null,
          "plan": "sandbox",
          "name": "users",
          "instance_name": "users",
          "binding_name": null,
          "credentials": {
            "uri": "mongodb://CloudFoundry_someusergenerated:apasswordgeneratedautomatically@somehost.mlab.com:someport/CloudFoundry_database_name"
          }
        }
      ]
    }
  },
  "application_env_json": {
    "VCAP_APPLICATION": {
      "cf_api": "https://donotuseapi.run.pivotal.io",
      "application_name": "website",
      "application_uris": [
        "xxx.cfapps.io"
      ],
      "name": "website",
      "space_name": "space1",
      "uris": [
        "xxx.cfapps.io"
      ]
    }
  }
}

使用此默认用户和密码与数据库的连接可以正常工作。为了从环境变量中获取mongodb uri,我使用的是npm包cfenv

const appEnv = require('cfenv').getAppEnv();
    const env = process.env;
    keys = { 
        mongodb: {
            dbURI: appEnv.getServiceURL(env.MONGO_SERVICE_NAME)
        }
    };

在我的 manifest.yaml 文件中,我使用环境变量中的服务名称相应地指定了这个 MONGO_SERVICE_NAME

---
applications:
- name: website
  memory: 128M
  disk_quota: 256M
  random-route: true
  buildpack: nodejs_buildpack
  health-check-type: port
  env:
    MONGO_SERVICE_NAME: 'users'

同样,数据库连接工作正常。

===

然后我为这个特定的数据库打开了 mLab 网站并创建了一个新的数据库用户。

现在我想从 VCAP_SERVICES(环境变量)更新credentials.uri,以便此特定服务使用新用户和密码。

据我所知,cf update-service CLI 命令并不是这个意思,所以我想知道这是否是来自 Cloud Foundry、Pivo​​tal 或 mLab 的限制。我敢打赌,这个限制是由于我使用的是 Pivotal 试用帐户和 mLab 免费计划,但是如果我升级计划,我的问题仍然是一样的。

谢谢,

【问题讨论】:

  • 只需解绑并重新绑定它,我希望它会生成一组新的凭据。
  • 我想使用在 mLab 网站中手动创建的凭据
  • 为什么?绑定服务的全部意义在于您不必担心这一点。
  • 您在寻找什么“精细控制”?不,它不会改变 VCAP_SERVICES,因为该 env var 的重点是反映 实际绑定的服务
  • 某些服务在绑定时接受参数,例如cli.cloudfoundry.org/en-US/cf/bind-service.html。我不知道 MLab 是否这样做,但据我所知,这是您可以提供的唯一可能更改绑定凭据的配置。

标签: mlab cloud-foundry


【解决方案1】:

作为用户,您无法更改由服务代理生成的VCAP_SERVICES 条目。这些是固定的,无法更改。

如果你cf create-service'd 了一个服务,那么它是由服务代理创建的,你得到的正是服务提供商给你的。正如 cmets 中提到的,根据服务代理,您可以使用cf create-service -c 将参数传递给代理。检查您的服务提供商的文档,看看是否有一个选项可以影响以您希望的方式生成的凭据。

如果您的服务提供商不提供执行您想要的操作的选项,您可以创建一个服务密钥,而不是将您的服务绑定到应用程序。这将为您提供一组服务凭证,该凭证将在服务密钥期间持续使用。服务密钥凭据不会自动传递到应用中,但您可以通过多种方式将它们输入到您的应用中。

  1. 您可以通过环境变量传递它们。
  2. 您可以创建用户提供的服务 (cf cups)。
  3. 您可以在应用程序配置中或通过配置服务器传递它们。

通过所有这些选项,您将凭据传递到应用程序,因此理论上您可以在它们到达您的应用程序之前对其进行调整或更改。

希望有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-11
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多