如何在Elastic Beanstalk上运行`npm update -g npm`?

时间:2015-07-07 05:03:57

标签: node.js amazon-web-services npm elastic-beanstalk

如何在我们的Elastic Beanstalk实例启动时运行npm update -g npm?对每个实例进行shell操作以手动运行update命令相当容易,但这不会通过扩展事件起作用,因为会自动添加更多实例。

如何通过自动缩放事件的方式在Elastic Beanstalk实例上获取最新版本的NPM?

3 个答案:

答案 0 :(得分:5)

事实证明这个很棘手,需要进行一些挖掘和实验。

首先,快速了解Elastic Beanstalk的生命周期。在部署的每个实例上运行的AWS脚本采取了几个步骤。对于Node.JS服务器,有两个值得关注:

  • 安装Node.JS
  • 运行npm install

安装Node.JS是我们可以介入并做一些魔术的地方。大多数提示想要对beanstalk实例执行魔法,或其他事情的错误来自npm install步骤。

回到主题,AWS用于在beanstalk实例上安装节点的脚本是/opt/elasticbeanstalk/hooks/appdeploy/pre/40install_node.sh。通常看起来像这样:

#!/bin/bash

set -xe

/opt/elasticbeanstalk/containerfiles/ebnode.py --action node-install

此脚本将许多不同的节点版本安装到/opt/elasticbeanstalk/node-install,包括在beanstalk配置中选择的版本。使用位于该文件夹中的一个节点版本运行npm update -g npm不是很好吗?

事实证明,beanstalk提供了一种在部署期间交换每个实例上的文件的机制。基本上,您在应用程序的.ebextensions文件夹中配置YAML文件。有两种方法可以在行中或在s3存储桶中引用文件内容。我使用s3 bucket方法,给出node.config YAML,如下所示:

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/40install_node.sh" :
    mode: "000775"
    owner: root
    group: users
    source: https://s3.amazonaws.com/bucketname/40install_node.sh
    authentication: S3Access
Resources:
  AWSEBAutoScalingGroup:
    Metadata:
      AWS::CloudFormation::Authentication:
        S3Access:
          type: S3
          roleName: aws-elasticbeanstalk-ec2-role
          buckets: bucketname

请注意S3Access属性。我们将存储桶保密,允许使用IAM访问aws-elasticbeanstalk-ec2-role

现在我们所需要的是运行npm update的40install_node.sh版本:

#!/bin/bash

set -xe

/opt/elasticbeanstalk/containerfiles/ebnode.py --action node-install

# Update npm
cd /opt/elasticbeanstalk/node-install/node-v0.12.2-linux-x64/bin/ && /opt/elasticbeanstalk/node-install/node-v0.12.2-linux-x64/bin/npm update npm -g

您也可以将此节点的任何自定义安装在此文件中。请记住要密切关注节点的路径,它会随着beanstalk配置中节点版本的增加而改变。

答案 1 :(得分:4)

如果您不想在S3上添加脚本,只需将以下内容放在.ebextensions中,假设您正在运行节点v12,对于其他版本,路径node-v0.12.6-linux-x64将会与众不同。

commands:
    01-updatenpmv3:
        command: PATH=$PATH:/opt/elasticbeanstalk/node-install/node-v0.12.6-linux-x64/bin/ && npm update -g npm
        cwd: /opt/elasticbeanstalk/node-install/node-v0.12.6-linux-x64/bin/

答案 2 :(得分:1)

这不是必要的。您可以在配置中指定要运行的Nodej的版本,从而与适当的npm版本配对。如果您确实想要使用较新版本的npm的旧版本nodejs,则可以保证此练习。

在这种情况下,我可能会在放入.ebextensions文件夹的文件(例如00_default.config)中单步执行npm安装脚本:

 files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/50npm.sh":
    mode: "000755"
    owner: root
    group: users
    content: |
      #!/bin/bash
      #==============================================================================
      # Copyright 2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
      #
      # Licensed under the Amazon Software License (the "License"). You may not use
      # this file except in compliance with the License. A copy of the License is
      # located at
      #
      #       http://aws.amazon.com/asl/
      #
      # or in the "license" file accompanying this file. This file is distributed on
      # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or
      # implied. See the License for the specific language governing permissions
      # and limitations under the License.
      #==============================================================================

      set -xe

      /opt/elasticbeanstalk/containerfiles/ebnode.py --action npm-install

      # Update npm
      cd /opt/elasticbeanstalk/node-install/CURRENTNODEVERSIONHERE/bin/ && /opt/elasticbeanstalk/node-install/CURRENTNODEVERSIONHERE/bin/npm update npm -g

将CURRENTNODEVERSIONHERE替换为您的设置的正确路径/版本。

这些是我在实例中看到的可用版本。您需要查看自己的资源,了解自己正在使用的内容。

位置:/ opt / elasticbeanstalk / node-install

  • node-v0.10.46-linux-x64
  • 节点v0.12.15-Linux的64
  • node-v0.8.28-linux-x64
  • 节点-v4.4.6-Linux的64
  • 节点v5.12.0-Linux的64
  • 节点V6.2.2-Linux的64