我们有一个在 Amazon Elastic Beanstalk 上运行的 nodejs 项目,它使用我们使用nodejitsu 的私有 npm 注册表托管的私有模块。
然而,从弹性实例访问私有 npm 注册表并不简单,也没有很好的记录。
设置此访问权限的最佳方法是什么?
我们有一个在 Amazon Elastic Beanstalk 上运行的 nodejs 项目,它使用我们使用nodejitsu 的私有 npm 注册表托管的私有模块。
然而,从弹性实例访问私有 npm 注册表并不简单,也没有很好的记录。
设置此访问权限的最佳方法是什么?
其他答案都不适合我。经过几个小时的拉头发,我们终于弄明白了。有效的解决方案与其他答案几乎相同,但进行了非常小的调整。
Configuration在> Software Configuration>下在 Elastic Beanstalk 上设置 NPM_TOKEN 环境变量Environment Properties。.ebextensions/npm.config文件。(名称不必是“npm”。)将此内容放入文件中:
files:
"/tmp/.npmrc":
content: |
//registry.npmjs.org/:_authToken=${NPM_TOKEN}
请注意,它使用${NPM_TOKEN}而不是$NPM_TOKEN. 这是至关重要的。使用$NPM_TOKEN将不起作用;它必须有花括号:${NPM_TOKEN}.
为什么需要花括号?不知道。在 shell/POSIX 语言中,${VAR}并且$VAR是同义词。但是,在.npmrc文件中(在撰写本文时),没有大括号的变量不会被识别为变量,因此 npm 必须使用稍微不同的语法标准。
更新
此外,这仅适用于新环境或克隆环境。无论出于何种原因,未使用 a 初始化的环境都不会/tmp/.npmrc在运行之前的任何未来部署中读取它npm install --production。我们在 4 个不同的应用程序上尝试了无数方法,但克隆和替换环境是唯一有效的方法。
因此,我们设法通过使用 npm userconfig 文件来完成这项工作。有关更多信息,请参阅npmrc 的文档页面。
将 nodejs 应用程序部署到 Elastic Beanstalk 时,root 用户运行 npm install。因此,您需要编写根目录的 npm userconfig 文件,该文件位于 /tmp/.npmrc。
因此,如果您将一个名为 private_npm.config(或您选择的任何名称)的文件添加到您的 .ebextensions 文件夹中,其中包含所需的所有信息,那么您就可以开始了。有关更多信息,请参阅自定义和配置 AWS Elastic Beanstalk 环境。
所以这就是我的文件使用 nodejitsu 私有注册表的样子。
.ebextensions/private_npm.config:
files:
#this is the npm user config file path
"/tmp/.npmrc":
mode: "000777"
owner: root
group: root
content: |
_auth = <MY_AUTH_KEY>
always-auth = true
registry = <PATH_TO_MY_REGISTRY>
strict-ssl = true
email = <NPM_USER_EMAIL>
在项目中使用.npmrc也可以。例如...
.npmrc
registry=https://npm.mydomain.com
.gitignore如果您包含一行,您可能需要此文件,_authToken但请确保您不包含.ebignore它,以便它正确地与每个部署捆绑在一起。在尝试了一些不成功的事情之后,我遇到了这篇文章,这让我意识到在项目中本地指定它是可能的。
上面的答案是朝着正确方向迈出的一步,但是权限和所有者对我不起作用。设法让它与以下组合一起工作:
files:
#this is the npm user config file path
"/tmp/.npmrc":
mode: "000600"
owner: nodejs
group: nodejs
content: |
_auth = <MY_AUTH_KEY>
always-auth = true
registry = <PATH_TO_MY_REGISTRY>
strict-ssl = true
email = <NPM_USER_EMAIL>
将以下内容放在您的 .ebextensions/app.config 中。
files:
"/tmp/.npmrc":
mode: "000777"
owner: root
group: root
content: |
//registry.npmjs.org/:_authToken=$NPM_TOKEN
其中 NPM_TOKEN 是一个环境变量,具有您的实际 npmjs 身份验证令牌的值。
请注意,可以并且应该从 AWS 控制台 Elasticbeanstalk 软件配置选项卡中设置 elasticbeanstalk 中的环境变量。
使用现代平台,您不再需要通过.ebextensions
您可以简单地.npmrc在部署包的根目录下创建一个文件,并在您的旁边package.json添加以下行:
//registry.npmjs.org/:_authToken=${NPM_TOKEN}
使用此方法,您可以创建一个NPM_TOKEN在 AWS 控制台中命名的环境变量,这样您就不必将令牌存储在您的存储库中。
结构:
~/your-app/
|-- package.json
|-- .npmrc
在新的 Elastic Beanstalk Linux 2 平台中,这些解决方案都不起作用(除了.npmrc文件解决方案可以工作,但在开发环境中使用它们时会出现问题,因为所有开发人员都需要${NPM_TOKEN}在自己的环境中定义其 Env Var)。
原因是该/tmp/.npmrc位置不再有效。
选项1
您必须将.ebextensions/npm.config文件更改为这种新格式:
files:
#this is the npm user config file path
"/root/.npmrc":
mode: "000777"
owner: root
group: root
content: |
_auth= ${NPM_TOKEN}
registry = https://{yourprivatenpmrepository.com}/
选项 2
将自定义 .npmrc_{any-suffix} 添加到应用程序的根目录,并创建一个预构建挂钩以在 Beanstalk 执行之前重命名它,npm install以便它可以使用您的私有存储库配置:
.platform/hooks/prebuild/01_set_npmrc.sh: #!/bin/bash
#Copy and rename .npmrc_beanstalk to .npmrc
mv .npmrc_beanstalk .npmrc
.npmrc_beanstalk包含以下内容的文件(根据您的私有 npm 配置对其进行修改): _auth= ${NPM_TOKEN}
registry = https://{yourprivatenpmrepository.com}/
chmod +x .platform/hooks/prebuild/01_set_npmrc.sh使用 EB CLI 重新部署,您就完成了!