🏎️

Amazon Linux WorkSpaces 開発環境セットアップ例

2022/06/18に公開

はじめに

これは、PCスペック面等の事情で、急ぎそれなりに強力めの開発環境が必要な際に利用が有効な Amazon Linux Workspaces にて、最低限のセットアップを手早く行う手順をまとめた記事です。

2020年11月時点の以下記事の情報をある程度ベースにしています。

https://zenn.dev/sogaoh/scraps/d1cf2e766961e19a1a15
https://zenn.dev/sogaoh/articles/20-12-17-f76cea4051692f0ba7bb

この中↑にちらっと記述があるのですが、この記事をなぞってのセットアップの際には何度かパスワードが要求されるシーンがあります(sudo・ansible-playbook の become)ので、打ち込みやすいもので進めるのが良さそうです。
また、管理者によるユーザー作成時に来るメールを受け取って、クライアントツールのダウンロード・インストールとパスワード設定は完了している状態を想定して記述します。

SSH 接続設定に慣れている方であれば、最初に 調整事項 の SSH接続設定 をやってしまって慣れたターミナルでセットアップを進めるのがベターかもしれません。

利用する alw-provisioner

手前味噌ですが、2022/6/17 時点でそれなりに妥当に動作したので、以下を利用します。

https://github.com/ant-in-giant/alw-provisioner/

利用する前提として、
sudo amazon-linux-extras install ansible2
で Ansible 2 系をインストールしておいてください。[1]

alw-provisioner の clone
  1. clone するディレクトリを作成
    例) mkdir ~/temp
  2. clone するディレクトリに移動
    例) cd ~/temp
  3. alw-provisioner の clone
    git clone https://github.com/ant-in-giant/alw-provisioner.git

~/temp/alw-provisioner が生成されているはず

セットアップ対象

以下のツールに関して、インストール手順を記述します。
拡張機能・プラグインやライセンス設定は各自で必要なものを適宜追加・対応してください。

(1) VS Code
  1. ブラウザで VSCode を検索する等で Visual Studio Code のサイト へ進み、「今すぐダウンロード」へ
  2. .rpm[2] のところのボタンを押下してインストールメディアをダウンロード
↑スクリーンショット (1)

  1. ~/ダウンロード ディレクトリに code-[version]-[identify].el7.x86_64.rpm のような名前でインストールメディアが存在することを確認
  2. ターミナルでインストールコマンド実行
    例) sudo rpm -ivh code-1.68.1-1655263151.el7.x86_64.rpm
  3. インストール完了後、ターミナルで code コマンドを実行すると、VS Code が起動される

OS再起動後に、左下「アプリケーション」から「プログラミング」に Visual Studio Code が追加されるのでここからでも起動できる

(2) IntelliJ IDEA (Ultimate)
  1. alw-provisioner のディレクトリに移動
    例) cd ~/temp/alw-provisioner
  2. IntelliJ IDEA インストール実行
    make ij
    (少々待ち時間がかかると思います)

~/Applications/idea ディレクトリが生成されており、~/Applications/idea/bin/idea.sh が起動シェル。
適宜、「リンクを作成」したり「指定先に移動 -> デスクトップ」等を行ってショートカットを作るのが良さそう。
アイコン変える等も適宜、任意で。

補足
(3) nvm
  1. alw-provisioner のディレクトリに移動
    例) cd ~/temp/alw-provisioner
  2. nvm インストール実行
    make nvm
  3. 新規ターミナルを起動したうえで[3]、nvm のバージョンを確認
    nvm --version
    alw-provisioner/roles/nvm/vars/main.yaml のバージョンの通りであれば成功している状態と思われます

その後の Node.js インストールコマンド例(v16.15.1)

nvm install v16.15.1
nvm use v16.15.1

他の使い方に関しては GitHub の nvm リポジトリ を参照してください

補足
(4) Google Chrome
  1. ブラウザで chrome を検索する等で Google Chrome のサイト へ進み、「Chromeをダウンロード」ボタンを押下してインストールメディアをダウンロード
↑スクリーンショット (4)-1

  1. ~/ダウンロード ディレクトリに google-chrome-stable_current_x86_64.rpm のような名前でインストールメディアが存在することを確認
  2. ターミナルでインストールコマンド実行
    例) sudo yum localinstall google-chrome-stable_current_x86_64.rpm
  3. インストール完了後、左下「アプリケーション」から「インターネット」に Google Chrome が追加されるのでここから起動できる

起動のたびに「ログインのキーリングのロック解除」ダイアログが出ますが、「キャンセル」で問題ないです(適切なのかは未確認ですが「キャンセル」で自分には問題が起きたことはない)

↑スクリーンショット (4)-2

なお、Microsoft Edge もこれとほぼ同様の手順でセットアップできます(インストールメディアのファイル名が異なるくらい)

(5) docker
  1. ターミナルでインストールコマンド実行
    sudo amazon-linux-extras install docker
    バージョン確認は docker version など
  2. alw-provisioner のディレクトリに移動
    例) cd ~/temp/alw-provisioner
  3. サービス登録・自動起動有効化コマンド実行
    make services
補足
  • サービス登録・自動起動有効化処理の詳細は alw-provisioner/roles/services/tasks/main.yml の通り
  • サービス登録の確認コマンド : sudo systemctl status docker
  • 自動起動有効化の確認コマンド : sudo systemctl is-enabled docker -> enabled だったら自動起動有効

インストールはこれで完了だが、後述する 調整事項 を実施する必要があり、未実施の状態だと docker 利用時に「インターネットに出る(ダウンロードなど)」通信ができない可能性が高い

(6) docker-compose

いくつかのセットアップ方法があるようですが、ここでは
https://github.com/docker/compose
からダウンロードして PATH の効いているディレクトリに配置する、の手法を採用します

  1. 任意のディレクトリに移動
    例) cd ~/temp/
  2. Docker Compose の release page から docker-compose-linux-x86_64 のバイナリをダウンロード[4]
    例) wget https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-linux-x86_64
  3. ダウンロードしたバイナリのパーミッションを変更
    sudo chmod +x docker-compose-linux-x86_64
  4. PATH の効いているディレクトリにバイナリをリネーム+移動
    sudo mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
  5. バージョンとPATHが効いていることの確認
    docker-compose version
    which docker-compose

妥当にバージョンが表示されればOKです

調整事項

SSH 接続設定

別途セキュリティグループの設定が必要ですが、CLI派には iTerm2 などのターミナルから接続できると何かと便利です。
sudo yum install tmux で tmux のインストールを加えるのもオススメです。

`ssh my-alw` で接続するまでの設定手順

WorkSpaces側 (標準のターミナル)

  1. ssh-keygen -t rsa で鍵ペアを作成
    デフォルトのままであれば ~/.ssh/id_rsaid_rsa.pub が作成される
    パスフレーズを設定する等は必要に応じて適宜ご対応ください
  2. cd ~/.ssh で移動して cat id_rsa.pub >> authorized_keys する(sshd_config デフォルトの AuthorizedKeysFile に追記/新規作成)
  3. chmod 600 authorized_keys でパーミッション調整
  4. cat id_rsa で秘密鍵を表示しておく(クリップボードにコピーしておくと尚良い)(*1)

自身の端末側で (Mac を想定)

  1. cd ~/.ssh
    (存在しなければ、 mkdir -p ~/.ssh; sudo chmod 600 ~/.ssh; cd ~/.ssh を行う)
  2. vi alw.key 等で秘密鍵ファイルを作成し、(*1) の内容を転記して保存する(鍵ファイル名は任意)
  3. sudo chmod 600 alw.key しておく
  4. vi config で設定ファイルを編集モードで開き、以下のような内容を追記する(パーミッションは 600)
Host my-alw
  User "CORP\sogaoh"  # `NetBIOS名\Username` (WorkSpaces側のターミナルから `id` で確認できる)
  Hostname ${IPアドレス}  # ${IPアドレス} はWorkSpaces側のターミナルから `curl ifconfig.io` 等で確認できる 
  IdentityFile ~/.ssh/alw.key   # 正確な秘密鍵ファイルパス

ここまで設定後、ssh my-alw でSSH接続できる(できない場合はパーミッションかセキュリティグループか鍵の内容を確認してください)

公式ガイドは↓になりますので必要に応じて参照ください。  
https://docs.aws.amazon.com/ja_jp/workspaces/latest/adminguide/connect-to-linux-workspaces-with-ssh.html

docker 権限・通信設定

Docker の設定調整が必要で、DNS を Google Publix DNS に設定 という手数少なくベターな方法を見つけたのでこちらを記載します。

調整手順
  1. sudo gpasswd -a $USER docker # ログインユーザーで Docker の操作を行えるように設定
  2. sudo vi /etc/docker/daemon.json で以下の設定を作成
{
  "dns": ["8.8.8.8", "8.8.4.4"],
  "dns-search": ["."]
}
  1. sudo systemctl restart docker で Docker を再起動

  2. 一旦ログアウトして接続し直す

  3. コマンド docker run --rm amazonlinux:2 curl -s https://github.com/status を実行して GitHub lives! と表示されればOK

  4. 後始末として amazonlinux:2 の image を削除しておくのが良いと思います[5]

こんな感じのコンソール出力を想定
❯ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
              
CORP\sogaoh@a-XXXXXXXXXXXXX ~
❯ docker run --rm amazonlinux:2 curl -s https://github.com/status
Unable to find image 'amazonlinux:2' locally
2: Pulling from library/amazonlinux
8de5b65bd171: Pull complete
Digest: sha256:246ef631c75ea83005889621119fd5cc9cbb5500e193707c38b6c060d597a146
Status: Downloaded newer image for amazonlinux:2
GitHub lives! (2022-06-18 03:06:53 -0700) (1)

CORP\sogaoh@a-XXXXXXXXXXXXX ~ 10s
❯ docker images
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
amazonlinux   2         ecdeb69c57ad   6 weeks ago   164MB

CORP\sogaoh@a-XXXXXXXXXXXXX ~
❯ docker rmi ecdeb69c57ad
Untagged: amazonlinux:2
Untagged: amazonlinux@sha256:246ef631c75ea83005889621119fd5cc9cbb5500e193707c38b6c060d597a146
Deleted: sha256:ecdeb69c57ad20820ceb442c918b35228a6c9d04d6458768fdf4e86429cbccca
Deleted: sha256:2ce46c79ab58cf3d6f9556e9141c0564407a50028040a94bb8a82ab6e33331c2

CORP\sogaoh@a-XXXXXXXXXXXXX ~
❯ docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

CORP\sogaoh@a-XXXXXXXXXXXXX ~

手数が多くなるのですが↓の方法+OS再起動でも可能です。(sudo gpasswd -a $USER docker は必要なので初手で実行してください)
https://aws.amazon.com/jp/premiumsupport/knowledge-center/dns-resolution-failures-ec2-linux/

その他の設定

ひとまずここまでで伝えたいセットアップ手順としては完了なのですが、個人的には以下も実行して新環境を運用しています。

僕が実行したスクリプト
cd ~/temp/alw-provisioner
make brew   # linuxbrew のインストール
make zsh    # zsh・Prezto のインストールとデフォルトシェル切り替え
make dot    # dotfiles の投入(僕好みなので採否は適宜ご検討ください: refs https://github.com/ant-in-giant/alw-provisioner/tree/main/roles/dotfiles/files )

(ログインし直して)
brew install direnv
brew install anyenv
anyenv install --init   # ここまで、ログイン時のワーニング除去

(もう一度ログインし直して)
brew install peco    # これで強力なショートカットが増える。^H(history), ^F(selected_dir), ^R(repos), そして ^x^i(peco-docker-images)

料金に関して

https://aws.amazon.com/jp/workspaces/pricing/

気になる料金に関して確認したのですが、

  • 東京リージョン
  • スタンダード(2 vCPU、4 GBメモリ)
  • ルートボリューム 80GB、ユーザーボリューム 50GB

で月額料金($43)と時間料金($14+$0.36x4[hours]x20[days]=$14+$28.8=$42.8)でほぼ同じとなる計算でした。
つまり1日4時間を20日使ってると月額とだいたい同じになるので、AutoStopの体験(起動がやや時間かかる)を考慮すると、開発機として毎日ヘビー目に使うのであれば初めから AlwaysOn の方が良さそうです。

起動時の AutoStop/AlwaysOn 設定

制限事項

https://speedtest.net などで速度を計測してみるとわかると思うのですが、ネットワークは上下とも非常に速いです。Docker の動作も Intel Mac と比較すると格段に速く感じると思います。
このように強力な Amazon Linux WorkSpaces ですが、2022/6/18時点でわかっている辛いところが以下になります。ご認識置きください。

  1. 標準のターミナルでの日本語入力が思うようにできない場合がある
    • 右下の「JA」をクリックしてモードを変えることで調整できたりもするみたいです。最近知りました。。
  2. 標準のターミナルでクリップボードに思うようにコピーができてないケースがある
    • パスワードをペーストしてはずなのに通らない、がよく起こります。どうにか可視化したいと思うものの致命的に困ってはいないのでこれ以上追究をしていないです
  3. イメージからバンドルを作成してそれから WorkSpaces を起動しても、結局のところセットアップは1からやり直し
    • バックアップが取れない、という感じです。突然の壊れちゃったに対する備えとしては、こまめにリポジトリに push するようにしましょう
    • 量産できると・・・言うことないのですが・・・

対処方法わかったり、他にも辛いところがあったら随時追記していきたいと思います。

脚注
  1. Ansible のバージョン確認コマンド: ansible --version ↩︎

  2. Amazon Linux WorkSpaces はOSが Amazon Linux 2 でベースが Fedora だと思っている ↩︎

  3. https://github.com/nvm-sh/nvm/blob/master/install.sh が実行されて各種環境設定が行われるため、それが反映されるのが新規ターミナル起動以降 ↩︎

  4. 右クリックメニューで「リンクのアドレスをコピー」しておくと良いです ↩︎

  5. コンソール出力中の CORP は WorkSpaces のデフォルトNetBIOS名で、Simple AD を利用する等している場合は異なります(関連情報 : https://docs.aws.amazon.com/ja_jp/workspaces/latest/adminguide/launch-workspace-simple-ad.html) ↩︎

Discussion