Amazon Linux 2023 にPython3・Serverless Framework 環境を構築する

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

はじめに

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

アドベントカレンダー2日目ということで、今年やったことをブログにしてみようと思います。

私は今年、Amazon Linux 2023 の開発環境を構築しました。

当部では開発環境に Amazon EC2 を使うことが多く、過去には Amazon EC2にPython 3・serverless framework環境を構築する というブログ記事を掲載しています。

私も Amazon Linux 2 の EC2インスタンスを開発環境に使っているのですが、今年の9月に Node.js 16 が EOL を迎えてしまいました。

Amazon Linux 2 は Node.js 18 以降に非対応だったので、Amazon Linux 2023 に開発環境を構築した時の手順を記載します。

なお、表示されるバージョンおよび手順は執筆時点(2023/11)のものとなります。

構築した環境

Amazon EC2

  • Amazon Linux 2023 AMI 2023.2.20231113.0 x86_64 HVM kernel-6.1
    • t3.medium(2vCPU, メモリ4GiB)
    • PublicIP:有効(Elastic IPで固定化すると楽です)
    • IAM Role:なし(私は全部 profile で管理したい派です)
    • ストレージ: 40GB(とりあえず動かすだけならデフォルトの8GBでOKです)

言語環境

  • asdf(開発言語のバージョン管理ツール)
    • Python 3.11.6
      • pipenv(Python のバージョン毎にインストールします)
    • Node.js 20.10.0
      • Serverless Framework(プロジェクト毎にインストールします)
    • Terraform
      • Terraform 1.6.5

その他

  • Zsh
  • Git

EC2 インスタンスの作成

EC2 構築の手順については当記事では割愛しますが、上記のようなスペックでインスタンスを作成しました。

注意点としては、以下になります。

  • ローカルPCから SSH 接続ができること
  • セキュリティグループで接続元が管理されていること(会社のVPN経由のみ、自宅のグローバル IP からのみ、など)

インスタンスの設定

以降の操作は、EC2インスタンスに SSH 接続してから実施してください。

ちなみに、VSCode から Remote-SSH を利用してEC2に接続する方法については、以下の弊社ブログでもご紹介しています。

VSCode の Remote - SSH 機能を使って EC2 上で開発する

タイムゾーンの設定

作業前に、デフォルトのタイムゾーンを確認してみます。

$ sudo timedatectl
Local time: xxx 2023-xx-xx xx:xx:xx UTC
           Universal time: xxx 2023-xx-xx xx:xx:xx UTC
                 RTC time: xxx 2023-xx-xx xx:xx:xx
                Time zone: n/a (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

デフォルトではUTCになっていますね。 以下のコマンドで、タイムゾーンを東京に設定します。

$ sudo timedatectl set-timezone Asia/Tokyo

再度、設定内容を確認します。

$ sudo timedatectl
               Local time: xxx 2023-xx-xx xx:xx:xx JST
           Universal time: xxx 2023-xx-xx xx:xx:xx UTC
                 RTC time: xxx 2023-xx-xx xx:xx:xx
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

JSTに変更されているのが確認できました。

Zsh をインストールする

デフォルトシェルをZshに変更します。

$ sudo dnf install zsh util-linux-user
...
Is this ok [y/N]: y
...
Complete!
$ vim ~/.zshrc

~/.zshrcの中身はお好みでOKですが、参考として以下に設定例を記載します。

setopt nonomatch
zstyle ":completion:*:commands" rehash 1

### history settings
export HISTFILE=${HOME}/.zsh_history
export HISTSIZE=1000
export SAVEHIST=100000
setopt hist_ignore_dups
setopt hist_ignore_space
setopt list_packed
setopt EXTENDED_HISTORY
function history-all { history -E 1 }
### history settings

### for VSCode
[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path zsh)"

~/.zshrcの作成が終わったら、デフォルトシェルを変更します。

$ sudo chsh ec2-user
New shell [/bin/bash]: /bin/zsh
Shell changed.

VSCode でSSHしていて、もし シェル の変更がうまくいかない場合は接続先(EC2上)の ~/.vscode-server フォルダを削除してから再接続してみてください。

$ rm -rf ~/.vscode-server

Git をインストールする

開発環境に必須な Git をインストールします。 このあとの asdf のインストールにも使用します。

$ sudo dnf install -y git
...
Complete!

$ git --version
git version 2.40.1

asdf をインストールする

プログラム言語のバージョン管理を行うためのツールです。

anyenv でもいいのですが、今回は個人的な好みで asdf で環境構築していきます。

なお、 asdf に関しては以下のブログでも紹介しています。

開発言語のバージョン管理にasdfはいかがですか

$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.13.1
...
Turn off this advice by setting config variable advice.detachedHead to false
$ vim ~/.zshrc

以下の内容を ~/.zshrcに追記します

### for asdf
# asdfを有効化する
. $HOME/.asdf/asdf.sh
# append completions to fpath
fpath=(${ASDF_DIR}/completions $fpath)  
# initialise completions with ZSH's compinit
autoload -Uz compinit && compinit

以下のコマンドで正しくバージョンが表示されれば、インストール完了です。

$ asdf --version
v0.13.1-0586b37

pyenv.python-versionnodenv.node-version も使用できるよう、設定を追加しておきます。

$ echo 'legacy_version_file = yes' >> ~/.asdfrc

Python, Node.jsをインストールするための準備

デフォルトでは Python のインストールに必要なライブラリが不足しているので、dnfでインストールします。

$ sudo dnf install gcc make patch zlib-devel bzip2 bzip2-devel readline-devel sqlite-devel openssl-devel tk-devel libffi-devel xz-devel
...
Is this ok [y/N]: y
...
Complete!

asdf で Python とNode.js を利用できるよう、プラグインを追加しておきます。

$ asdf plugin add python
$ asdf plugin add nodejs

Python をインストールする

今回は 3.11系の最新版を確認して、インストールします。

$ asdf list all python 3.11
3.11.0
3.11-dev
3.11.1
3.11.2
3.11.3
3.11.4
3.11.5
3.11.6
$ asdf install python 3.11.6

インストールが完了したら、システム全体で使用する Python のバージョンを指定しておきます。

$ asdf global python 3.11.6
$ python --version
3.11.6

pipenv をインストールする

Python で仮想環境・パッケージの管理をするために、pipenv もインストールします。

また、pipenv で仮想環境を作成した際に、プロジェクトフォルダ配下に .venv を作成するように設定します。

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

なお、本日時点の最新版の pipenv をインストールすると、 npx serverless deploy 実行時に Pipfile からのパッケージインストールが失敗してしまいました。

そこで、今回はやや古いバージョン(2023.7.4)を明示的に指定しています。

まずは、pipをアップデートします

$ pip install -U pip
...
Successfully installed pip-23.3.1
Reshimming asdf python..

続いて、pipenv をインストールします

$ pip install pipenv==2023.7.4

バージョンを表示して、インストールを確認します。

$ pipenv --version
Successfully installed pipenv-2023.7.4
Reshimming asdf python...

プロジェクトフォルダ配下に .venv を作成させる設定を、 .zshrc に追加しておきます

$ echo 'export PIPENV_VENV_IN_PROJECT=true' >> ~/.zshrc
$ exec $SHELL -l

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

同様に、asdf を利用して、Node.js の LTS版をインストールします。

余談ですが、Node.js はメジャーバージョンが偶数のものが LTS 版となっています。

今回は 20系の最新版を確認して、インストールします。

asdf list all nodejs 20
20.0.0
20.1.0
20.2.0
20.3.0
20.3.1
20.4.0
20.5.0
20.5.1
20.6.0
20.6.1
20.7.0
20.8.0
20.8.1
20.9.0
20.10.0
$ asdf install nodejs 20.10.0
...
Installed node-v20.10.0-linux-x64 to /home/ec2-user/.asdf/installs/nodejs/20.10.0

インストールが完了したら、システム全体で使用する Node.js のバージョンを指定しておきます。

$ asdf global nodejs 20.10.0
$ node --version
v20.10.0

Serverless Framework をインストールする

Serverless Application の構成管理・デプロイを簡単に実行できる、Node.js製ツールです。

https://www.serverless.com/

今回は、過去記事に倣って 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: 3.38.0 (local)
Plugin: 7.2.0
SDK: 4.5.1

Terraform をインストールする

本題とちょっと逸れますが、個人的によく使うので Terraform もインストールしておきます。 手順は Python や Node.js のときと同じです。 新しい言語を追加するとき、手順を毎回調べなくて良いのは嬉しいですね。

$ asdf plugin add terraform

ひとまず最新版をインストールしておきます。

$ asdf list all terraform
...
1.6.0
1.6.1
1.6.2
1.6.3
1.6.4
1.6.5
1.7.0-alpha20231025
1.7.0-alpha20231108
1.7.0-alpha20231130
$ asdf install terraform 1.6.5
...
gpg: failed to start gpg-agent '/usr/bin/gpg-agent': Configuration error
gpg: can't connect to the gpg-agent: Configuration error

Need the secret key to do this.

Key not changed so no update needed.
gpg: Total number processed: 1
gpg:               imported: 1

新しい言語を追加するとき、手順を毎回調べなくて良いのは嬉しいですね。

ダメでした。パッケージが不足していたので、追加します。

既存パッケージと競合するようなので --allowerasing オプションを使用します。

$ sudo dnf -y install gnupg2 --allowerasing
...
terraform_1.6.5_linux_amd64.zip: OK
Cleaning terraform previous binaries
Creating terraform bin directory
Extracting terraform archive

これでうまくいきました。 他の言語と同様、 global オプションで有効化しておきます。

$ asdf global terraform 1.6.5
$ terraform --version
Terraform v1.6.5
on linux_amd64

以上です。

最後に

自分用の設定等は省いていますが、概ね上記の手順で Amazon Linux2 の時とほぼ同等の開発環境が構築できました。

細かい手順やライブラリが Amazon Linux 2 と少し変わっていて、手探りだと少し手間取ったので、この記事が誰かのお役に立てば幸いです。

開発環境を新しくすると、過去のプロジェクトや不要になった一時ファイルなども棚卸しできて少しすっきりしますね。

年末の大掃除と合わせて、開発環境も新調してみてはいかがでしょうか。