【发布时间】:2016-04-18 03:00:51
【问题描述】:
尝试在 AWS/EBS(Amazon Web Services,Elastic Beanstalk)环境中设置 Meteor。
Meteor 开发运行可以传递一个命令行标志:--settings settings.json 其中settings.json 是一个包含服务器/客户端键/值配置的文件(格式正确的 JSON)。
Meteor 的部署使用METEOR_SETTINGS 环境变量,而不是在命令行中传递配置文件。如果提供的话,它应该包含一个 json 文档,例如 settings.json 的内容,例如:
$ METEOR_SETTINGS=$(cat settings.json)
$ echo $METEOR_SETTINGS
{ "public": { "s3path": "https://d2v4p3rms9rvi3.cloudfront.net" } }
问题是当我在 EBS 控制台中将METEOR_SETTINGS 的值设置为这个值时:
AWS/EBS 丢弃引号,转义斜线(如屏幕截图所示),并发送 Meteor:
{public:{s3path:https:\/\/d2v4p3rms9rvi3.cloudfront.net}}
如节点启动错误所示:
-------------------------------------
/var/log/nodejs/nodejs.log
-------------------------------------
npm WARN deprecated backwards-incompatible changes made to `npm run-script` and
npm WARN deprecated semver behavior.
> meteor-dev-bundle@0.0.0 start /var/app/current
> node main.js
/var/app/current/programs/server/boot.js:283
}).run();
^
Error: METEOR_SETTINGS are not valid JSON: {public:{s3path:https:\/\/d2v4p3rms9rvi3.cloudfront.net}}
at packages/meteor/packages/meteor.js:21:1
at Package (packages/meteor/packages/meteor.js:42:1)
at /var/app/current/programs/server/packages/meteor.js:1277:4
at /var/app/current/programs/server/packages/meteor.js:1286:3
at /var/app/current/programs/server/boot.js:242:10
at Array.forEach (native)
at Function._.each._.forEach (/var/app/current/node_modules/underscore/underscore.js:79:11)
at /var/app/current/programs/server/boot.js:137:5
针对这个问题,我尝试了 value 字段中 JSON 对象的各种变体: 转义引号,用单引号括起整个 json 部分,用单引号替换双引号,以及其他尝试 - 都没有解决它。
问题是:
如何设置 METEOR_SETTINGS 以便 Meteor rcv & 正确解析它?
注意:其中一项要求是将相同的构建部署到开发、登台和生产环境。需要为每个环境单独设置配置,因此如果有另一种方法可以将设置注入 EBS 环境,而无需修改也可以解决该问题的构建。
【问题讨论】:
-
你能检查这个文件看看你是否可以在那里指定环境变量吗? /opt/elasticbeanstalk/hooks/configdeploy
-
我发现的唯一其他资源是与 OpWorks 应用程序相关的环境变量:docs.aws.amazon.com/opsworks/latest/userguide/… 或这个:docs.aws.amazon.com/elasticbeanstalk/latest/dg/…
-
从屏幕截图中可以看出 - 上面的内容不是 1:1 交付到 Meteor 中的内容。所以我希望会发生一些神奇的事情,你将能够以某种方式正确地指定它。我的第一次尝试类似于
testJSON = { "public": { "s3path": "https://d2v4p3rms9rvi3.cloudfront.net" } };var temp = JSON.stringify(testJSON);var result = encodeURIComponent(temp);console.log(temp);{"public":{"s3path":"d2v4p3rms9rvi3.cloudfront.net"}}console.log(result);%7B%22public%22%3A%7B% 22s3path%22%3A%22https%3A%2F%2Fd2v4p3rms9rvi3.cloudfront.net%22%7D%7D -
@RobertSimon 不确定我是否理解你的意思,但确实使用
encodeURIComponent很有用。它对METEOR_SETTINGS没有帮助,因为meteor 不希望它被url 编码,但它可能适合我提到的第二种解决方法:如果该解决方法到位,可以使用url 设置METEOR_SETTINGS_ENCODEDenv 变量-编码的json。然后,对其进行解码并在Meteor.startup()部分中填充Meteor.settings。它仍然是一个 hack,但至少它提供了从 aws/ebs 上的settings.json文件以编程方式填充Meteor.settings的路径 -
Meteor 不希望它被编码为 URL,但是在屏幕截图上的值和 Meteor 得到的值之间存在一些可见的解码。所以我认为在网络上提供一些编码/正确转义的字符串最终可能会作为有效的 JSON 字符串提供给流星。如果您按照我的步骤获取该对象的 encodeURIComponent 值并将其粘贴到 web 上的表单,meteor 会收到什么?
标签: amazon-web-services meteor amazon-elastic-beanstalk