AWS Cloud9 を OCI Always Free インスタンスでセットアップして無料で使う

# はじめに
最近ビッグバンド演奏をリモート録音、ミックスしたりしているのですが、困ったことが。たぶん自分の使い方が悪いのですが、DAW(Studio One)で録音した音にモニターヘッドホンで鳴らしていた**他の楽器の音がのってしまっている...！**
最悪録音し直さないとならないけどなんとか録音した音だけ抜き出せないかと調べていたら[Spleeter](https://deezer.io/releasing-spleeter-deezer-r-d-source-separation-engine-2b88985e797e)というpythonのライブラリでそんなようなことができるらしいということを知り、(python全然できないけど)とりあえず試してみよう！と思いました。
そして、どうせpythonの開発環境作るなら前から気になっていた**AWS Cloud9**とかいうブラウザのIDE使ってみたい！**無料**で！と思い立ってのこの記事です。

調べてみるとAWS Cloud9そのものの利用料はかからないようでしたが、このバックで稼働するEC2インスタンスのお金がかかる、というものでした。
ただAWS Cloud9はリモートSSHサーバーを設定できるようで、この機能を使えば**Oracle Cloud Infrastructure(OCI)のAlways Freeインスタンスでセットアップ=無料で使えるのではないか**と考え、セットアップしてみました。

:::note warn
個人的なメモかつ、セットアップ完了後に書いているのであくまで参考程度にしてください。また設定の仕方、使い方によっては課金される可能性もありますので、自己責任でお願いします。
:::

# 前提
前提として以下のアカウント登録などのセットアップは完了しており、各コンソールを利用できる必要があります。
- AWSアカウント登録
- Oracle Cloud Infrastructureアカウント登録

# OCIインスタンス事前準備
まずはCloud9で利用するインスタンスをセットアップします。

1. OCIコンソールにログイン。インスタンスの画面へ。
![20210727_oci_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1023843/d52238e9-2bcb-ac31-325d-64909fc6233b.png)

1. インスタンスの作成をクリックします。まず「イメージとシェイプ」は変更する必要があります。「編集」をクリックしてください。
![20210727_oci_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1023843/144b90fa-5d11-23ef-8e32-90d6f243b9e0.png)

1. 「シェイプの変更」をクリックしてください。(ARM版インスタンスもOCIではAlways Freeリソースとして利用できますが、Cloud9側がARM対応していないようです。([参考:AWS Cloud9 SSH環境ホスト要件](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/ssh-settings.html)))
![20210727_oci_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1023843/fadd7c73-44d0-eee1-66f5-651f5e61d029.png)

1. 「専門と前世代」を選択し、[VM.Standard.E2.1.Micro]を選択します。
![20210727_oci_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1023843/750de0ed-fc2f-eef8-6d74-49011b417021.png)
![20210727_oci_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1023843/8fc6c0e2-a5bb-2de2-a2c5-9170b29ad874.png)

1. イメージはこのままでもいいですが、最新OSにしておきます。(AWS Cloud9はUbuntuでもセットアップできるようですが、使い慣れているRHEL系の最新バージョンにしています。)
![20210727_oci_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1023843/3ab6992d-0a39-ea2e-84f8-584a69ab99e8.png)

1. 「秘密キーの保存」から秘密鍵をダウンロードします。他は設定してもしなくてもよいです。画面下の「作成」をクリックし、インスタンスを作成します。
![20210727_oci_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1023843/9f6d3325-8b62-1b03-f286-8e3cd54855dd.png)

1. 作成したインスタンスに[Always Free]と出ていたらAlways Freeインスタンスとして作成できていると思います。この画像の右にインスタンスに割あたっているPublicIPが表示されていると思いますので、これを使用してSSHします。
![20210727_oci_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1023843/46092ef6-ee08-75b8-1329-ae8c7baa891c.png)

# インスタンスのセットアップ
OSの初期設定と合わせてCloud9前提条件から必要な作業を実施します。

- インスタンスにSSHしてまずはrootユーザーで初期設定を行っておきます。

```bash:/bin/bash
# インスタンスにログイン(macOSターミナル等SSHクライアントから接続してください)
chmod 400 <ダウンロードした秘密鍵>
ssh -i <ダウンロードした秘密鍵> opc@<OCIインスタンスのPublicIP>

# rootユーザーにスイッチ
sudo su -

# とりあえずアップデート
yum -y update

# 言語設定を日本語に
localectl list-locales #ja_JP.utf8がない
yum install glibc-langpack-ja #インストール
localectl set-locale ja_JP.utf8　 #ja_JP.utf8にセット
source /etc/locale.conf #反映
locale # 確認

# timezoneをJSTに
timedatectl set-timezone Asia/Tokyo #セット
date #確認

# 次作業のためにopcユーザーへ
exit
```

 - opcユーザーでcloud9の事前作業を行います。(opcユーザーのhomeディレクトリで実施)

```bash:/bin/bash
# Pyhon3の確認
python -V #おそらくインストール済み

# Node.jsのインストール
sudo curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
. ~/.bashrc
nvm install node
node --version #確認

# Cloud9起動ディレクトリの権限変更(opcユーザーhomeディレクトリ)
sudo chmod u=rwx,g=rx,o=rx ~

# Cloud9インストール
sudo curl -L https://raw.githubusercontent.com/c9/install/master/install.sh | bash

```
このターミナル接続はまだ使うのでこのままにしておいてください。

# AWS Cloud9環境作成

1. AWSマネジメントコンソールへアクセスし、Cloud9のページを開きます。
![20210727_aws_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1023843/b2024373-df16-7a18-4a44-bcec192a71a3.png)

1. 「Create Environment」をクリックします。
![20210727_aws_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1023843/24f53448-2827-2773-52c9-bd855f7f1602.png)
 
1. 任意の名前をつけて[Next Step]
![20210727_aws_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1023843/7bd97cee-8c3a-64cf-5a86-3f1a8dfb14d9.png)

1. ここで[Create and run in remote server]を選択し、接続先情報として先程作成したOCIインスタンスのユーザー名[User]、PublicIP[Host]を入力します。
![20210727_aws_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1023843/f496216b-45e2-e263-b55b-6c427d82ebf4.png)

1. [Copy key to clipboard]でクリップボードに公開鍵をコピーします。
![20210727_aws_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1023843/f8818d47-09ad-9f6b-7977-5737487a0d49.png)

1. 先程ログインしたままになっているSSHセッション(切断されている場合は再度入り直してください)で公開鍵を登録します。

```bash:/bin/bash
echo '<クリップボード貼り付け>' >>  ~/.ssh/authorized_keys
```

1. マネジメントコンソールに戻り、「Next Step」をクリックします。検証が走り、正常に完了すると「Create environment」が押せるようになるのでクリックして完了です。
![20210727_aws_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1023843/a034e271-49b9-75fc-d8ed-c9749431f24a.png)


# 終わりに
今回これをやってみようと思ったときに一番ハマったのがOCIのインスタンス作成でした。最初はOracle Cloud Deveroper Imageを選択してインスタンス作成したのですが、なぜかSSHログインできずに何度も作り直して再度接続を試して...（もちろん**セキュリティリストの設定は0.0.0.0/0:22で開いているデフォルトの状態**で、ちゃんとそのサブネットにインスタンスが配置されていたのでその部分では問題なかったです。）
インスタンス名に日本語があると接続できないという情報は見つけましたが入っておらず、インスタンス名変更したり、Image別のものにしたりいろいろしましたが、極力何も手をいれないデフォルトの状態で作成してみた結果、うまくいきました。**単にSSH接続確認するのが早すぎた**のか？うーん...

とりあえずできたので、AWS Cloud9の使い方とか調べながらpythonでSpleeter使ってみたいと思います！

# 参考URL
- Qiita記事：[AWS Cloud9をSSH接続で使うまでの手順](https://qiita.com/predora005/items/bb3a5ef93acbd351a686)
- AWS公式ドキュメント：[SSH 環境ホスト要件](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/ssh-settings.html)
- AWS公式ドキュメント：[AWS Cloud9 インストーラを使用する](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/installer.html#installer-download-run)