macOSでAWS EC2(Linux)へのssh作業ログを出力する

#はじめに

macOSのターミナルでは、

```
[ターミナル] - [環境設定]を開く
[プロファイル]タブ - [シェル]を開く
[コマンドを実行]にチェックを入れ、ログファイルを指定したscriptコマンドを記述
```
することにより、ターミナル起動後から終了までの全ての作業を、１つのログファイルに書き出すことができますが、

プロンプトも変更され、複数回のsshログインも１つのログファイルにまとめられてしまいますし、ログ出力のON/OFFの切り替えも面倒です。

そこで、必要な時にだけログ出力を開始／停止するスクリプトを紹介します。

#スクリプトの作成
スクリプトは、

```
①ログ出力の開始スクリプト(log_start.sh)
②sshログイン用スクリプト(ec2_ssh.sh)
```
の２つを用意します。

##①ログ出力を開始するスクリプト`(log_start.sh)`
ログ出力を開始するスクリプトです。`（ログイン名）`と`（ログ出力先のディレクトリ名）`は、自分の環境に合せて書き換えておいてください。

ログイン名と接続先IPアドレス（シェル変数`$AWS_UNAME`）は②のsshでのログインでも必要となる情報なので、環境変数にもexportしています。

出力ログファイル名のフォーマットは、`"yyyymmdd-HHMMSS_接続先IPアドレス.log"`としています。ElasticIPを利用していてIPアドレスが固定の場合は、IPアドレス部を日付時刻の前に持ってきた方が見やすいかもしれません。

```bash:log_start.sh
#!/bin/bash

if [ $# -ne 1 ]; then
  echo "Usage log_start.sh <EC2 ip address>"
  exit 1
fi

AWS_IPADDR=$1
export AWS_IPADDR

AWS_HOSTNAME=`echo $1 | tr . -`
export AWS_HOSTNAME

AWS_UNAME="（ログイン名）@ec2-"$AWS_HOSTNAME".ap-northeast-1.compute.amazonaws.com"
export AWS_UNAME

echo $AWS_UNAME

timestamp=`date "+%Y%m%d-%H%M%S"`
logfile="（ログ出力先のディレクトリ名）/"$timestamp"_"$AWS_IPADDR".log"

script $logfile     # ログ出力を開始する
```

##②AWS EC2(Linux)にsshでログインするスクリプト`(ec2_ssh.sh)`

次に、AWS EC2(Linux)にsshでログインするスクリプトです。

（キーファイル名）には、各インスタンス専用の秘密鍵（.pemファイル）を指定してください。

`ログイン名@接続先ホスト名`には、①の処理でexportした環境変数`$AWS_UNAME`を与えます。

```bash:ec2_ssh.sh
#!/bin/bash

ssh -i "$HOME/.ssh/（キーファイル名）" $AWS_UNAME
```

#処理の開始
##①ログ出力を開始する
ログ出力を開始するには、log_start.shを実行します。引数には接続先AWS EC2(Linux)のIPアドレスを指定してください。

###書式の確認（引数なしの場合）
```bash
yuza-no-MacBook:Scripts yuza$ ./log_start.sh 
Usage log_start.sh <EC2 ip address>
```

###接続先のIPアドレスを指定して実行
```bash
yuza-no-MacBook:Scripts yuza$ ./log_start.sh xxx.xxx.xxx.xxx
(ログイン名)@ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
Script started, output file is /Users/yuza/（ログ出力先のディレクトリ名）/20180812-090213_xxx.xxx.xxx.xxx.log
```

##②AWS EC2(Linux)にsshでログインする
ログ出力が開始されたら、AWS EC2(Linux)にsshでログインします。①の`log_start.sh`で、接続先のIPアドレスおよびログイン名は環境変数`AWS_UNAME`出力済みですので、`ec2_ssh.sh`の実行時には接続先の指定は不要です。

```terminal
bash-3.2$ ./ec2_ssh.sh 
The authenticity of host 'ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com (xxx.xxx.xxx.xxx)' can't be established.
ECDSA key fingerprint is SHA256:（ここにはフィンガープリントが表示される）
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com,xxx.xxx.xxx.xxx' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-1062-aws x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 個のパッケージがアップデート可能です。
0 個のアップデートはセキュリティアップデートです。


Last login: Sat Aug 11 14:35:00 2018 from xxx.xxx.xxx.xxx

（ログイン名）@ip-172-31-29-205:~$ 
```

##AWS EC2(Linux)のログオフ
AWS EC2(Linux)側での作業が終わったら、AWS EC2からログオフ（もしくはシャットダウン）します。

```bash
(ログイン名)@ip-172-31-29-205:~$ exit
ログアウト
Connection to ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com closed.
bash-3.2$ 
```

#ログ出力の停止
macOS側（scriptコマンドのbash）プロンプトが表示されています。exitコマンドでscriptコマンドを終了させ、ログ出力を停止します。

```bash
bash-3.2$ exit
exit

Script done, output file is （ログ出力先のディレクトリ）/20180812-090213_xxx.xxx.xxx.xxx.log
yuza-no-MacBook:Scripts yuza$ 
```

#ログファイルの確認
（ログの出力先ディレクトリ）を確認すると、下記のようにログファイルが出力されているはずです。

```bash
bash-3.2$ ls -al （ログ出力先のディレクトリ）
total 88
drwxr-xr-x   6 yuza  staff    192  8 12 09:41 .
drwxr-xr-x+ 52 yuza  staff   1664  8 12 09:40 ..
-rw-r--r--   1 yuza  staff    189  8 12 09:01 20180812-090054_xxx.xxx.xxx.xxx.log
-rw-r--r--   1 yuza  staff  17070  8 12 09:03 20180812-090213_xxx.xxx.xxx.xxx.log
-rw-r--r--   1 yuza  staff  13055  8 12 10:00 20180812-093622_xxx.xxx.xxx.xxx.log
-rw-r--r--   1 yuza  staff   1062  8 12 09:42 20180812-094156_xxx.xxx.xxx.xxx.log
bash-3.2$ 
```