Amazon EC2にPython 3・serverless framework環境を構築する

記事タイトルとURLをコピーする

はじめに

こんにちは。アプリケーションサービス部の水垣です。

自分たちの課では、よく Python でプログラミングしたコードを serverless framework を利用して AWS Lambda にデプロイすることがあります。
開発・デプロイ環境の選択肢はいくつかあるのですが、今回は比較的手軽に用意できる Amazon EC2 に環境を構築したいと思います。

これから OJT で回ってくる新人の方たちの環境構築に役立てばうれしいです。
なお、表示されるバージョンおよび手順は執筆時点(2021/8)時点のものとなります。

メリット・デメリット

開発環境を EC2 上に構築することのメリット・デメリットを挙げておきます。

メリット

  • Lambda の OS である Amazon Linux2 と OS を合わせることができる
  • ローカルPC が Mac・Windows でも、環境を統一できる
  • Visual Studio Code(VSCode) の Remote-SSH を利用することで、VSCode をインターフェイスに Linux 上でプログラミングできる
    • ローカルPCでコーディングして、別ツールでサーバーにアップロードの手間が省けます

デメリット

  • 起動中は若干お金がかかる
    • 利用しない時間は停止するなどの対応がベターです

構築する環境例

Amazon EC2

スペックは開発内容に合わせて変更してください。

  • Amazon Linux 2 AMI (HVM), SSD Volume Type
    • t3.small(2vCPU, メモリ2GiB)
    • PublicIP:有効(Elastic IPで固定化すると楽です)
    • IAM Role:AdministratorAccess権限
    • ストレージ:8GB

言語環境

  • anyenv
    • pyenv:Pythonのバージョン管理ツール
      • Python 3.8.11
      • pipenv
    • nodenv:Node.jsのバージョン管理ツール
      • Node.js 14.17.4 LTS
      • serverless framework(プロジェクトのフォルダ配下にインストールします)

その他

  • Git

EC2

EC2 インスタンスの起動についての記事はたくさんありますので、ここでは割愛させていただきます。
注意点としては、以下になります。

  • ローカルPCから SSH 接続ができること
  • セキュリティグループで接続元が管理されていること
    • 例えば会社のVPNや自宅のグローバル IP からのみなど
  • IAM Roleの権限が AdministratorAccess ポリシー相当
    • 開発向けに権限は広げていますので、必要に応じて絞ってください

インスタンスが起動できましたら、SSH 接続し以降の操作を行ってください。

Git

まずは、開発環境には必須な Git をインストールします。以降の anyenv 等のインストールでも利用しますので、忘れずにインストールしてください。

$ sudo yum install -y git
...
完了しました!

$ git --version
git version 2.32.0

anyenv

プログラム言語のバージョン管理を可能にする 〜env 系を一括で管理してくれるツールです。
今回は、pyenv(Python)・nodenv(Node.js)を利用するので、anyenv で一括管理させます。
インストールは、公式サイトを参考にインストールします。

https://github.com/anyenv/anyenv

サイト内の以下の箇所を参考ください。

参考

$ pwd
/home/ec2-user

$ git clone https://github.com/anyenv/anyenv ~/.anyenv
...

$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bashrc

$ ~/.anyenv/bin/anyenv init
# the following to ~/.bash_profile:

eval "$(anyenv init -)"

$ echo 'eval "$(anyenv init -)"' >> ~/.bashrc

$ . .bashrc
ANYENV_DEFINITION_ROOT(/home/ec2-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/ec2-user/.config/anyenv/anyenv-install
Do you want to checkout https://github.com/anyenv/anyenv-install.git? [y/N]: y
...
Completed!

$ anyenv --version
anyenv 1.1.4

# 管理する〜envを一括でアップデートするプラグインもインストールしておきます
$ mkdir -p $(anyenv root)/plugins
$ git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
...
$ anyenv update

pyenv

Python の言語バージョンを管理するツールです。anyenv を利用してインストールします。
複数のバージョンをインストールでき、言語のバージョンをシステム全体で切り替え(global)や、特定フォルダ配下のみに適用(local)ができます。

https://github.com/pyenv/pyenv

参考

$ anyenv install pyenv
...
Install pyenv succeeded!
Please reload your profile (exec $SHELL -l) or open a new session.

$ exec $SHELL -l
$ pyenv --version
pyenv 2.0.4-8-gd209e061

nodenv

pyenv 同様に、Node.js の言語バージョンを管理するツールです。

https://github.com/nodenv/nodenv

参考

$ anyenv install nodenv
...
Install nodenv succeeded!
Please reload your profile (exec $SHELL -l) or open a new session.

$ exec $SHELL -l
nodenv --version
nodenv 1.4.0+3.631d0b6

Pythonをインストールするための準備

pyenv で Python3 をインストールしますが、インストール時に必要になるライブラリ群を EC2 にインストールします。

$ sudo yum-builddep python3 -y
...
完了しました!

Pythonをインストールする

pyenv を利用して、Python3.8.11 をインストールします。
さらに、システム全体で 3.8.11 が利用できるようにバージョンを設定します。

参考

# インストール可能なバージョンを確認する
$ pyenv install --list
...
3.8.11
...
stackless-3.7.5

# インストール(5〜10分ほどかかります)
$ pyenv install 3.8.11
...
Installed Python-3.8.11 to /home/ec2-user/.anyenv/envs/pyenv/versions/3.8.11

$ pyenv versions
* system (set by /home/ec2-user/.anyenv/envs/pyenv/version)
  3.8.11

# システム全体で 3.8.11 を利用するように切り替える
$ pyenv global 3.8.11

$ pyenv versions
  system
* 3.8.11 (set by /home/ec2-user/.anyenv/envs/pyenv/version)

$ python --version
Python 3.8.11

pipenv をインストールする

Python で仮想環境・パッケージの管理をするために、pipenv を利用したいのでインストールします。
また、pipenv で仮想環境を作成した際に、プロジェクトフォルダ配下に .venv を作成するように設定します。

https://pipenv.pypa.io/en/latest/

参考

# pipをアップデートします
$ pip install -U pip
...
Successfully installed pip-21.2.3

# pipenv をインストールします
$ pipenv --version
pipenv, version 2021.5.29

# プロジェクトフォルダ配下に .venv を作成させる
$ echo 'export PIPENV_VENV_IN_PROJECT=true' >> ~/.bashrc
$ . ~/.bashrc

Node.js をインストールする

nodenv を利用して、Node.js 14.17.4(LTS) をインストールします。
さらに、システム全体で 14.17.4 が利用できるようにバージョンを設定します。

参考

# インストール可能なバージョンを確認する
$ nodenv install --list
...
14.17.4
...
v8-canary

# インストール
$ nodenv install 14.17.4
...
Installed node-v14.17.4-linux-x64 to /home/ec2-user/.anyenv/envs/nodenv/versions/14.17.4

$ nodenv versions
nodenv versions
  14.17.4

# システム全体で 14.17.4 を利用するように切り替える
$ nodenv global 14.17.4

$ nodenv versions
* 14.17.4 (set by /home/ec2-user/.anyenv/envs/nodenv/version)

$ node --version
v14.17.4

serverless framework をインストールする

Serverless Applicationを構築するさいに便利な、構成管理・デプロイのためのNode.js製ツールです。

https://www.serverless.com/

他には、AWS 製のAWS サーバーレスアプリケーションモデル(SAM)等があります。 https://aws.amazon.com/jp/serverless/sam/

今回は、serverless framework をシステム全体にではなくプロジェクトフォルダの配下にインストールを行います。
そのためプロジェクトを作成するつど、 serverless framework のインストールは必要になります。

参考

# プロジェクトフォルダ(sample-lambda)を作成して移動する
$ mkdir sample-lambda; cd $_

# package.jsonを作成する
$ npm init
...すべてEnterで、最後にyes(正式にプロジェクトを作成する際は適切な値を入力)

# serverless frameworkをインストールする
$ npm install serverless
...
found 0 vulnerabilities

$ npx serverless --version
Framework Core: 2.53.1 (local)
Plugin: 5.4.3
SDK: 4.2.6
Components: 3.14.2

VSCode からの Remote-SSH

VSCode から Remote-SSH を利用して、EC2に接続する方法については、以下の弊社ブログに記事がありますので参考にしてみてください。
VSCode の Remote - SSH 機能を使って EC2 上で開発する

最後に

おつかれさまでした。これで、開発環境の構築ができました。
少々手間がかかるのと、ツールが複数でてきて最初は混乱するかと思います。まずはザックリでよいので、各ツールのサイトに目を通して役割と使い方を把握できればOKです。

また、一旦この状態で AMI を採取しておくことで、開発環境の用意が簡単になります。
この AMI から EC2 インスタンスを起動すれば、この手順を繰り返さなくても開発を始めるための環境が出来上がります。

その他に開発環境の構築という点では、以下が考えられます。
また機会があれば、環境構築シリーズとして書いていけたらと思います。

  • Docker(VSCode の Remote-Containers利用)
  • AWS Cloud9
  • AWS CloudShell

ちなみに個人的には比較的手軽に Docker が使える VSCode の Remote-Containers がおすすめです!
Atsushi Morimoto(@74th) さんの VS Code Dev Container Guidebookとかは、手元に置いておきたい一冊でおすすめです。