はじめに
こんにちは。アプリケーションサービス部の松尾です。
アドベントカレンダー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
- Python 3.11.6
その他
- 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 に関しては以下のブログでも紹介しています。
$ 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-version
や nodenv
の .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製ツールです。
今回は、過去記事に倣って 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 と少し変わっていて、手探りだと少し手間取ったので、この記事が誰かのお役に立てば幸いです。
開発環境を新しくすると、過去のプロジェクトや不要になった一時ファイルなども棚卸しできて少しすっきりしますね。
年末の大掃除と合わせて、開発環境も新調してみてはいかがでしょうか。