プロジェクトで、Pythonを使った簡単なAPIを作ることになったので、サクッとAPIを作る環境を整えていきます。
前提
エディター…VSCode
OS…Windows10
Python3.8インストール済み
AWS CLI導入済み
Windows での AWS CLI バージョン 2 のインストール - AWS Command Line Interface
必要な環境
- AWS SAM CLI
- AWS Toolkit for Visual Studio Code
AWS SAMの利点
公式ドキュメントによると
- 単一のデプロイ構成
- AWS CloudFormation の拡張
- 組み込みのベストプラクティス
- ローカルのデバッグとテスト
- 開発ツールとの緊密な統合
がメリット。
個人的にはlambdaをローカルでデバッグできるのは大きなメリットでした。
実態はCloudFormationなので、カスタマイズ性があるのもポイント高い。
AWS SAM CLIの導入
公式ドキュメントに従って行います。要約すると
- dockerをインストール
- AWSが配布してるインストーラ(.msiファイル)からインストールするか
pip install aws-sam-cli
でインストールsam --version
でバージョンが出力されればOK
dockerは、ローカルマシンにlambdaの実行環境を作るために導入します。
AWS Toolkit for Visual Studio Codeの導入
これは、VSCodeからAWSのSAMをGUIで操作するためのVSCodeの拡張機能です。
AWS Toolkit - Visual Studio Marketplace
プロジェクトを新規作成する
公式ドキュメントに従って行います。
- コマンドパレット(Ctrl + Shift + P)を開き、
Create new SAM Application
を選択
- 使用するランタイムを選びます。今回はPython3.8
- テンプレートを選択。今回は単体で使うのでHwllo World
- プロジェクトを作成するディレクトリを指定します。エクスプローラーが開くので任意のフォルダを選択します。
- プロジェクト名を指定します。
Enterを押すと、プロジェクトが作成されます。
ローカルデバッグ実行する
eventを設定する
デプロイする
templete.yamlをもとにデプロイしていきます。
- コマンドパレットから
Deploy SAM Application
を選択
- テンプレートを選択する。今回は
templete.yaml
- 任意のデプロイ先のリージョンを選択する。今回はTokyo
- S3のバケット名を指定します。ここでは既存のバケット名を指定しなければなりません。
- Stack名を指定します。
Stackとは、CloudFormationで作成されるサービス群の名前です。プロジェクト名と同名にしてます。
- デプロイが成功するとデバッグコンソールが表示されます
デプロイされたことを確認する
以下のように、lambdaが作られていることを確認できます。
API GatewayでもAPIが作られていることが確認できます。
カスタマイズする
デフォルトで作られるAPIは
GET: /hello
なので、これを変更するにはtemplete.yaml
を編集する必要があります。
下記はデフォルトのtemplete.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
trial-sam
Sample SAM Template for trial-sam
# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
Function:
Timeout: 3
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.8
Events:
HelloWorld:
Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
Properties:
Path: /hello
Method: get
Outputs:
# ServerlessRestApi is an implicit API created out of Events key under Serverless::Function
# Find out more about other implicit resources you can reference within SAM
# https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api
HelloWorldApi:
Description: "API Gateway endpoint URL for Prod stage for Hello World function"
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
HelloWorldFunction:
Description: "Hello World Lambda Function ARN"
Value: !GetAtt HelloWorldFunction.Arn
HelloWorldFunctionIamRole:
Description: "Implicit IAM Role created for Hello World function"
Value: !GetAtt HelloWorldFunctionRole.Arn
この中を以下の通りに書き換えればパスとHTTPメソッドを変えられる
Before
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.8
Events:
HelloWorld:
Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
Properties:
Path: /hello
Method: get
After
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.8
Events:
HelloWorld:
Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
Properties:
Path: /anypath # hello → anypath
Method: post # get → post
あとはロジックを書いていくだけ
あとは要件に合わせてロジックを組み立てていくだけです。
再度デプロイすれば、変更内容も反映されます。