こんにちは時雨風です。
最近は、アニメにハマってました。リコリス・リコイルっていうんですけどご存じですか?
あまりの面白さにtwitterでは最終回の後にアニメ難民が大量発生したようです。なかには幻の15話を見たという報告が多数あがるなど集団幻覚の可能性もあるとか…。まあ、冗談だと思います。たぶん。
今期は、水星の魔女もおもしろそうで毎週ワクワクです。
この記事では、最近の発見したAWS Lambdaによるサーバーレス開発とDev Containersが相性めっちゃよくね?ていうのを紹介する記事です。
サンプルをつくりましたので、ぜひそれだけでも確認してみてください。
いいところ
- 多数のツールやライブラリを簡単にセットアップ
- 環境をDockerで隔離し、PCの環境を汚さない
- チームと簡単に共有できる
- 設定してしまえばボタン一つで環境が自動構築
わるいところ
- パソコンによってはDockerの処理が重い
- プロジェクト最初の設定段階で少し面倒
(でもこれについてはやらない時の面倒のほうが多いと思っている)
こちらがサンプルになります。
サンプルプロジェクトで使っているもの
AWS
サンプルプロジェクトで使用するサービスを列挙します。
開発ツールなど
開発に使用するツールやライブラリを列挙します。
IDE
開発仮想環境
開発言語及び周辺ツール、ライブラリ
AWS公式ツール
AWSのリソース管理ツール。
操作用のコマンドラインツール。
サンプルプロジェクトの確認
用意したサンプルプロジェクトをローカルにて実行します。
実際に使っていただいた方がわかることがたくさんあると思います。
必要ツールのインストール
docker、vscode、Dev Containersのインストールが必要です。
Windowsの場合
Windows Terminalを使用します。
winget install -q vscode
code --install-extension MS-CEINTL.vscode-language-pack-ja
code --install-extension ms-vscode-remote.remote-containers
Docker Desktopを手動でインストールし、再起動を行なってください。
Macの場合
ターミナルを使用します。Terminal.appはランチャーのその他にまとめられています。
Homebrewを使用します。インストールされていない場合は、トップページのスクリプトからインストールを行なってください。
brew install --cask visual-studio-code
brew install --cask docker
ランチャーにvscodeとDockerアプリが追加されるので起動します。
vscodeにてcmd(ctrl) + shift + p
でコマンドパレットを開き、>shell Command: Install 'code' command in PATH
を検索して選択します。
もう一度ターミナルを開き、下記を入力します。
codeというコマンドが認識されない場合はターミナルの再起動を行なってください。
code --install-extension MS-CEINTL.vscode-language-pack-ja
code --install-extension ms-vscode-remote.remote-containers
プロジェクトのクローンとvscodeでの立ち上げ
Dockerが正常に動作していることを確認してください。
ターミナルで下記を実行します。
githubからファイルなどをダウンロードするコマンドですので、実行するパスに気をつけてください。
git clone https://github.com/tokiukaze/i-am-the-strongest.git
code i-am-the-strongest
ターミナルから操作せず、GUIツールを使用してcloneしても構いません。GUIツールでは、SourcetreeやGitHub Desktopが有名です。クローンが終了したら、フォルダーをvscodeのエクスプローラーで開いてください。
vscodeのエクスプローラーにフォルダーが表示されることを確認してください。
この時、i-am-the-strongestを開いていることが必要になります。
vscodeでフォルダーが表示されるようになったら、cmd(ctrl) + shift + p
でコマンドパレットを開き、Remote-Containers: Reopen in Container
を検索し選択します。
環境の作成が始まります。この処理には時間がかかります。
サービスの開始とローカルテスト
Done. Press any key to close the terminal.
が表示されたら完了です。
ターミナルを「+」から追加します。
awsアカウント設定
awsアカウントの設定を行います。
ターミナルにてaws configure
を入力してください。
$ aws configure
AWS Access Key ID [None]: <アクセスキーを入力>
AWS Secret Access Key [None]: <シークレットアクセスキーを入力>
Default region name [None]: us-east-1
Default output format [None]: json
設定の基本 - AWS Command Line Interface
sam を使用したローカルでのテスト
ローカル環境にてAPIをテストします。
1. サービスの起動
cdk synth
sam local start-api -t ./cdk.out/IAmTheStrongestStack.template.json
2. ローカルテスト
WEB APIにアクセスしてみます。
ターミナルを分割し、下記のコマンドを実行します。
curl http://127.0.0.1:3000/status | jq
しばらくすると環境が作成され、下記の返答が表示されます。
{
"status": "ok"
}
これによって下記の部分が実行されることを確認できました。
解説
続いて、サンプルプロジェクトを構成しているものを詳しく解説します。
サンプルプロジェクトのREADMEも読んでみてください。
なお、ここは読み飛ばしていただいても構いせません。
Lambda
プロブラムを実行するAWSサービスです。ランタイム(実行環境)や実行条件などを設定し、プログラムを実行できます。
API Gateway
Web APIのネットワークからの接続を管理するAWSサービスです。Lambdaと組み合わせることでREST APIを作成できます。
CloudWatch LogGroup
Lambdaの実行ログが保存されるAWSサービスです。なにも設定していない場合でも自動で生成され、手動で削除されない限りログが残ります。
CloudFormation
AWSサービスをスタックという単位で管理することができるAWSサービスです。
CDK
AWSリソース管理を行うライブラリです。AWSサービスを利用する際にWebコンソールからの手動設定ではなく、スクリプトを記述することで自動化することができます。
内部でSAMを使用しています。専用のコマンドラインツールがあります。
SAM
AWSリソース管理を行うツールです。CDKとは違い設定ファイルからAWSリソースを作成します。
CloudFormationのスタックにリソースをアップロードします。
専用のコマンドラインツールがあります。
Visual Studio Code
IDE(統合開発環境)とよばれる多機能エディターです。
拡張機能 Dev Containers
vscodeをDocker環境と接続する拡張機能です。
Docker
Dockerコンテナと呼ばれる仮想環境を作成できるアプリケーションです。
これを使用して開発環境を仮想環境の中に作成します。例えば、Windows・MacそれぞれのOSで開発を行うときにOSの違いから開発に与える悪影響を最小限にできます。
Python 3.9
よく使用されるプログラム言語です。内部ではC言語を使用しています。
2022/10/24現在、Lambdaで使用できる最新バージョンはPython3.9です。
Poetry
パッケージ管理ツールです。公式パッケージマネージャのpipを拡張したものです。
公開されているプログラムをプロジェクトに簡単に導入できるようになります。
Black
コードフォーマッターです。ソースコードを整形し、読みやすくします。
Blackは設定項目がないことが特徴です。
Pylance
言語サーバーです。ソースコードの作成補助を行うツールです。
mypy
型解析ソフトです。Pythonでは型を指定せずに変数を定義できますが、このツールでは型の指定を強制します。プロジェクトが大きくなる場合は型指定をすると利点が多いですが、難しい点もあります。
pytest
ユニットテストツールです。作成したプログラムが想定通りに動くかを確認するプログラムを作成します。プログラムに対して何度も確認作業が必要な場合は、ユニットテストを作成すると生産効率が上がります。
aws-lambda-powertools
Lambda用のプログラム作成を支援する便利機能をまとめたライブラリです。
ツールについて
便利なツールは積極的に導入しています。
プロジェクトによっては過剰な場合もあると思いますので、理解した上ではずすというのも選択肢として十分にありだと思います。
気になったツールは調べてみると楽しいですよ。
新規開発環境(新プロジェクト)の作成
ここからは実際にプロジェクトを作成していきます。
サンプルを真似るのではなく、作成手順を理解しておくのはとても重要です。
仮想環境の作成
まずは、プロジェクトで使用するフォルダを用意します。名前はI-am-the-strongest
です。
これはドキュメントや書類と表示されるフォルダがよいです。
デスクトップなどはアクセス制限がかかることがあるため、おすすめしません。
フォルダをvscodeで開きます。
cmd(ctrl) + shif + p
でコマンドパレットを開き、検索を行いRemote-Containers: Add Development Container Configuration Files...
を選択します。
Python 3を選択します。
3.9-bullseyeを選択します。
lts/*を選択します。
AWS CLIとDocker(Moby) support (Docker in Docker)を選択します。
latestを選択します。
.devcontainer
がエクスプローラーに追加されます。
フォルダの中には2つのファイルが保存されています。それぞれ編集します。
ファイルの編集
詳しい変更は下記を参考にしてください。ファイルはcmd(ctrl) + s
で保存できます
github commit
devcontainer.json
Poetryのインストールと操作ユーザーをルートユーザーへの変更を行います。
+ "postCreateCommand": "poetry config virtualenvs.create false && poetry install",
- "remoteUser": "vscode",
+ "remoteUser": "root",
Dockerfile
bash-completionというコマンドライン操作補助ツール、cdk、poetryのインストールを記述します。
# タブ補完を有効化
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
&& apt-get -y install --no-install-recommends bash-completion
RUN printf "\n# bash_completion\n. /usr/share/bash-completion/bash_completion\n" >> ~/.bashrc
# cdkのインストール
RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g aws-cdk" 2>&1
# poetryのインストール
RUN curl -sSL https://install.python-poetry.org | python3 -
cmd(ctrl) + shif + p
でコマンドパレットを開き、Remote-Containers: Reopen in Container
を検索し選択します。
Done. Press any key to close the terminal.
が表示されたら完了です。
下記コマンドを1行ずつ打ち込んでバージョンが表示されることを確認してください。
ターミナルのタブを追加することができます。
aws --version
cdk --version
poetry --version
python --version
仮想環境から抜けたい時は
仮想環境から抜けるにはcmd(ctrl) + shif + p
でコマンドパレットを開き、Remote-Containers: Reopen Folder Locally
を検索し選択します。
もう一度仮想環境に入るには下記のコマンドを実行してください。Remote-Containers: Reopen in Container
プロジェクトの作成
awsアカウント設定
awsアカウントの設定を行います。
ターミナルにてaws configure
を入力してください。
$ aws configure
AWS Access Key ID [None]: <アクセスキーを入力>
AWS Secret Access Key [None]: <シークレットアクセスキーを入力>
Default region name [None]: us-east-1
Default output format [None]: json
設定の基本 - AWS Command Line Interface
CDKテンプレートプロジェクトの作成
cdkコマンドラインツールを使用して、スクリプトを生成します。
cdk init app --language=python
生成されたファイルのうち、下記のファイルを削除してください。
.venv
requirements-dev.txt
requirements.txt
source.bat
poetryのセットアップ
poetry init
を入力します。
下記を参考にセットアップを完了させてください。ほとんどの設定はEnterを押すのみで大丈夫なはずです。
$ poetry init
This command will guide you through creating your pyproject.toml config.
Package name [i_am_the_strongest]:
Version [0.1.0]:
Description []:
Author [Your Name <you@example.com>, n to skip]: n
License []:
Compatible Python versions [^3.9]:
Would you like to define your main dependencies interactively? (yes/no) [yes]
You can specify a package in the following forms:
- A single name (requests): this will search for matches on PyPI
- A name and a constraint (requests@^2.23.0)
- A git url (git+https://github.com/python-poetry/poetry.git)
- A git url with a revision (git+https://github.com/python-poetry/poetry.git#develop)
- A file path (../my-package/my-package.whl)
- A directory (../my-package/)
- A url (https://example.com/packages/my-package-0.1.0.tar.gz)
Package to add or search for (leave blank to skip):
Would you like to define your development dependencies interactively? (yes/no) [yes]
Package to add or search for (leave blank to skip):
Generated file
続いて必要パッケージを追加します。
実行してからしばらくすると必要なパッケージが追加されます。
poetry add -D aws-cdk-lib aws-lambda-powertools boto3 isort aws-sam-cli pytest
vscode 環境設定
設定ファイルに記述を追加します。
cmd(ctrl) + shif + p
でコマンドパレットを開き、基本設定: ワークスペース設定を開く (JSON)
を選択します。.vscode/setting.json
ファイル追加されますので、設定を追加します。
{
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.organizeImports": true
},
"python.formatting.provider": "black",
"python.linting.mypyEnabled": true,
"python.linting.pylintEnabled": false,
"python.testing.pytestEnabled": true,
"python.testing.unittestEnabled": false,
}
pyproject.toml
の最終行に記述を追加します。
[tool.isort]
profile = "black"
[tool.mypy]
check_untyped_defs = true
disallow_any_generics = true
disallow_incomplete_defs = true
disallow_subclassing_any = false
disallow_untyped_calls = true
disallow_untyped_defs = true
no_implicit_optional = true
no_implicit_reexport = true
strict_equality = true
warn_redundant_casts = true
warn_return_any = true
warn_unreachable = true
warn_unused_configs = true
warn_unused_ignores = true
サーバーレスアプリケーションのスクリプトを追記
Lambdaを動作させるためスクリプトを追加します。
他のプロジェクトを作成する場合は、ガリガリと開発を行います。
CDK デプロイ
デプロイの準備
cdk synth
cdk bootstrap
cdk synth
でプロジェクトのビルドを行います。ファイルを変更した際は、synthを行うとcdk.out
に出力処理が行われます。cdk bootstrap
はaws側の準備を行うコマンドです。リージョンごとに初めてcdkを使用する際には行う必要があります。
CDK デプロイ
cdk deploy
途中でy
を入力する必要があります。
CDK デストロイ
cdk destroy
にてスタックを削除することができます。
プロジェクトのテスト
unitテストを行う場合
左メニューからテストを選択します。
再生ボタンを押すことでテストを実行することができます。デバックも可能です。
テストファイルは下記になります。
tests/unit/test_i_am_the_strongest_stack.py
ローカルでaws環境を再現してテストする場合
cdk synth
sam local start-api -t ./cdk.out/IAmTheStrongestStack.template.json
まとめ
いかがでしたでしょうか?
面倒ですが、最初にここまでやっておけば開発途中で困ることはないと思います。
ここまで読んでいただきありがとうございました。
コメント