我想知道如何(以及是否可能(更改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免费计划,但如果我升级计划,我的问题仍然是一样的。
谢谢,
作为用户,您不可能更改由服务代理生成的VCAP_SERVICES
条目。这些都是固定的,不可能更改。
如果你cf create-service
'd一个服务,那么它是由一个服务代理创建的,你会得到服务提供商给你的确切信息。正如在评论中提到的,根据服务代理,您可能能够使用cf create-service -c
将参数传递给代理。查看您的服务提供商的文档,看看是否可以选择以您想要的方式影响生成的凭据。
如果您的服务提供商没有提供您想要的选项,您可以创建服务密钥,而不是将您的服务绑定到应用程序。这将为您的服务提供一组凭据,这些凭据将持续服务密钥的有效期。服务密钥凭据不会自动传递到应用程序中,但您可以通过多种方式将其输入到应用程序。
- 您可以通过环境变量传入它们
- 您可以创建用户提供的服务(
cf cups
( - 您可以在应用程序配置或配置服务器中传递它们
使用所有这些选项,您将凭据传递到应用程序,因此理论上您可以在凭据到达您的应用程序之前对其进行调整或更改。
希望能有所帮助!