【发布时间】: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、Pivotal 或 mLab 的限制。我敢打赌,这个限制是由于我使用的是 Pivotal 试用帐户和 mLab 免费计划,但是如果我升级计划,我的问题仍然是一样的。
谢谢,
【问题讨论】:
-
只需解绑并重新绑定它,我希望它会生成一组新的凭据。
-
我想使用在 mLab 网站中手动创建的凭据
-
为什么?绑定服务的全部意义在于您不必担心这一点。
-
您在寻找什么“精细控制”?不,它不会改变 VCAP_SERVICES,因为该 env var 的重点是反映 实际绑定的服务。
-
某些服务在绑定时接受参数,例如cli.cloudfoundry.org/en-US/cf/bind-service.html。我不知道 MLab 是否这样做,但据我所知,这是您可以提供的唯一可能更改绑定凭据的配置。
标签: mlab cloud-foundry