我想知道如何(以及是否有可能)从Cloud Foundry中的服务更改URI凭据。更具体地说,来自Pivotal Cloud Foundry的mLab服务(免费计划)。
背景
我创建了nodejs应用并将其推送到Pivotal Cloud Foundry。
此应用使用免费计划绑定到mLab服务。
使用Pivotal网站创建mLab服务时,它会自动创建一个具有用户名和密码的数据库。
在Pivotal网站内打开应用程序设置,我可以看到以下环境变量。请注意credentials
内的name
和mLab
内的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计划,但是如果升级计划,我的问题仍然相同。
谢谢
答案 0 :(得分:0)
作为用户,您无法更改服务代理生成的VCAP_SERVICES
条目。这些是固定的,无法更改。
如果您cf create-service
购买了一项服务,则该服务是由服务经纪人创建的,您将获得服务提供商提供的确切信息。如评论中所述,根据服务代理,您可能可以使用cf create-service -c
将参数传递给代理。查看您的服务提供商的文档,以查看是否有一种方法可以影响您希望生成的凭据。
如果服务提供商未提供执行所需操作的选项,则可以创建服务密钥,而不是将服务绑定到应用程序。这将为您提供一组服务凭证,该凭证将持续使用服务密钥。服务密钥凭据不会自动传递到应用程序中,但是您可以通过多种方式将其输入到您的应用程序中。
cf cups
)。使用所有这些选项,您会将凭据传递给应用程序,因此从理论上讲,您可以在凭据进入您的应用程序之前对其进行调整或更改。
希望有帮助!