AWS CloudShellにdyneinをインストールする

CloudShell上でdyneinを利用しようとしたがうまく行かなかった。それらを対処した手順を残しておく。(2024-02-17)


実行したコマンドを載せていますが、自己責任で実行をお願いします。

## dynein

Rustで記載されたDynamoDBのCLIツール。少ない記述でDynamoDBを操作することが出来る。例えば、下記の記載で現在参照中のテーブルに対して、primary keyが```abc```であるものを検索される。

```bash: 取得コマンド例
dy get abc
```

## dyneinをCloudShellにインストールする

CloudShellでは、永続的なストレージとして扱えるのはホームディレクトリのみとなっている。そのため、公式手順のままインストールをしてしまうと、CloudShellが再起動されるたびに再インストールが必要となる。

これを回避するため、ホームディレクトリ直下に```tools```というフォルダを作成し、そのフォルダをインストール場所として作業を進めていく。


### dyneineをインストールする

基本的には[公式の手順](https://github.com/awslabs/dynein)に従って進めていくが、ファイルの配置場所はホームディレクトリ配下に変更する。フォルダ構成などはパッケージをインストールした時と同じ形にしたいため、ひとまず適当なパッケージをインストールする。また、公式の手順の実施のみでは```libssl.so.1.1```が存在せず、エラーとなってしまうため、こちらも合わせて配置する。


#### 適当なパッケージをインストール

適当なパッケージをインストールしていく。ここでは nkf (Network Kanji Filter) を選択した。下記コマンドでインストールする。

```bash:nkfのインストール
cd ~
mkdir -p tools
# フォルダ指定でインストール
sudo dnf install -y --installroot=/home/cloudshell-user/tools nkf
# パスを通す
cp .bashrc .bashrc_bk # 念のためにバックアップを取っておく
cat .bashrc | sed '$aexport PATH=$PATH:/home/cloudshell-user/tools/bin' > .bashrc_tmp
mv .bashrc_tmp .bashrc
source .bashrc
```

下記のようなフォルダが作成されていることが確認できる。

```bash
ls tools/
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
```

Unicodeエスケープ文字列が変換できることを確認する。

```bash:エスケープ文字列を変換
echo "\u65e5\u672c\u8a9e" | sed 's/\\\u\(....\)/\&#x\1;/g' | nkf --numchar-input -w
日本語 # 出力
```

下記記事を参照

https://qiita.com/m_kawaguchi/items/3feaeab510508740c530


#### dyneinをインストールする

公式の手順に従ってインストールする。配置場所のみ変更する。

```bash:dyneinのインストール
curl -O -L https://github.com/awslabs/dynein/releases/latest/download/dynein-linux.tar.gz
tar xzvf dynein-linux.tar.gz
sudo mv dy ~/tools/usr/local/bin/
# パスを通す
cd ~
cat .bashrc | sed '$aexport PATH=$PATH:/home/cloudshell-user/tools/usr/local/bin' > .bashrc_tmp
mv .bashrc_tmp .bashrc
source .bashrc
```

下記コマンドでdyneinがインストールされたことを確認する。現在の状態では```libssl.so.1.1```が存在しないためエラーとなる。

```bash:インストール後の確認
dy --help
dy: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
```

#### OpenSSL 1.1.1をインストールする

```libssl.so.1.1``` は OpenSSL 1.1.1 に存在するファイルのようだ。amazon-linux-2023では、OpenSSL 3.0.8 がインストールされており、OpenSSL 1.1.1 はインストールされていない。サポートは終了しているため好ましくないが、インストールしていく。

```bash:OpenSSL 1.1.1 のインストール
# ビルドに必要なパッケージをインストール
sudo dnf install -y gcc perl-FindBin perl-open perl-YAML perl-YAML-Tiny perl-File-HomeDir perl-Unicode-LineBreak perl-lib perl-File-Compare perl-File-Copy
# インストール
curl -O -L https://www.openssl.org/source/openssl-1.1.1w.tar.gz
tar xzvf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
sudo ./config --prefix=/home/cloudshell-user/tools/usr/local/ssl
sudo make
sudo make install
# パスを通す
cd ~
cat .bashrc | sed '$aexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/cloudshell-user/tools/usr/local/ssl/lib' > .bashrc_tmp
mv .bashrc_tmp .bashrc
source .bashrc
```

下記コマンドを実行する。バージョンが表示されれば問題なくインストールされている。CloudShellを再起動した場合でも問題なく実行できることを確認する。

```bash: インストール後の確認
dy --version
dynein 0.2.1 # 出力
```

利用したファイルは削除しておく。

```bash: 利用したファイルの削除
cd ~
rm dynein-linux.tar.gz 
rm openssl-1.1.1w.tar.gz 
rm -rf openssl-1.1.1w/
```

## 参考ページ

https://github.com/awslabs/dynein

https://www.openssl.org/

https://qiita.com/m_kawaguchi/items/3feaeab510508740c530