EC2 インスタンスを Android / iOS から起動・接続・停止する環境を構築する

これまで VPS をレンタルしてましたが、利用頻度がさほどでもないので、必要時だけ EC2 のインスタンスを起動することで定額課金を無くそうと思いました。t2.micro や t2.nano のインスタンスは開発環境としてはそこそこのスペックで時間当たり料金も安いので財布にやさしいのです。

モバイルから Web UI でインスタンスの起動や停止を行うのは面倒なので、AWS CLI を使いたいところです。AWS CLI の実行には Python が必要なので単なる SSH クライアントアプリだと動きません。

ということで、AWS のドキュメントを参考にしながら Android と iOS でそれぞれ環境構築してみました。

docs.aws.amazon.com

Android

もちろん Termux を使います。

play.google.com

Python 環境を構築して、awscli を pip install します。

# Python パッケージをインストール
$ pkg install python python-dev

# venv を作成
$ python3 -m venv enva

# venv をアクティベート
$ source /enva/bin/activate
(enva) $ 

# pip で awscli をインストール
(enva) $ pip install awscli 

# awscli 起動確認
(enva) $ aws --version
aws-cli/1.16.96 Python/3.7.2 Linux/4.9.96-gce70628-ab5122554 botocore/1.12.86

iOS

iSH (ベータテスト中) を使いました。

github.com

iSH は Alpine Linux ベースなので apk コマンドでパッケージをインストールします。

# sudo をインストール sudo ユーザ追加
# apk add sudo
# adduser user1
# vi /etc/sudoers

# python3 をインストール
$ sudo apk add python3 python3-dev

# venv を作成
$ python3 -m venv enva

# venv をアクティベート
$ source enva/bin/activate

# awscli  を pip でインストール
(enva) $ pip3 install awscli

# awscli 起動確認
(enva) $ aws --version
aws-cli/1.16.96 Python/3.6.6 Linux/3.2.0-ish botocore/1.12.86

iSH は Python のチューニングがまだみたいでけっこう待たされますが一応 aws コマンドは使えるようになりました。

EC2 インスタンスの作成

AWS の EC2 マネージメントコンソールでキーペアを作成し、作成したキーペアを使って EC2 インスタンスを AMI から作成します。 今回は、Ubuntu を選択しました。

キーペアの作成も EC2 マネージメントコンソールで行いました。AWS CLI でコマンドを叩く方法もあるのですが、インスタンスを複数の端末から使うため、キーペアのファイルを取得しておきたいためです。

AWS CLI の設定

あとは端末ごとに設定を行います。AWS CLI の設定用サブコマンドでアクセスキーID、アクセスキー、リージョン、出力フォーマットを入力します。

(enva) $ aws configure
AWS Access Key ID [None]: xxxxxxxxxxxx
AWS Secret Access Key [None]:  xxxxxxxxxxxxxxxxxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: text

キーペアのファイルを保存し、読み取り権限を変更しておきます。

$ chmod 400 devenv-key.pem 

以上で、EC2 インスタンスへの接続準備ができました。

起動、接続、停止

固定 IP アドレスは取得していないので、起動のたびにインスタンス ID から取得する必要があります。

#  venv をアクティベート
$ source enva/bin/activate

# インスタンス起動
(enva) $ aws ec2 start-instances --instance-ids "i-xxxxxxxxxxxxxxxxxxx"

# IP アドレス取得
(enva) $ aws ec2 describe-instances --instance-ids i-xxxxxxxxxxxxxxxxxxx --query "Reservations[0].Instances[0].PublicIpAddress"

# ssh でログイン
(enva) $ ssh -i devenv-key.pem ubuntu@xx.xxx.xxx.xxx

# インスタンス停止
(enva) $ aws ec2 stop-instances --instance-ids "i-xxxxxxxxxxxxxxxxxxx"

シェルにしておいた方がいいですね。これで Pixel 3 からも iPad からも EC2 インスタンスを起動して SSH 接続、停止ができるようになりました。iSH はまだベータ版とはいえ、SSH に関しては問題なく作業できる状態です。

EC2 インスタンス自体も必要時に AMI から作って環境構築を Ansible で実行するよう自動化しておけば、Immutable Infrastructure をさらに進めることができます。今後 Ansible Playbook を整備していきたいと思います。