AWS lambdaで最強のWebAPI開発環境をつくる!

aws

こんにちは時雨風です。
最近は、アニメにハマってました。リコリス・リコイルっていうんですけどご存じですか?
あまりの面白さにtwitterでは最終回の後にアニメ難民が大量発生したようです。なかには幻の15話を見たという報告が多数あがるなど集団幻覚の可能性もあるとか…。まあ、冗談だと思います。たぶん。
今期は、水星の魔女もおもしろそうで毎週ワクワクです。

この記事では、最近の発見したAWS Lambdaによるサーバーレス開発とDev Containersが相性めっちゃよくね?ていうのを紹介する記事です。
サンプルをつくりましたので、ぜひそれだけでも確認してみてください。

いいところ

  • 多数のツールやライブラリを簡単にセットアップ
  • 環境をDockerで隔離し、PCの環境を汚さない
  • チームと簡単に共有できる
  • 設定してしまえばボタン一つで環境が自動構築

わるいところ

  • パソコンによってはDockerの処理が重い
  • プロジェクト最初の設定段階で少し面倒
    (でもこれについてはやらない時の面倒のほうが多いと思っている)

こちらがサンプルになります。

GitHub - tokiukaze/i-am-the-strongest: AWSサーバーレス開発を簡単に行う開発環境の例
AWSサーバーレス開発を簡単に行う開発環境の例. Contribute to tokiukaze/i-am-the-strongest development by creating an account on GitHub.

サンプルプロジェクトで使っているもの

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ツールでは、SourcetreeGitHub Desktopが有名です。クローンが終了したら、フォルダーをvscodeのエクスプローラーで開いてください。

vscodeのエクスプローラーにフォルダーが表示されることを確認してください。
この時、i-am-the-strongestを開いていることが必要になります。

i-am-the-strongestを開く

vscodeでフォルダーが表示されるようになったら、cmd(ctrl) + shift + pでコマンドパレットを開き、Remote-Containers: Reopen in Containerを検索し選択します。

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"
}

これによって下記の部分が実行されることを確認できました。

i-am-the-strongest/strongest_function/index.py at main · tokiukaze/i-am-the-strongest
AWSサーバーレス開発を簡単に行う開発環境の例. Contribute to tokiukaze/i-am-the-strongest development by creating an account on GitHub.

解説

続いて、サンプルプロジェクトを構成しているものを詳しく解説します。
サンプルプロジェクトの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で開きます。

Add Development Container Configuration Files...を選択

cmd(ctrl) + shif + pでコマンドパレットを開き、検索を行いRemote-Containers: Add Development Container Configuration Files...を選択します。

Python 3を選択

Python 3を選択します。

3.9-bullseyeを選択

3.9-bullseyeを選択します。

lts/*を選択

lts/*を選択します。

AWS CLIとDocker in Dockerを選択

AWS CLIとDocker(Moby) support (Docker in Docker)を選択します。

latestを選択

latestを選択します。

.devcontainerがエクスプローラーに追加されます。
フォルダの中には2つのファイルが保存されています。それぞれ編集します。

ファイルの編集

詳しい変更は下記を参考にしてください。ファイルはcmd(ctrl) + sで保存できます
github commit

devcontainer.json

Poetryのインストールと操作ユーザーをルートユーザーへの変更を行います。

+   "postCreateCommand": "poetry config virtualenvs.create false && poetry install",
-   "remoteUser": "vscode",
+   "remoteUser": "root",

2022/11/27追記
このコンテナに対してアップデートがあり、仕様が変わりました。
rootユーザーを使用するためには"remoteUser"のコメントアウトではなく、"root"を指定する必要が出ました。

https://github.com/tokiukaze/i-am-the-strongest/commit/154b9adf8ebce343aaf7f7153240797310d5d735

同じく、bash-completionも.bashrcに記述する必要が出てきました。

bash-completionを有効化 · tokiukaze/i-am-the-strongest@4040d13
AWSサーバーレス開発を簡単に行う開発環境の例. Contribute to tokiukaze/i-am-the-strongest development by creating an account on GitHub.

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を検索し選択します。

Remote-Containers: Reopne 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 を検索し選択します。

Reopne 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

まとめ

いかがでしたでしょうか?
面倒ですが、最初にここまでやっておけば開発途中で困ることはないと思います。

ここまで読んでいただきありがとうございました。

コメント

タイトルとURLをコピーしました