如何在Cloud Foundry中更改给定服务的凭据

时间:2018-11-16 09:30:03

标签: cloudfoundry mlab pivotal-cloud-foundry

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


背景

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

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

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

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

{
  "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,Pivotal或mLab的限制。我敢打赌,此限制是由于我使用的是Pivotal试用帐户和免费的mLab计划,但是如果升级计划,我的问题仍然相同。

谢谢

1 个答案:

答案 0 :(得分:0)

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

如果您cf create-service购买了一项服务,则该服务是由服务经纪人创建的,您将获得服务提供商提供的确切信息。如评论中所述,根据服务代理,您可能可以使用cf create-service -c将参数传递给代理。查看您的服务提供商的文档,以查看是否有一种方法可以影响您希望生成的凭据。

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

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

使用所有这些选项,您会将凭据传递给应用程序,因此从理论上讲,您可以在凭据进入您的应用程序之前对其进行调整或更改。

希望有帮助!