🏠

[Ansible day.17] Amazon Linux WorkSpaces のセットアップ

2020/12/17に公開

Ansible Advent Calendar 2020 (Qiita) [1] 17日目のエントリです。
16日目は @zaki_hmkc さんの [Ansible] 自作のコレクションを作ってGalaxyで公開するまで - Qiita でした。
18日目は @hiyoko_taisa さんです。

最近、諸事情あって、Amazon WorkSpaces の利用を始めました。
見返してみたところ、呟き始めたのは 11/10 のようです。[2]
感じを掴んで Zenn の スクラップ Amazon Linux WorkSpaces で個別の作業環境を作り込む に状況を書き出したのが 11/22 。
実はそこから停滞気味な今日この頃なのですが、ここまでのセットアップをできる限り Ansible で行いました。
という経緯で、特記事項の紹介を何点かしたいと思います。

速い

AWS Linux WorkSpaces を利用していて強く実感しているのは、 速い ことです。
特に2点、ネットワークと Docker の処理速度が MacBook Air や Mac Mini と比べて別格です。

体感ですが、Docker上では通常やCircleCIで 15〜20分 かかるユニットテストが 5分程度で終わるし、 10分程度 かかる別案件環境のユニットテストが 4分 くらいで終わってます。

ネットワークは https://www.speedtest.net/ で何度か計測した記録がこちら。

セットアップコード(2020/12/17時点 で v1.3.0)

正直なところ作ってきた自分でないと動かし方が掴めなさそうなのですがこちらです。

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

Prerequisite に太字で書いてあるのですが、いちいちパスワードを聞かれるのでこの情報を参考に使ってみるという方は意識しておいてください。

Linux版 IntelliJ IDEA のインストール簡素化

とあるところで 神情報 を見つけて、それを Playbook 化できました。

その後の調整等ありますが、こんな感じで IDE を使っています。

インストール実行は以下のコマンド一発ですが、他のインストールでも、コンソール出力というか経過が気になる方が多いかと思いますので、適宜 -vvvvv を付ける等検討してください。


ansible-playbook _intellij-idea.yml -i "localhost," --tags=intellij-idea -K
_intellij-idea.yml

---
- hosts: localhost
  connection: local
  gather_facts: no
  vars:
    ansible_python_interpreter: "/usr/bin/python3"

  roles:
    - { role: intellij-idea, tags: intellij-idea }
roles/intellij-idea/tasks/main.yml

---
# refs https://www.bonusbits.com/wiki/HowTo:Install_IntelliJ_IDEA_on_Amazon_Linux_Workspace

- name: Download IntelliJ IDEA
  shell: "wget https://download.jetbrains.com/idea/ideaIU-{{idea_version}}.tar.gz -P $HOME/Downloads"

- name: Make directory for Applications/idea
  shell: "mkdir -p $HOME/Applications/idea"

- name: Extract downloaded Archive
  shell: "tar -xzf $HOME/Downloads/ideaIU-{{idea_version}}.tar.gz --strip-components 1 -C $HOME/Applications/idea"
roles/intellij-idea/vars/main.yml

(12/17時点で最新は 2020.3)


idea_version: 2020.2.4

Linuxbrew のインストール簡素化

探したところ How To: Install Homebrew on Amazon Linux – Garrett S. Y. Hampton を見つけ、これも Playbook 化しました。
Linuxbrewを入れると、Homebrew で MacBook Air にインストールしていたちょっとしたツールを簡単な記述でまとめて追加インストールできるようになって便利です。
コマンドはこちら↓のような感じ。(-vvvvv 等は適宜)


ansible-playbook _linuxbrew.yml -i "localhost," --tags=linuxbrew -K
_linuxbrew.yml

---
- hosts: localhost
  connection: local
  gather_facts: no
  vars:
    ansible_python_interpreter: "/usr/bin/python3"

  roles:
    - { role: linuxbrew, tags: linuxbrew }
roles/linuxbrew/tasks/main.yml
---
- name: Install Linuxbrew
  git: repo=https://github.com/Homebrew/brew.git recursive=yes dest=~/.linuxbrew/Homebrew

- name: Make directory for Linuxbrew/bin
  file: path=~/.linuxbrew/bin state=directory

- name: Set symbolic link to Linuxbrew/bin
  shell: "ln -s ~/.linuxbrew/Homebrew/bin/brew ~/.linuxbrew/bin/brew"

- name: Enable brew command
  shell: "eval $(~/.linuxbrew/bin/brew shellenv)"

Enable brew command は、もしかしたら不要かも

.zshrc に追記が必要(roles/dotfiles/files/.zshrc で管理)

# Linuxbrew
eval $(~/.linuxbrew/bin/brew shellenv)

ghqpeco に関しては、自身の Mac 版構成管理 をそのまま転記して brew via Ansible でのインストールに成功しました。

運用の前提として、当初の bash から zsh にする等いくつかがんばる必要がありますが、peco の利用は今やこの環境の使用に欠かせないほど便利です。Docker もよく 使うので、Docker イメージの断捨離を圧倒的に効率化する - Qiita を参照して導入したところ大変快適な開発環境を運用できるようになりました。

関連する記述はこちら。Mac との違いにご注意を。

roles/dotfiles/files/.zshrc で管理している、.zshrc への追記内容


# history
HISTFILE=$HOME/.zsh-history
HISTSIZE=100000
SAVEHIST=1000000

# share .zshhistory
setopt inc_append_history
setopt share_history


# peco
function peco-repos() {
    local selected_dir=$(ghq list -p | peco --query "$LBUFFER")
    if [ -n "$selected_dir" ]; then
        BUFFER="cd ${selected_dir}"
        zle accept-line
    fi
    zle clear-screen
}
zle -N peco-repos
bindkey '^R' peco-repos

function peco-history-selection() {
    BUFFER=`history -n 1 | tac | awk '!a[$0]++' | peco`
    CURSOR=$#BUFFER
    zle reset-prompt
}

zle -N peco-history-selection
bindkey '^H' peco-history-selection

if [[ -n $(echo ${^fpath}/chpwd_recent_dirs(N)) && -n $(echo ${^fpath}/cdr(N)) ]]; then
    autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
    add-zsh-hook chpwd chpwd_recent_dirs
    zstyle ':completion:*' recent-dirs-insert both
    zstyle ':chpwd:*' recent-dirs-default true
    zstyle ':chpwd:*' recent-dirs-max 1000
    zstyle ':chpwd:*' recent-dirs-file "$HOME/.cache/chpwd-recent-dirs"
fi

function peco-cdr () {
    local selected_dir="$(cdr -l | sed -E 's/^[0-9]+ +//' | peco --prompt="cdr >" --query "$LBUFFER")"
    if [ -n "$selected_dir" ]; then
        BUFFER="cd ${selected_dir}"
        zle accept-line
    fi
}
zle -N peco-cdr
bindkey '^F' peco-cdr
#bindkey '^D' peco-cdr

function peco-docker-images() {
  local images="$(sudo docker images | tail -n +2 | sort | peco --prompt 'DOCKER IMAGES>' | awk '{print $3}' ORS=' ')"
  [ -z "$images" ] && return
  BUFFER="$LBUFFER$images$RBUFFER"
  CURSOR=$#BUFFER
}

zle -N peco-docker-images
bindkey '^x^i' peco-docker-images

自分の場合、

  • Ctrl-r で リポジトリ利用履歴
  • Ctrl-h で コマンド履歴
  • Ctrl-f で フォルダ履歴
  • そして、Ctrl-x -> i で docker images のリストを引き出せてタブで選択していけてます(一回、テキトーに sudo しておくとパスワードを聞かれなくてスムーズです)。

以降は不調続き気味

brew でインストールができるようになったとはいえ、そもそもこれは Amazon Linux 2 なので、基本的にはインストールは yum で行うのが本筋だと思われます。
なので yum でのインストールをガンガンやっていこうとしたのですが、デフォルトの Python を 3系 に変えようとして混乱しました。最終的には 2系 に戻しています。

  • デフォルトの Python は 2系
  • yum 以外のインストール時は ansible_python_interpreter: "/usr/bin/python3" を指定する

という区別が必要です。

docker-compose を使えるようになるまでの苦戦

↓をご覧ください。
https://zenn.dev/sogaoh/scraps/d1cf2e766961e19a1a15#comment-e8ea4f00f7b901

後になって思うのは、↓の最後の方に書いてある AutomateDnsmasq.sh を Playbook 化もしくは簡素化したかったなー、と。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/dns-resolution-failures-ec2-linux/

sudo を支配できてなくて諸々に躓く

以後、mackerel-check-plugin や nvm を入れようとするなどしたのですが、様々なエラーに遭遇し、Playbook 化を断念して curl で入れて終わっています。
nvm に関しては README に Playbook ならこうだよって書いてあるのですが、そのまま実行してもダメでした。
Amazon Linux WorkSpaces の sudo を支配できればなあ・・・というのが今の気持ちです。

そのほかの難点

IDE は使用できるのですが、大変日本語が入力しづらいです。コメントを多く入れる必要がある実装作業にはかなり向かないと思います。
あるいは、コーディングを全て英語というか1バイト文字の世界だけでやるか。現実的でなさそうですが。
メモリ不足にも時々なったり。

デスクトップアプリケーションに関しては、普通のコピー&ペーストも思うようにいかないことがけっこうあって、だいぶイラつくかもしれません。
回避策としては、ひたすら CLI で作業するようにしてます。Vim 使いの方には良いかもしれません。
注意点は、放置しているとすぐに SSH 接続が切れることです。自分は tmux を使ってセッションを維持するようにしています。

さいごに

読んでいただいてありがとうございました。
Ansible の話が少なめとなってしまいましたが、Docker を使う CLI での開発 を前提とするとこの環境は相当高パフォーマンスを発揮できると思います。
気が向いたら、利用してみていただけるとうれしいです。
そして、セットアップの簡素化を試みる仲間がもしできたりしたら、泣いていいですか?(今年何度か言ったなあ・・)

脚注
  1. Adventer側カレンダーは こちら ↩︎

  2. https://twitter.com/sogaoh/status/1326014554736791552 ↩︎

Discussion