How to Install Ruby on AWS CloudShell
Tags: aws, ruby, cloudshell
Published: 2020-12-15 21:32:58

If you use AWS and like to interact with AWS services from the shell/terminal, there's a new option from today: <a href="https://aws.amazon.com/blogs/aws/aws-cloudshell-command-line-access-to-aws-resources/">AWS CloudShell.</a> CloudShell provides a terminal emulator *in the browser* complete with the tools and authentication credentials needed to work with your AWS resources.

Python, Node, and numerous other tools are preinstalled on the Amazon Linux 2 based instance out of the box, but.. there's no Ruby! Boo!

While installing Ruby on Amazon Linux 2 is no big deal, only the `/home` folder is persisted between AWS CloudShell runs, so you'll need to take extra care to install it under your home directory.

Without further ado, here's how to get Ruby 2.7.2 running on AWS CloudShell using `rbenv` and `ruby-build`:

```
# Install basic developer tools and dependencies
sudo yum -y groupinstall "Development Tools"
sudo yum -y install git-core zlib zlib-devel gcc-c++ patch readline readline-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison curl sqlite-devel

# Install libyaml to $HOME
wget https://github.com/yaml/libyaml/releases/download/0.2.5/yaml-0.2.5.tar.gz
tar xzf yaml-0.2.5.tar.gz 
cd yaml-0.2.5
./configure --prefix=$HOME
make && make install
cd ..
rm -rf yaml-0.2.5
rm yaml-0.2.5.tar.gz

# Install rbenv and ruby-build
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
cd ~/.rbenv && src/configure && make -C src
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
~/.rbenv/bin/rbenv init
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
mkdir -p "$(rbenv root)"/plugins
git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build

# Install Ruby itself
RUBY_CONFIGURE_OPTS=--with-libyaml-dir=$HOME rbenv install 2.7.2
rbenv global 2.7.2
gem env home
```

There's a LOT to digest here, but here's basically what happens:

* Install basic development dependencies (`gcc`, etc.)
* Install `libyaml` manually to get it into `/home`
* Install `rbenv` and `ruby-build`
* Get `ruby-build` to build Ruby 2.7.2
* Set Ruby 2.7.2 as our default, global Ruby
* Run `gem env home` just to see everything is working

Note that due to *only* the `/home` directory sticking around long term, you might find that some gems with native dependencies fail to install. If the dependencies are binary packages, you'll need to install them prior to installing or upgrading those gems.

To install GCC and a big pile of common native dependencies, you can do this:

```
sudo yum groupinstall "Development Tools"
sudo yum install git-core zlib zlib-devel gcc-c++ patch readline readline-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison curl sqlite-devel libyaml
```

## Notes on an earlier `libyaml` problem..

In an earlier version of this article, I used the normal `libyaml` packages and Ruby installed fine.. but once the instance had been deleted due to inactivity, `gem list` failed to work due to `libyaml` being dynamically loaded from the system.

The error looked like this:

```
in 'require': libyaml-0.so.2: cannot open shared object file: No such file or directory - /home/cloudshell-user/.rbenv/versions/2.7.2/lib/ruby/2.7.0/x86_64-linux/psych.so (LoadError)
```

If you really want to use the system `libyaml`, this can be resolved by reinstalling `libyaml` each time using `sudo yum -y install libyaml` and this could be added to `~/.bash_profile` but if you install `libyaml` to `$HOME` as in the new instructions up top, this problem goes away.