GCEのf1-micro環境でPythonが動く環境を構築する
Google Compute Engineの無料枠のf1-micro環境でPythonの実行環境を構築した記録です。
OSはUbuntu 19.04にしました。
% gcloud compute ssh [INSTANCE_NAME] $ cat /etc/os-release | grep VER VERSION="19.04 (Disco Dingo)" VERSION_ID="19.04" VERSION_CODENAME=disco
スワップ領域が無い
アップデートや必要ライブラリを入れる前にスワップ領域を作ります。
f1-microはRAMが600MBしか無いくせに、初期状態ではスワップ領域が未設定なのです。
$ cat /proc/swaps Filename Type Size Used Priority
そのままだとpipenv install
でOutOfMemory Killerというシリアルキラーがわりと現れる世紀末環境なので、設定は必須です。
スワップ領域を作る
スワップ領域のサイズは、RAMが2GBまでの環境ではRAMの2倍が一般的らしい。
慣習に従って、1.2GBで作ります。
$ sudo dd if=/dev/zero of=/var/swapfile bs=1M count=1200 1200+0 records in 1200+0 records out 1258291200 bytes (1.3 GB, 1.2 GiB) copied, 43.4791 s, 28.9 MB/s $ sudo chmod 600 /var/swapfile $ sudo mkswap -L swap /var/swapfile Setting up swapspace version 1, size = 1.2 GiB (1258287104 bytes) LABEL=swap, UUID=1ec17506-09a4-4517-911d-c3e3e0f45428 $ sudo swapon /var/swapfile $ cat /proc/swaps Filename Type Size Used Priority /var/swapfile file 1228796 0 -2
再起動時にスワップ領域が自動的にmountするようにする
このままだと再起動時に有効にならないので、fstabに書きます。
$ echo '/var/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab /var/swapfile swap swap defaults 0 0
確認のため再起動してみる。
$ exit
いったんsshを終了させて、gcloudコマンドで再起動します。
% gcloud compute instances stop [INSTANCE_NAME] % gcloud compute instances start [INSTANCE_NAME] % gcloud compute ssh [INSTANCE_NAME]
ログインできたらマウントの確認。
$ cat /proc/swaps Filename Type Size Used Priority /var/swapfile file 1228796 0 -2
マウントされていた。
Ubuntuのアップデート
$ sudo apt update
$ sudo apt upgrade -y
anyenvのインストール
aptで入れてもいいけど、OS配布版は古いバージョンになったりするので、anyenv + pyenvを使う。
今回はPythonしか使わないのでpyenvを直接入れてもいいけど、別の言語の時でも環境構築を同一手順にしたいのでanyenvから入れる。
$ git clone https://github.com/anyenv/anyenv ~/.anyenv $ cat << \EOS >> ~/.bashrc if [[ -d $HOME/.anyenv ]]; then export PATH="$HOME/.anyenv/bin:$PATH" eval "$(anyenv init -)" fi EOS $ exec $SHELL -l ANYENV_DEFINITION_ROOT(/home/user/.config/anyenv/anyenv-install) doesn't exist. You can initialize it by: > anyenv install --init $ anyenv install --init Manifest directory doesn't exist: /home/user/.config/anyenv/anyenv-install Do you want to checkout ? [y/N]: y ... Completed! $ anyenv --version anyenv 1.1.1
pyenvのインストール
依存ライブラリを入れる。
公式サイトによると、以下のライブラリが必要らしい。
$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev
xz-utils tk-dev libffi-dev liblzma-dev python-openssl git
ログを見るとbuild-essential, make, wget, curlはすでにあった。gitもすでに使ってるのである。
Minimal版を想定したライブラリ構成だろうか。
$ anyenv install pyenv $ exec $SHELL -l $ pyenv --version pyenv 1.2.12-4-g525dac36
Pythonのインストール
現在の最新版3.7.3を入れる。
$ pyenv install 3.7.3 $ pyenv global 3.7.3 $ python --version Python 3.7.3
Pipenvのインストール
pipenvの作業ディレクトリはプロジェクト配下のほうが好きなのでPIPENV_VENV_IN_PROJECTの設定をしておく。
$ pip install pipenv ... You are using pip version 19.0.3, however version 19.1.1 is available. You should consider upgrading via the 'pip install --upgrade pip' command. $ pip install --upgrade pip $ echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc $ pipenv --version pipenv, version 2018.11.26
pipが古いと言われたので、ついでに更新した。
(参考)aptでPythonを入れる場合
もし、aptで直接入れたい場合は、以下の手順で入れられる。
$ sudo apt install -y python3 python3-pip python3-venv $ pip3 install pipenv $ echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc