📑

EC2でインスタンスを立ててSSHで接続で快適に作業する

2022/09/20に公開

この記事の背景

EC2でインスタンスを立てて、ちょっとした検証作業をしたい時は多いと思います。そんな時にもなるべく快適に作業をしたいものですが、ググりながら環境構築していると結構時間を消費してしまうものです。そこで私が最低限設定しておきたい環境を、備忘録も兼ねてこの記事にまとめておくことにしました。

私にとっての快適な作業環境

人によって快適な作業環境は様々だと思います。ここには、私が最低限これだけあればストレスをそれほど感じずに作業できると考える条件を挙げていきたいと思います。

  • プロンプトやコマンドに色が付いて見やすくなっている
  • 簡単にディレクトリ移動ができる
  • コマンド履歴を簡単に検索できる

他にも色々な条件があるかと思いますが、今回はこの条件を満たす環境を構築する作業の流れを記事にしていきたいと思います。

ローカル環境

  • macOS 11.3.1
  • 接続端末 Mac標準 terminal
    • tmux 3.2a
    • prezto

立ち上げたEC2インスタンス

接続するEC2インスタンスはこんな感じで準備しました。EC2の立ち上げ手順は本記事の趣旨から外れますので、ここでは割愛させて頂きます。

  • OSイメージ(Ubuntu)
  • インスタンスタイプ(t2.micro)
  • セキュリティグループ(特定のIPアドレスからのみSSH接続を許可)
  • ストレージ(8GiB)

EC2インスタンスへの接続確認

EC2インスタンスのリストで接続したいインスタンスにチェックを入れて接続ボタンをクリックすると、そのインスタンスへ接続するためのコマンドが表示されます。それをコピーしてターミナルで実行すれば簡単にSSH接続できます。この時、秘密鍵を保管しているディレクトリでコマンドを実行するか、コマンドで秘密鍵のパスを指定する必要があることに注意して下さい。

  • コンソール画面

  • 接続コマンド

~ ❯❯❯ ssh -i "[秘密鍵のパス].pem" ubuntu@ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
  • OSの確認
    無事EC2インスタンスにSSHで接続できたのでOSを確認しておきましょう。今回の環境はUbuntuの22.04LTSです。
$ cat /etc/os-release 
PRETTY_NAME="Ubuntu 22.04 LTS"
NAME="Ubuntu"
#以下省略

接続時のプロンプト

私のターミナルのプロンプトはこんな感じです。

tmuxを使用しないでEC2に接続すると次のようになるのですが、

tmuxを使用して接続すると、こんな感じになってしまいます。

プロンプトに色が付いていないのでなんだか寂しいですし、なんと言っても見づらいです。まずはこれから解消していきたいと思います。

シェルをzshに変更

使用したいツールはzsh用のものが多いので、シェルがzsh出ない場合はzshに変更する必要があります。EC2に接続した状態で以下のコマンドを打ってシェルを確認します。

$ echo $SHELL
/bin/bash

bashですね。まずはシェルをzshに変更することから始めます。

#zshのインストール
$ sudo apt install zsh

#シェルを変更
$ sudo chsh $USER -s $(which zsh)

#SSH接続を切断
$ exit

再度SSH接続するとzshの設定をどうするか聞いてきます。1を選んでメインメニューに進みましょう。

You can:
(q)  Quit and do nothing.  The function will be run again next time.

(0)  Exit, creating the file ~/.zshrc containing just a comment.
     That will prevent this function being run again.

(1)  Continue to the main menu.

(2)  Populate your ~/.zshrc with the configuration recommended
     by the system administrator and exit (you will need to edit
     the file by hand, if so desired).

メインメニューの(1)〜(3)は設定することが推奨されている(recommended)ので設定していきましょう。まずは1を入力してコマンド履歴の設定をします。

Please pick one of the following options:

(1)  Configure settings for history, i.e. command lines remembered
     and saved by the shell.  (Recommended.)

(2)  Configure the new completion system.  (Recommended.)

(3)  Configure how keys behave when editing command lines.  (Recommended.)
・・・

コマンド履歴の設定画面です。デフォルトで1000件分の履歴が保存されるようになっています。0を入力してデフォルト設定のままメインメニューに戻ります。

History configuration
=====================

# (1) Number of lines of history kept within the shell.
HISTSIZE=1000                                                (not yet saved)
# (2) File where history is saved.
HISTFILE=~/.histfile                                         (not yet saved)
# (3) Number of lines of history to save to $HISTFILE.
SAVEHIST=1000                                                 (not yet saved)

# (0)  Remember edits and return to main menu (does not save file yet)
# (q)  Abandon edits and return to main menu

次にメインメニューで2を入力すると補完機能の設定ができます。下記の画面で1を入力すればデフォルトのオプションで保管機能を有効にできます。

・・・
You can:
  (1)  Turn on completion with the default options.

  (2)  Run the configuration tool (compinstall).  You can also run
       this from the command line with the following commands:
        autoload -Uz compinstall
        compinstall
       if you don't want to configure completion now.

  (0)  Don't turn on completion.

メインメニューで3を入力すればキーバインドの設定ができます。デフォルトではEmcasになっています。Vimに変更したければ1を入力して選択画面に移行したらvを入力します。元の画面で0を入力すればメインメニューに戻ります。

Default editing configuration
=============================
・・・
# (1) Change default editing configuration
bindkey -e                                                                     (not yet saved)

# (0)  Remember edits and return to main menu (does not save file yet)
# (q)  Abandon edits and return to main menu

#選択画面
--- Type one of the keys in parentheses --- 1
Pick a keymap (set of keys) to use when editing.
Type:
  (e) for Emacs keymap (recommended unless you are vi user)
  (v) for Vi keymap
  (n) not to set a keymap (allow shell to choose)
  (k) to keep the current setting, (e):

最後にメインメニューで0を入力すれば設定完了です。

・・・
(0)  Exit, saving the new settings.  They will take effect immediately.
・・・

zshの設定が完了するとプロンプトの表示が変わっています。

シェルも確認してみましょう。

% echo $SHELL
/usr/bin/zsh

.zshrcを確認すると先ほど設定した内容が記述されています。

% cat .zshrc 
# Lines configured by zsh-newuser-install
HISTFILE=~/.histfile
HISTSIZE=1000
SAVEHIST=1000
bindkey -v
# End of lines configured by zsh-newuser-install
# The following lines were added by compinstall
zstyle :compinstall filename '/home/ubuntu/.zshrc'

autoload -Uz compinit
compinit
# End of lines added by compinstall

Preztoのインストール

シェルをzshに変更できたので、次はPreztoをインストールしていきます。Preztoはzsh用の軽量フレームワークです。インストール作業を始める前に.zshrcのバックアップを取っておいても良いでしょう。

cp .zshrc .zshrc.org

以下のコマンドでPreztoのリポジトリからクローンしてきます。

git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"

.zshrcを開いて次のコマンドを追記します。.zshrcが存在していない場合はここは省略可能です。今回はzshのインストール時に.zshrcも同時に作成してあるのでこの1行を追加しないと、次のコマンド実行時にエラーが発生してうまくインストールできません。

#Vimで.zshrcを開く
% vi .zshrc

#これを.zshrcの最後に追加
source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"

次のコマンドを実行します。

setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

シェルを再起動します。

exec $SHELL -l

Preztoが有効になり、プロンプトの表示が変わっていると思います。

Preztoには多くのテーマが用意されています。prompt -plとコマンドを打つとPreztoの全テーマをプレビューすることができます。気に入ったテーマを見つけたら.zpreztorcファイルの133行目辺りにあるthemeの項目でテーマ名を変更します。

#全テーマのプレビュー
$ prompt -pl

#Vimでpreztoの設定ファイルを開く
$ vi .zpreztorc

#.zpreztorcの133行目でテーマを変更
zstyle ':prezto:module:prompt' theme 'kylewest'

#シェルの再起動
$ exec $SHELL -l

シェルを再起動するとプロンプトのテーマが変更されているはずです。kylewestというテーマにするとプロンプトは下記のようになります。これでプロンプトがスッキリして色も付いたのでだいぶ見やすくなりました。

この後の作業でコマンドラインをもう少し使いやすくしていきたいと思います。

コマンドに色をつける

Preztoによってプロンプトには色が付きましたが、入力したコマンドにはまだ色が付いていません。Preztoを使ってシンタックスハイライトの機能を組み込むことができます。.zpreztorcの32行目辺りでpreztoで使用するモジュールを記述しています。ここにsyntax-highlightingを追加します。ここで注意するべき点は呼び出すモジュールの順番です。history-substring-searchpromptモジュールと併用する際はそれらよりも前に記述しておく必要があります。

zstyle ':prezto:load' pmodule \
  'syntax-highlighting' \
      ・・・
  'history-substring-search' \
  'prompt'

設定ファイルを変更したらシェルを再起動しましょう。これでコマンドにも色が付くようになりました。コマンドを間違えている時には赤くハイライトして教えてくれます。

コマンド履歴の検索を楽にする

次にコマンド履歴を簡単にする為にfzfをインストールします。fzfは曖昧検索を可能にしていくれるツールで、他のツールとの連携も可能です。

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install
#以下の質問は全部yesでOK
#キーバインディングをyesにしないとCtrl+Rが使えない
Do you want to enable fuzzy auto-completion? ([y]/n)
Do you want to enable key bindings? ([y]/n)
Do you want to update your shell configuration files? ([y]/n)

シェルを再起動するとfzfが有効になっています。Ctrl + Rを入力するとコマンド履歴のリストが表示されるので、目的のコマンドまで上下で移動して実行することができます。

また、実行したいコマンドを途中まで打つと、履歴の中から一致するコマンドがリスト表示されます。リストで表示されることで目的のコマンドを見つけやすくなります。

ディレクトリ移動を簡単にする

次はディレクトリ移動を簡単にしていきます。使用するのはenhancdfzfです。fzfはインストール済みですのでenhancdをインストールしましょう。まずはzshのプラグインマネージャのzplugをインストールします。

curl -sL --proto-redir -all,https https://raw.githubusercontent.com/zplug/installer/master/installer.zsh | zsh

zplugのインストールが完了したら、.zshrcに追記します。

#初期化ファイルの読み込み
source ~/.zplug/init.zsh
#enhancd
zplug "b4b4r07/enhancd", use:"init.sh"
#未インストールのプラグインがある時だけインストールを実行
if ! zplug check; then
    zplug install
fi
#プラグインのロード
zplug load

シェルを再起動する度にプラグインをチェックして、インストールされていないものがあると自動でインストールされます。enhancdを使うと一度行ったことのあるディレクトリに簡単に行けるようになります。コマンドラインでcdと打つとenhancdの入力モードになります。ここで移動したいディレクトリに含まれる文字を打つと候補がリストで表示されるので、選択するだけで簡単に移動できます。次のようなディレクトリ構成の場合でも4と打つだけでtest4ディレクトリが候補に挙がるので、途中のパスを入力することなく移動することができます。

~ ❯ tree
.
├── testdir1
│   └── testdir3
│       └── testdir4
└── testdir2

以上の作業でコマンドラインが見やすくなり、コマンド履歴の検索やディレクトリ移動も簡単になりました。同じような悩みを持っている方の参考になれば幸いです。

参考にしたサイト

Discussion