Ruby on Jets検証 (WSL)

# はじめに
この記事ではRuby製サーバレスフレームワークの「[Jets](https://rubyonjets.com/)」を検証した内容をまとめます。
環境はWindows10ですが、JetsがWindowsで動作しないためWSL(Debian)を使用しています。

# 目的
今回の目的はDynamoDBのテーブル設計、データアクセス設計の動作を保証することです。

# 環境構築
実際に環境構築した際に実行したコマンドを列挙します。

## WSL
Windows StoreよりWSL(Ubuntu or Debian)をインストール。

```
sudo apt update
sudo apt upgrade
sudo apt install -y make　gcc　libssl-dev libreadline-dev zlib1g-dev　git　curl wget unzip
```

## Ruby 
下記記事のRubyの部分を参照
https://qiita.com/ksh-fthr/items/64a4e86c8bad08322c94#3-rbenv-%E3%82%92%E5%85%A5%E3%82%8C%E3%82%88%E3%81%86

```
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
~/.rbenv/bin/rbenv init
vi .bashrc
source ~/.bashrc
rbenv install -l
rbenv install 2.6.6
rbenv rehash
rbenv global 2.6.6
ruby -v
```

## Jets
https://qiita.com/gotchane/items/fd3c1e54f7bdaa4ab813

```
sudo apt install -y nodejs npm
sudo npm install -g yarn
gem install jets
jets new プロジェクト名

```

## dynamodb local
https://symfoware.blog.fc2.com/blog-entry-2207.html

```
sudo apt install openjdk-11-jre
wget https://s3-ap-northeast-1.amazonaws.com/dynamodb-local-tokyo/dynamodb_local_latest.tar.gz
mkdir dynamodb
tar zxf dynamodb_local_latest.tar.gz -C ./dynamodb
cd dynamodb/
java -D"java.library.path=./DynamoDBLocal_lib" -jar DynamoDBLocal.jar -sharedDb
```
## dynamodb-admin
https://www.npmjs.com/package/dynamodb-admin

```
npm install -g dynamodb-admin
export DYNAMO_ENDPOINT=http://localhost:8000
dynamodb-admin
```
## aws-cli
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-linux.html

```
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
/usr/local/bin/aws --version
aws configure
　→CUIで適当なkey,idを設定(test_id, test_key等)
aws dynamodb list-tables --endpoint-url http://localhost:8000
　→接続確認

```
環境構築は以上

# Jets 検証
情報が少ないJetsを検証するにあたり、以下の記事が大変参考になりました。
https://qiita.com/gotchane/items/fd3c1e54f7bdaa4ab813
https://qiita.com/gotchane/items/d998b49dcaa31fe286b9
https://qiita.com/gotchane/items/b412295bee48ba827715

## セッティング
- config/dynamodb.ymlのtable_namespaceを変更
    - table_namespace: ○○○○(プロジェクト名等)


## テーブル作成
- dynamodb-adminによる作成
    - 後述のmodelの作成が必要
    - dynamodb-adminによるテーブル作成方法は以前書いた[こちらの記事](https://qiita.com/stylejp/items/50bc4b78d9c01f3d6989#5-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E4%BD%9C%E6%88%90)を参照してください
- Jetsマイグレーションによる作成
    - https://rubyonjets.com/reference/jets-dynamodb-generate/
    - 例：jets dynamodb:generate create_users --partition-key user_id:string --sort-key　delete_flg:number

※Jetsマイグレーションによる作成はJetsの恩恵を受けられる機能だが、GSI,LSI設定の情報がない。
　ソースレベルでのJetsの理解があれば可能かもしれないが目的から外れるので今回は未調査。

　
## modelの作成
dyanamodb-adminによるテーブル作成をした場合、作成したテーブルのモデルを以下の内容で作成する。
例：Usersテーブルを作成した場合、「user.rb」ファイルをapp/models配下に作成する。

```
class モデル名(User等) < Dynomite::Item
end
```

## Jetsコンソールによるデータ操作
- プロジェクトディレクトリにて「jets c」を実行しコンソールを起動する
- [dynomite](https://github.com/tongueroo/dynomite)を参考にクエリを作成する

```レコード作成
create_user = User.new(user_id: "test1_name", user_name: "test1", user_email: "test1@mail.com", delete_flg: 0)
create_user.replace
```

```
User.find(user_id:"test1_name", delete_flg:0)
```

# その他
### ハマりどころ(メモ)
- テーブル作成の項で記載しましたが、本来であればテーブル作成はマイグレーションファイルが作成されるJetsマイグレーションが理想です。ただ、現状のJetsの情報量ではGSI,LSI設定の適切な方法がぱっと出てきませんでした。
- GSI, LSIはデータアクセス設計を元に設定するのがベストですが、状況に応じて変更する必要が出てくることもあります。その際はdynamodb-adminを使う場合テーブルの作り直しが必要です。
- WSL上で動かしているJetsファイルの操作はWindows上で起動したVScodeでおこないました。
    - RemoteWSLを導入する等の手順は[こちら](https://qiita.com/nj_ryoo0/items/a42c47436b77310f5430)等を参照してみてください

### エラー
私の環境ではmysql2のgemエラーでマイグレーションのテストができませんでした。
以下のコマンドで解決しました。

```
gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'
```

# 参考記事
公式：https://rubyonjets.com/
https://qiita.com/gotchane/items/fd3c1e54f7bdaa4ab813
https://qiita.com/gotchane/items/d998b49dcaa31fe286b9
https://qiita.com/gotchane/items/b412295bee48ba827715

# おわりに
Ruby on JetsはAWS container HEROという世界に5人程しかいないAWSのスペシャリストによって作成されていることから、信頼性・機能性は高いと感じました。
ただし、現状ほぼ一人でメンテナンスされているとのことから本番環境への適用については慎重に判断するべきと思われます。
気になる方は以下の記事をご覧ください。
https://qiita.com/gotchane/items/02b9c539bfaf3a69d76e

多くのJetsに関する記事をまとめてくださった@gotchane 様には感謝申し上げます。