NodeJS 未在用户数据内的 AWS EC2 中成功安装

PPS*_*ein 5 amazon-ec2 amazon-web-services user-data node.js

我尝试在 AWS EC2 linux 中安装NodeJSnvm如下用户数据:

#!/bin/bash

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash
source ~/.bashrc
nvm install 7
Run Code Online (Sandbox Code Playgroud)

在成功创建实例并且我已经进入并检查我的 ec2 实例后,当我输入 like或时没有nodejsnvm安装。node --versionnvm --version

[ec2-user@ip-0-0-0-0 ~]$ node --version
-bash: node: command not found
[ec2-user@ip-0-0-0-0 ~]$ nvm --version
-bash: nvm: command not found
Run Code Online (Sandbox Code Playgroud)

当我检查实例的日志时,发现以下错误消息。

[   16.310115] cloud-init[3300]: => Downloading nvm as script to '/.nvm'
[   17.053885] cloud-init[3300]: => Profile not found. Tried  (as defined in $PROFILE), ~/.bashrc, ~/.bash_profile, ~/.zshrc, and ~/.profile.
[   17.076402] cloud-init[3300]: => Create one of them and run this script again
[   17.087459] cloud-init[3300]: => Create it (touch ) and run this script again
[   17.092307] cloud-init[3300]: OR
[   17.100669] cloud-init[3300]: => Append the following lines to the correct file yourself:
[   17.117606] cloud-init[3300]: export NVM_DIR="$HOME/.nvm"
[   17.124904] cloud-init[3300]: [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[   17.161419] cloud-init[3300]: => Close and reopen your terminal to start using nvm or run the following to use it now:
[   17.177964] cloud-init[3300]: export NVM_DIR="$HOME/.nvm"
[   17.185400] cloud-init[3300]: [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
Run Code Online (Sandbox Code Playgroud)

Séb*_*acq 8

正如日志所解释的那样,install.sh脚本正在尝试查找无法找到的配置文件。(请记住, user-data 中提供的脚本是以 root 身份运行的,因此 $HOME 是/root.

解决方案是要么确保配置文件在安装前存在,要么在安装后手动更改路径,如日志消息中所建议的那样。

解决方案 1(未经测试)

#!/bin/bash

touch ~/.bashrc # this ensure the bashrc file is created
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash
source ~/.bashrc
nvm install 7
Run Code Online (Sandbox Code Playgroud)

解决方案2(已测试)

#!/bin/bash

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
nvm install 7
Run Code Online (Sandbox Code Playgroud)

(当从用户数据运行时,$HOME 是 /)我在 Amazon Linux 上的交互式会话中测试了上述内容。

$ ssh ec2-user@ec2-18-202-174-164.eu-west-1.compute.amazonaws.com
Warning: Permanently added 'ec2-18-202-174-164.eu-west-1.compute.amazonaws.com,18.202.174.164' (ECDSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
3 package(s) needed for security, out of 3 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-31-30-44 ~]$ sudo bash
[root@ip-172-31-30-44 ec2-user]# curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 10250  100 10250    0     0  10250      0  0:00:01 --:--:--  0:00:01 54521
=> Downloading nvm as script to '/root/.nvm'


=> Appending source string to /root/.bashrc
=> Close and reopen your terminal to start using nvm or run the following to use it now:

export NVM_DIR="/root/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm
[root@ip-172-31-30-44 ec2-user]#
[root@ip-172-31-30-44 ec2-user]# export NVM_DIR="$HOME/.nvm"
[root@ip-172-31-30-44 ec2-user]# [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
[root@ip-172-31-30-44 ec2-user]# nvm install 7
######################################################################## 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v7.10.1 (npm v4.2.0)
Creating default alias: default -> 7 (-> v7.10.1)
[root@ip-172-31-30-44 ec2-user]# node --version
v7.10.1
Run Code Online (Sandbox Code Playgroud)

请注意,上面将安装nvm,nodenpmroot 用户。它不会在ec2-user的环境中添加正确的 ENV VAR 。为此,请登录,ec2-user然后键入

export NVM_DIR="/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
Run Code Online (Sandbox Code Playgroud)

或将此添加到ec2-user's.bashrc

证明它有效(登录为ec2-user

[ec2-user@ip-172-31-20-26 ~]$ export NVM_DIR="/.nvm"
[ec2-user@ip-172-31-20-26 ~]$ [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ec2-user@ip-172-31-20-26 ~]$ node --version && npm --version
v7.10.1
4.2.0
Run Code Online (Sandbox Code Playgroud)

您可以在user-data脚本中自动执行此操作:

cat <<EOF >> /home/ec2-user/.bashrc
export NVM_DIR="/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
EOF
Run Code Online (Sandbox Code Playgroud)

  • 安装适用于上述解决方案 2:即为 root 用户安装 node 和 nvm。如果您使用 ec2-user@ 连接,则 node 不在您的路径中,因此 nvm 或 node 返回 not found 是正常的,因为它是为 root 用户安装的。您必须添加 export NVM_DIR="$HOME/.nvm" [root@ip-172-31-30-44 ec2-user]# [ -s "$NVM_DIR/nvm.sh" ] &amp;&amp; 。"$NVM_DIR/nvm.sh" 到 /home/ec2-user/.bashrc 以便 ec2-user 可以访问它们 (2认同)
  • 是的,我需要添加`cat &lt;&lt;EOF &gt;&gt; /home/ec2-user/.bashrc`。非常感谢。 (2认同)