httpで何かPOSTしてその内容を確認したい時がある。しかしそのためだけにわざわざWebサーバーたてるのも面倒。ということで、API Gateway + Lambdaでさらっと確認できるようの受け口を作りたい。
SAM CLIを使って構築する。楽。
目次
環境
- macOS 10.15.4
- AWS SAM CLI 0.47.0
- Python 3.8
どうでもいいけどほとんどクラウド環境になってくると、ローカルの環境書いても片手落ち感すごい。
受け口を作る
ファイルを準備する。最初に大まかな構成を書く。なお、環境にもあるとおり、Lambda関数はPython 3.8を想定している。ディレクトリ名はなんでもいいが、そのまま使えば設定ファイルもコピペでできる。
.
├── post_recv
│ ├── app.py
│ └── requirements.txt
├── samconfig.toml
└── template.yaml
post_recv/app.py
import json
def lambda_handler(event, context):
print(event)
print(event['body'])
return {
"statusCode": 200,
"body": json.dumps({
"message": event['body'],
}),
}
post_recv/requirements.txt
特にライブラリはいらないので空ファイルでよい。ないとsam buildで怒られる。
template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
test-api
Sample SAM Template for test-api
# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
Function:
Timeout: 3
Resources:
PostRecvFunction:
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: post_recv/
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: /post
Method: post
samconfig.toml
以下で準備する。
$ sam build
$ sam deploy --guided
-> スタック名適当に(後でも使うので覚えておく)
-> region適当に。東京regionは ap-northeast-1
-> 後は enter でOK
2回目以降のsam deployは--guided なしでよい。
確認
API Gatewayから作成したendpointを確認する。コンソール画面から確認してもよいが、ここではコマンドを用いる(参考「curlでJSONをPOSTする - Qiita」)。
$ aws apigateway get-rest-apis
先の手順で作成したstack名がnameになっているもののidを確認する。で、以下を投げる。
$ curl -X POST -d "{\"key\":\"val\",\"key2\":\",val2\"}" "https://確認したID.execute-api.ap-northeast-1.amazonaws.com/Prod/post"
-> {"message": "{\"key\":\"val\",\"key2\":\",val2\"}"}
CloudWatchからも確認可能。
後片付け
使いおわったらスタックを始末する。
$ aws cloudformation delete-stack --stack-name スタック名
以上。
コメント