かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

IntelliJ IDEA+Node.js+npm+serverless framework+Python の組み合わせで開発環境を構築して AWS Lambda を作成してみる

概要

記事一覧はこちらです。

Serverless Framework を触ってみたいと思ったので IntelliJ IDEA で開発環境を構築して AWS Lambda を1つ作成してみます。言語は Python 3.8 にします。

参照したサイト・書籍

  1. Serverless Framework
    https://www.serverless.com/

  2. Python Release Python 3.8.3
    https://www.python.org/downloads/release/python-383/

  3. PyCharmでVenvをGitで共有するときにすること
    https://hiropon-progra.com/?p=82

  4. Windows 上の PythonUTF-8 をデフォルトにする
    https://qiita.com/methane/items/9a19ddf615089b071e71

  5. Hello World Python Example
    https://www.serverless.com/framework/docs/providers/aws/examples/hello-world/python/

  6. Serverless Frameworkの使い方まとめ
    https://qiita.com/horike37/items/b295a91908fcfd4033a2

目次

  1. idea-serverless-python-first プロジェクトを作成する
  2. Python の仮想環境を作成する
  3. Serverless Framework をローカルインストールする
  4. .envrc を作成する
  5. python-first-lambda サブプロジェクトを作成する
  6. Lambda が東京リージョン(ap-northeast-1)に作成されるよう serverless.yml を編集する
  7. deploy する
  8. 作成した Lambda を実行する
  9. AWS に作成されたリソースを確認する
  10. 作成した Lambda を削除する
  11. 削除した後に再度 deploy するとバージョンが上がる
  12. 最後に

手順

idea-serverless-python-first プロジェクトを作成する

IntelliJ IDEA で Empty Project を作成します。

「New Project」ダイアログを表示してから画面左側で Empty Project を選択して「Next」ボタンをクリックします。

f:id:ksby:20200523112336p:plain

「Project Name」に idea-serverless-python-first、「Project location」に D:\project-serverless\ksbysample-serverless\idea-serverless-python-first を入力して「Finish」ボタンをクリックします。

f:id:ksby:20200523112555p:plain

Project が開くと「Project Structure」ダイアログが開きますが、今は何もせずに「Cancel」ボタンをクリックして閉じます。

ダイアログを閉じた直後は Project Tool Window に .idea ディレクトリが表示されていなかったので、一旦 IntelliJ IDEA を閉じて idea-serverless-python-first プロジェクトを開き直します。そうすると Project Tool Window が以下の表示になります。

f:id:ksby:20200523113049p:plain

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...」を選択します。

f:id:ksby:20200523114954p:plain

「Add Python Interpreter」ダイアログが表示されます。表示直後が下記の状態だったので、そのまま「OK」ボタンをクリックします。

f:id:ksby:20200523115059p:plain

「Create Virtual Environment」ダイアログが表示されて仮想環境が構築されます(少し時間がかかります)。

f:id:ksby:20200523115522p:plain

構築が完了すると中央のリストに「Python 3.8 (idea-serverless-python-first)」が追加されます。

f:id:ksby:20200523115727p:plain

画面左側で「Project Settings」-「Project」を選択した後、画面右側の「Project SDK」で作成した PythonSDK と「SDK default」を選択してから「OK」ボタンをクリックします。

f:id:ksby:20200523115912p:plain

Project Tool Window に venv ディレクトリが表示されています。

f:id:ksby:20200523122414p:plain

IntelliJ IDEA の Terminal を起動すると venv 環境で動くようになります。

f:id:ksby:20200523122727p:plain

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

f:id:ksby:20200523185429p:plain f:id:ksby:20200523185838p:plain

.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

f:id:ksby:20200523195452p:plain

Project Tool Window を見ると python-first-lambda ディレクトリが作成されて、その下に .gitignore, handler.py, serverless.yml の3つのファイルが作成されます。

f:id:ksby:20200523195620p:plain

作成したばかりの 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"

f:id:ksby:20200523203103p:plain f:id:ksby:20200523203202p:plain

deploy すると python-first-lambda サブプロジェクト内に .serverless ディレクトリが作成されます。アップロードする zip ファイルと create, update 用の CloudFormation の JSON ファイル、serverless-state.json というファイルが作成されています。

f:id:ksby:20200523214740p:plain

作成した Lambda を実行する

invoke コマンドを実行すると AWS 上の Lambda を実行して結果を取得することができます。invoke コマンドについては AWS - Invoke 参照。

  • aws-vault exec $AWS_PROFILE -- bash -c "npx sls invoke -f hello"

f:id:ksby:20200523213749p:plain

--log オプションを指定すればログを取得することもできます。

  • aws-vault exec $AWS_PROFILE -- bash -c "npx sls invoke -f hello --log"

f:id:ksby:20200523214304p:plain

logs コマンドでログだけ取得することも可能です。log コマンドは AWS - Logs 参照。

  • aws-vault exec $AWS_PROFILE -- bash -c "npx sls logs -f hello"

f:id:ksby:20200523214530p:plain

AWS に作成されたリソースを確認する

マネジメントコンソールから作成されたリソースを確認すると以下の5つが作成されています。

  • AWS Lambda
    • python-first-lambda-dev-hello f:id:ksby:20200523215817p:plain バージョンは 1、エイリアスは $LATEST のみ(つまり何も作成はされない)。
      f:id:ksby:20200523221323p:plainf:id:ksby:20200523221415p:plain
  • IAM Role
    • python-first-lambda-dev-ap-northeast-1-lambdaRole f:id:ksby:20200523220213p:plain
  • CloudWatch ロググループ
  • S3 バケット
    • python-first-lambda-dev-serverlessdeploymentbucke-7j3614vgkvv3 f:id:ksby:20200523220851p:plain
  • CloudFormation スタック

作成した Lambda を削除する

remove コマンドを実行して作成したリソース一式を削除します。invoke コマンドについては AWS - Remove 参照。

  • aws-vault exec $AWS_PROFILE -- bash -c "npx sls remove -v"

f:id:ksby:20200523224047p:plain

コマンド実行後、上に書いたリソースは全て削除されていました。

削除した後に再度 deploy するとバージョンが上がる

削除した後に再度 delploy するとバージョンが 2 に上がります。

f:id:ksby:20200523225109p:plain

何もソースを変更せずに再度 delploy するとバージョンは 2 のままです。

f:id:ksby:20200523225451p:plain

handler.py を少し変更して delploy するとバージョン 3 が追加されます。

f:id:ksby:20200523225706p:plain

remove してから .serverless ディレクトリを削除して deploy するとバージョンは 1 に戻らず 4 に上がりました。.serverless ディレクトリの下のファイルを見てみましたが、最新のバージョン番号が書かれているファイルはないですね。どこに最新バージョンを保持しているのでしょうか?

f:id:ksby:20200523230309p:plain

最後に

やってみると Serverless Framework は使いやすそうです。個人的には Serverless Step Functions が便利と聞いたので、もう少し基本的なところを調べたら触ってみるつもりです。

履歴

2020/05/24
初版発行。