IntelliJ IDEA+Node.js+npm+serverless framework+Python の組み合わせで開発環境を構築して AWS Lambda を作成してみる
概要
記事一覧はこちらです。
Serverless Framework を触ってみたいと思ったので IntelliJ IDEA で開発環境を構築して AWS Lambda を1つ作成してみます。言語は Python 3.8 にします。
作成したプロジェクトは https://github.com/ksby/ksbysample-serverless レポジトリに入れます。また D:\project-serverless\ksbysample-serverless に clone します。
IntelliJ IDEA は PyCharm ではなく Ultimate Edition(2020.1.1)に Python Plugin をインストールして使用します。
Python は Python Release Python 3.8.3 から Windows x86-64 executable installer のリンクをクリックして python-3.8.3-amd64.exe をダウンロードした後、実行して D:\Python38 にインストールします。環境変数に
D:\Python38
、D:\Python38\Scripts
を追加します。Node.js、npm は Spring Boot + npm + Geb で入力フォームを作ってテストする ( その85 )( Node.js を 10.15.3 → 12.16.3 へ、npm を 6.9.0 → 6.14.5 へバージョンアップする ) でバージョンアップした 12.16.3、6.14.5 を使用します。
Get started with Serverless Framework Open Source & AWS を見ると Serverless Framework を
npm install -g serverless
でグローバルインストールするよう記載されていますが、ローカルインストールでも動作するようなのでローカルインストールします。Serverless Framework の sls コマンドを実行する時に tfenv+aws-vault+direnv を組み合わせて Windows 上に Terraform の実行環境を構築する でインストールした aws-vault、direnv を利用します。
参照したサイト・書籍
Serverless Framework
https://www.serverless.com/Python Release Python 3.8.3
https://www.python.org/downloads/release/python-383/PyCharmでVenvをGitで共有するときにすること
https://hiropon-progra.com/?p=82Windows 上の Python で UTF-8 をデフォルトにする
https://qiita.com/methane/items/9a19ddf615089b071e71Hello World Python Example
https://www.serverless.com/framework/docs/providers/aws/examples/hello-world/python/Serverless Frameworkの使い方まとめ
https://qiita.com/horike37/items/b295a91908fcfd4033a2
目次
- idea-serverless-python-first プロジェクトを作成する
- Python の仮想環境を作成する
- Serverless Framework をローカルインストールする
- .envrc を作成する
- python-first-lambda サブプロジェクトを作成する
- Lambda が東京リージョン(ap-northeast-1)に作成されるよう serverless.yml を編集する
- deploy する
- 作成した Lambda を実行する
- AWS に作成されたリソースを確認する
- 作成した Lambda を削除する
- 削除した後に再度 deploy するとバージョンが上がる
- 最後に
手順
idea-serverless-python-first プロジェクトを作成する
IntelliJ IDEA で Empty Project を作成します。
「New Project」ダイアログを表示してから画面左側で Empty Project を選択して「Next」ボタンをクリックします。
「Project Name」に idea-serverless-python-first
、「Project location」に D:\project-serverless\ksbysample-serverless\idea-serverless-python-first
を入力して「Finish」ボタンをクリックします。
Project が開くと「Project Structure」ダイアログが開きますが、今は何もせずに「Cancel」ボタンをクリックして閉じます。
ダイアログを閉じた直後は Project Tool Window に .idea ディレクトリが表示されていなかったので、一旦 IntelliJ IDEA を閉じて idea-serverless-python-first プロジェクトを開き直します。そうすると Project Tool Window が以下の表示になります。
D:\project-serverless\ksbysample-serverless
の直下に .gitignore を新規作成し、以下の内容を記述します。
# Intellij project files *.iml *.ipr *.iws .idea/ out/ # Ignore direnv .envrc # Ignore node.js, npm node_modules/
Python の仮想環境を作成する
IntelliJ IDEA のメインメニューから「File」-「Project Structure...」を選択して「Project Structure」ダイアログを表示します。
画面中央上部の「+」ボタンをクリックしてから「Add Python SDK...」を選択します。
「Add Python Interpreter」ダイアログが表示されます。表示直後が下記の状態だったので、そのまま「OK」ボタンをクリックします。
「Create Virtual Environment」ダイアログが表示されて仮想環境が構築されます(少し時間がかかります)。
構築が完了すると中央のリストに「Python 3.8 (idea-serverless-python-first)」が追加されます。
画面左側で「Project Settings」-「Project」を選択した後、画面右側の「Project SDK」で作成した Python の SDK と「SDK default」を選択してから「OK」ボタンをクリックします。
Project Tool Window に venv ディレクトリが表示されています。
IntelliJ IDEA の Terminal を起動すると venv 環境で動くようになります。
venv ディレクトリは git に入れないので .gitignore に設定を追加します。
.......... # Ignore Python venv venv/
Serverless Framework をローカルインストールする
コマンドラインから以下のコマンドを実行します。
cd /d d:\project-serverless\ksbysample-serverless\idea-serverless-python-first
npm init -y
npm install --save-dev serverless
npx sls -v
.envrc を作成する
プロジェクトのルート直下に .envrc を新規作成し、以下の内容を記述します。
export AWS_PROFILE=<aws-vault exec 実行時に渡すプロファイル名> # Windows 上の Python で UTF-8 をデフォルトにする # https://qiita.com/methane/items/9a19ddf615089b071e71 export PYTHONUTF8=1
python-first-lambda サブプロジェクトを作成する
Hello World Python Example を参考に python-first-lambda サブプロジェクトを作成します。以下のコマンドを実行します。--template
オプションに渡す文字列は aws-python ではなく aws-python3 にします。
npx sls create --template aws-python3 --path python-first-lambda
Project Tool Window を見ると python-first-lambda ディレクトリが作成されて、その下に .gitignore, handler.py, serverless.yml の3つのファイルが作成されます。
作成したばかりの serverless.yml は以下の内容です(コメントの部分は取り除いています)。
service: python-first-lambda provider: name: aws runtime: python3.8 functions: hello: handler: handler.hello
Lambda が東京リージョン(ap-northeast-1)に作成されるよう serverless.yml を編集する
デフォルトの serverless.yml では米国東部(バージニア北部)リージョン(us-east-1 )に作成されてしまうので、serverless.yml に設定を追加して東京リージョン(ap-northeast-1)が作成先になるようにします。
また Serverless Framework で作成する Lambda の名前には stage 名が入るのですが、serverless.yml に明記するようにします(書かなかった時も stage 名は dev なのですが明記することにします)。
serverless.yml を以下のように変更します。
service: python-first-lambda provider: name: aws runtime: python3.8 stage: dev region: ap-northeast-1 functions: hello: handler: handler.hello
- provider に以下の2行を追加します。
stage: dev
region: ap-northeast-1
deploy する
git-cmd.exe(direnv+aws-vault を利用するので cmd.exe ではなく git-cmd.exe 環境で実行する、D:\git\git-cmd.exe --command=usr/bin/bash.exe -l -i
)で python-first-lambda ディレクトリに移動してから deploy コマンドを実行します。deploy コマンドについては AWS - deploy 参照。
aws-vault exec $AWS_PROFILE -- bash -c "npx sls deploy -v"
deploy すると python-first-lambda サブプロジェクト内に .serverless ディレクトリが作成されます。アップロードする zip ファイルと create, update 用の CloudFormation の JSON ファイル、serverless-state.json というファイルが作成されています。
作成した Lambda を実行する
invoke コマンドを実行すると AWS 上の Lambda を実行して結果を取得することができます。invoke コマンドについては AWS - Invoke 参照。
aws-vault exec $AWS_PROFILE -- bash -c "npx sls invoke -f hello"
--log
オプションを指定すればログを取得することもできます。
aws-vault exec $AWS_PROFILE -- bash -c "npx sls invoke -f hello --log"
logs コマンドでログだけ取得することも可能です。log コマンドは AWS - Logs 参照。
aws-vault exec $AWS_PROFILE -- bash -c "npx sls logs -f hello"
AWS に作成されたリソースを確認する
マネジメントコンソールから作成されたリソースを確認すると以下の5つが作成されています。
- AWS Lambda
- IAM Role
- python-first-lambda-dev-ap-northeast-1-lambdaRole
- CloudWatch ロググループ
- S3 バケット
- python-first-lambda-dev-serverlessdeploymentbucke-7j3614vgkvv3
- CloudFormation スタック
- python-first-lambda-dev
作成した Lambda を削除する
remove コマンドを実行して作成したリソース一式を削除します。invoke コマンドについては AWS - Remove 参照。
aws-vault exec $AWS_PROFILE -- bash -c "npx sls remove -v"
コマンド実行後、上に書いたリソースは全て削除されていました。
削除した後に再度 deploy するとバージョンが上がる
削除した後に再度 delploy するとバージョンが 2 に上がります。
何もソースを変更せずに再度 delploy するとバージョンは 2 のままです。
handler.py を少し変更して delploy するとバージョン 3 が追加されます。
remove してから .serverless ディレクトリを削除して deploy するとバージョンは 1 に戻らず 4 に上がりました。.serverless ディレクトリの下のファイルを見てみましたが、最新のバージョン番号が書かれているファイルはないですね。どこに最新バージョンを保持しているのでしょうか?
最後に
やってみると Serverless Framework は使いやすそうです。個人的には Serverless Step Functions が便利と聞いたので、もう少し基本的なところを調べたら触ってみるつもりです。
履歴
2020/05/24
初版発行。