AWS WorkSpaces に Amazon LInux 2 の仮想デスクトップをJavaやPHP開発環境としてセットアップした時の作業履歴 

# 前置き

備忘のための記録なので解説などは無し。

# 経緯

昨年末に新規購入した MacBook Pro が先日(2021年6月17日の晩)に突然起動しなくなった。
Appleサポートに問い合わせて最終的に修理してもらうことになったんだけど、修理が終わって帰ってくるのに7営業日ほどかかるとのこと。

その間、手元にある古い MacBook Air(2013-late 標準構成) を引っ張り出して仕事を代替しないといけなくなった。
今やってる仕事は「SpringBootを使ったWebアプリケーションを開発するためのDocker環境や各種IDE(EclipseやIntellij IDEA)やその他開発ツールを同時に立ち上げつつ、ZoomやMeet等のコミュニケーションツールで話しながらブラウザのタブをたくさん開いてる」なんていう状況が起きるので、もはやこの古い端末ではリソース不足。
**そこで、Webアプリケーション開発環境を AWS WorkSpaces のLinux仮想デスクトップへ置いてリモートデスクトップ的に操作することにした。**

構築して操作してみたら、コーディングと実装の動作確認を進めることはリモートデスクトップでもけっこう代替できる感触だったので、構築時の作業履歴をメモ代わりに残しておく。

# 作業履歴

※重ねて言うが、備忘のための記録なので解説などは無し。

## 1. 選択した仮想デスクトップのスペック

- STEP3: バンドルの選択
    - バンドル: Standard with Amazon Linux 2
    - 言語: Japanese(日本語)
    - CPU: 2vCPU
    - メモリ: 4GiB
    - ルートボリューム: 80GB
    - ユーザーボリューム: 100GB
- STEP4: WorkSPacesの設定
    - 実行モード: AlwaysOn
    - 暗号化: ※特に指定せず
    - タグの管理: ※特に指定せず

上記の設定で仮想デスクトップのインスタンスを作成し、起動する。

## 2. Amazon WorkSpacesクライアントでLinux仮想デスクトップへアクセス後にやったこと

※起動してくる Amazon Linux 2 は fedoraベースのようなので、ネット上でCentOS7相当の情報を参考にすれば細かな問題は解決できる。

### 2-1: sudoのパスワード入力を省略する設定

```
$ sudo su - 
$ vi /etc/sudoers.d/01-ws-admin-user
※ログイン中のユーザのID行にて、末尾の ALL を NOPASSWD:ALL へ変更
```

### 2-2: 英語キーボードレイアウトへ変更

※ 手持ちの MacBook Air が英語キーボードレイアウトなので。

- GUIから
    - 「システム＞設定＞キーボード」から「レイアウト」タブを開く
    - 「英語US」のみにする
    - キーボードの形式:「標準101キーPC」

### 2-2: 単語登録

参考 - http://www.ne.jp/asahi/akira/imakura/CentOS7.html
> 日本語入力にに変えるには、Super + スペースキーを押す。ただしこれを一度すると、次回からは、半角全角キーで日本語、英語入力の変更ができる。
登録したい単語を選択しAlt + R を押してから読みを入力すると、単語登録ができる。しかしAlt + Rは日本語入力ができる状態で押さなければならない。半角入力の状態で押すと記録しない。
登録した単語を削除するには、変換してその単語が出た時にCtrlキーとbackspaceキーを押す。

### 2-3: dockerセットアップ

```
$ sudo yum check-update
$ sudo amazon-linux-extras install docker
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo usermod -aG docker $(whoami)
$ sudo systemctl start docker.service
$ sudo systemctl status docker.service
$ sudo systemctl enable docker.service
```

### 2-4: AWS環境下のLinuxインスタンスでdockerを利用する場合におけるネットワーク利用の問題に対処

上記でdocker使えるようになってはいるが、
docker-compose で作られる仮想ネットワーク配下の各種コンテナがDNSを解決できないらしく、下記の対応が必要。

#### (不採用) 対応策1: 極端な解決方法っぽいもの

https://qiita.com/mosop/items/3784e1bf56b0d518e2c3
これだとローカルで app とか db とか mvn みたいなdocker-compose.yml に書いたサービス名でのホスト間のアクセスができなくなるので、困る。

#### (不採用) 対応策2: 根本的な対処方法？(っぽいけど、ちょっとよくわからない)
https://docs.aws.amazon.com/ja_jp/workspaces/latest/adminguide/amazon-workspaces-troubleshooting.html#docker_support

#### (採用した対応策): dnsmasq の設定を行う

参考 - https://zenn.dev/sogaoh/scraps/d1cf2e766961e19a1a15

- この記事の人が取り組んでいることがちょうど同じ問題のようだった。
    - dnsmasq なるものの使い方をちゃんと把握して、各種dockerコンテナからDNSリクエストにdnsmasqが応えるようにする必要がありそうだが...
    - https://aws.amazon.com/jp/premiumsupport/knowledge-center/dns-resolution-failures-ec2-linux/
    - 上記に一通り目を通すと、書いてあるとおりにdnqmasqをセットアップするためのオートメーションスクリプトがAWSから提供されていて使い方も載っていた。
        - その通りにやったら、docker上でもDNSの解決ができるようになった。

## 3. 開発作業向けの準備

```
$ sudo yum install git
```

### 3-1: gitの設定

```
$ git config --global user.name "Tatsuhiko Kimita"
$ git config --global user.email "nannbo@crappo.net"
```

### 3-2: Chromeのインストール

```
$ sudo vi /etc/yum.repos.d/google-chrome.repo
### ↓編集内容 ###
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/x86_64
enabled=1
gpgcheck=1
gpgkey=https://dl.google.com/linux/linux_signing_key.pub
### ↑編集内容ここまで ###

$ sudo yum update
$ sudo yum install --enablerepo=google-chrome google-chrome-stable
```

### 3-3: jdk 11系 のセットアップ

```
$ sudo yum install java-11-amazon-corretto
$ sudo alternatives --config java    ## java-11-amazon-correttoを指定する
$ sudo alternatives --install /usr/local/java_home java_home /usr/lib/jvm/java-11-amazon-corretto.x86_64 1
$ sudo alternatives --config java_home    ## java-11-amazon-correttoを指定する
$ sudo vi /etc/profile.d/java_home.sh
### ↓下記を入力して保存↓ ###
export JAVA_HOME=/usr/local/java_home
export PATH=$PATH:/usr/local/java_home/bin
### ↑入力内容ここまで↑ ###
```

### 3-4: anyenvやphpenvをセットアップ

```
###################################
##  anyenv のセットアップ
###################################
$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="~/.anyenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(anyenv init -)"' >> ~/.bashrc
$ ~/.anyenv/bin/anyenv install --init
$ exec $SHELL -l
$ ~/.anyenv/bin/anyenv init
$ mkdir -p ~/.anyenv/plugins
$ git clone https://github.com/znz/anyenv-update.git ~/.anyenv/plugins/anyenv-update
$ git clone https://github.com/znz/anyenv-git.git ~/.anyenv/plugins/anyenv-git
$ anyenv update


###################################
##  phpenv, php8.0.x系 のセットアップ
###################################
$ sudo amazon-linux-extras install -y epel
$ sudo yum groupinstall 'Development Tools'
$ sudo yum install \
    re2c \
    bzip2-devel \
    freetype-devel \
    krb5-devel \
    libcurl-devel \
    libicu-devel \
    libjpeg-turbo-devel \
    libpng-devel \
    libtidy-devel \
    libxml2-devel \
    libxslt-devel \
    libzip-devel \
    oniguruma-devel \
    openssl-devel \
    readline-devel \
    sqlite-devel \
    systemd-devel \
    zlib-devel
$ anyenv install phpenv
$ exec $SHELL -l
$ echo 'export PATH="$(phpenv root)/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(phpenv init -)"' >> ~/.bashrc
$ exec $SHELL -l
$ phpenv --version
$ mkdir -p $(phpenv root)/plugins/php-build
$ git clone git://github.com/php-build/php-build.git $(phpenv root)/plugins/php-build
$ phpenv install --list
$ phpenv versions
$ phpenv install -i development 8.0.7
$ phpenv global 8.0.7
$ php -v
```