目次
serverless
since 2022-08-31
Python
$ sudo n lts installed : v16.17.0 (with npm 8.15.0) $ sudo npm install -g serverless $ mkdir serverless-aws-python3 $ cd serverless-aws-python3/ $ serverless create --template aws-python3 $ ls -1 -a . .. .gitignore handler.py serverless.yml $ serverless plugin install -n serverless-python-requirements
プラグインの説明
下記を書きかえて runtime の Python バージョンを 3.8 から 3.9 にする。region も変更。
# serverless.yml provider: name: aws runtime: python3.9 stage: dev region: ap-northeast-1
デプロイする。
$ serverless deploy
invoke してみる。
$ serverless invoke -f hello --log Running "serverless" from node_modules { "statusCode": 200, "body": "{\"message\": \"Go Serverless v1.0! Your function executed successfully!\", \"input\": {}}" } -------------------------------------------------------------------- START END Duration: 1.18 ms (init: 112.78 ms) Memory Used: 36 MB
AWS コンソールの Lambda でみると以下ができている。
- アプリケーション serverless-aws-python3-dev
- 関数 serverless-aws-python3-dev-hello
なお serverless = sls コマンド。
HTTP API
あらためて create コマンドを確認する。
https://www.serverless.com/framework/docs/providers/aws/cli-reference/create
https://www.serverless.com/examples を探す
https://www.serverless.com/examples/aws-python-http-api
こういうほうがよかったか。。
https://github.com/serverless/examples/tree/master/aws-python-simple-http-endpoint
serverless.yml を更新する。
functions: hello: handler: handler.hello events: - httpApi: path: /hello method: get
sls deploy すると endpoint URL が表示される
$ sls deploy Running "serverless" from node_modules Deploying serverless-aws-python3 to stage dev (ap-northeast-1) ✔ Service deployed to stack serverless-aws-python3-dev (42s) endpoint: GET - https://******************.execute-api.ap-northeast-1.amazonaws.com/hello functions: hello: serverless-aws-python3-dev-hello (373 B) Improve API performance – monitor it with the Serverless Dashboard: run "serverless"
sls info でも再表示できる。
httpie でアクセスしてみる。
$ http https://************.execute-api.ap-northeast-1.amazonaws.com/hello HTTP/1.1 200 OK Apigw-Requestid: ************ Connection: keep-alive Content-Length: 979 Content-Type: text/plain; charset=utf-8 Date: Wed, 31 Aug 2022 00:56:29 GMT { "input": { 中略 "routeKey": "GET /hello", "version": "2.0" }, "message": "Go Serverless v1.0! Your function executed successfully!" }
コメントを削るとこんなコードになる
$ cat serverless.yml
service: serverless-aws-python3 frameworkVersion: '3' provider: name: aws runtime: python3.9 stage: dev region: ap-northeast-1 functions: hello: handler: handler.hello events: - httpApi: path: /hello method: get plugins: - serverless-python-requirements
$ cat handler.py
import json def hello(event, context): body = { "message": "Go Serverless v1.0! Your function executed successfully!", # "input": event } response = { "statusCode": 200, "body": json.dumps(body) } return response
nodejs
nodejs もやってみよう
$ mkdir serverless-aws-nodejs $ cd serverless-aws-nodejs/ $ sls create --template aws-nodejs
ちなみに serverless.yml の path と method のところだけインデントが4つなのは、そうしないとエラーになるから、らしい。。
無事にデプロイできて動く
$ http https://************.execute-api.ap-northeast-1.amazonaws.com/hello HTTP/1.1 200 OK Apigw-Requestid: *********** Connection: keep-alive Content-Length: 75 Content-Type: text/plain; charset=utf-8 Date: Wed, 31 Aug 2022 01:22:32 GMT { "message": "Go Serverless v1.0! Your function executed successfully!" }
$ cat serverless.yml
service: serverless-aws-nodejs frameworkVersion: '3' provider: name: aws runtime: nodejs16.x stage: dev region: ap-northeast-1 functions: hello: handler: handler.hello events: - httpApi: path: /hello method: get
$ cat handler.js
'use strict'; module.exports.hello = async (event) => { return { statusCode: 200, body: JSON.stringify( { message: 'Go Serverless v1.0! Your function executed successfully!', // input: event, }, null, 2 ), }; };
serverless express
下記が新しいという話
https://github.com/vendia/serverless-express
下記の記事のとおりにやってみた。
https://zenn.dev/yuta_saito/articles/8b543a1957c375593ee5
$ npm init $ npm i express --save $ npm i @vendia/serverless-express
$ ls -1 app.js lambda.js local-app.js node_modules package-lock.json package.json routes serverless.yml $ ls -1 routes router.js
serverless.yml は警告が出ないように直してみた
service: serverless-express-test provider: name: aws runtime: nodejs16.x region: ap-northeast-1 package: patterns: - '!.git/**' - '!test/**' - '!README.md' - '!local-app.js' functions: serverlessTest: handler: lambda.handler events: - http: ANY / - http: 'ANY /{proxy+}'
stage を省略すると dev になる。
$ curl https://************.execute-api.ap-northeast-1.amazonaws.com/dev {"message":"Hello World!"} $ curl https://************.execute-api.ap-northeast-1.amazonaws.com/dev/users/ [{"name":"Taro"},{"name":"Hanako"}]
$ sls info Running "serverless" from node_modules service: serverless-express-test stage: dev region: ap-northeast-1 stack: serverless-express-test-dev endpoints: ANY - https://************.execute-api.ap-northeast-1.amazonaws.com/dev ANY - https://************.execute-api.ap-northeast-1.amazonaws.com/dev/{proxy+} functions: serverlessTest: serverless-express-test-dev-serverlessTest
events
- http : API Gateway V1
- httpApi : API Gateway V2
domain manager
カスタムドメイン設定にこれが使えそう
https://github.com/amplify-education/serverless-domain-manager
https://qiita.com/sugurutakahashi12345/items/c4e0cf5708a792703b9d
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-custom-domains.html
前述の express の続き
$ npm install serverless-domain-manager --save-dev
最初にやったこと
- ACM は us-east-1 で sls-dev-api.example.com を作る
- serverless.yml には certificateArn も書く
- sls create_domain したら Certificate must be in 'ap-northeast-1' と言われてしまった。。
- endpointType regional の場合は ap-northeast-1 で作るべきだったという話
- Edgeを選択した場合はCloudFront Distributionを経由
やり直した手順
- デプロイ先に合わせて ACM は ap-northeast-1 で sls-dev-api.example.com の証明書を作る(example.com は同じ AWS アカウントの Route53 ゾーンで管理できるとする)
- serverless.yml には certificateArn で作成した証明書の ARN を入れる
- sls create_domain 成功する
- Route 53 をみると A と AAAA が入っている
- だがカスタムドメインを叩くと forbidden になる
やり直すときの本来の手順
- 削除 = sls remove してから sls delete_domain
- 再作成 = sls create_domain してから sls deploy
どうなったか
- 成功していない
- API Gateway で確認すると REST Edge になっている。これは過去に zappa で作ったものと同じ。
- 今回 sls で作った Python / node.js は HTTP Regional になっている。
- やっぱり証明書を us-east-1 で作って endpointType edge にしたほうがすっきりするような。。
- ACM us-east-1 + endpointType edge で再挑戦したがうまくいかない。 AWS コンソールでみると CloudFront distribution が存在しない
再び情報収集
- 別のプラグインもあるのか
serverless + express + Lambda Function URLs
since 2022-09-07
カスタムドメインが不要であれば API Gateway さえ使わない方法がある。
functions: handler: handler: lambda.handler url: true
$ sls deploy Running "serverless" from node_modules Deploying serverless-express-test to stage dev (ap-northeast-1) ✔ Service deployed to stack serverless-express-test-dev (55s) endpoint: https://***********************************.lambda-url.ap-northeast-1.on.aws/ functions: handler: serverless-express-test-dev-handler (838 kB) Want to ditch CloudWatch? Try our new console: run "serverless --console"
console と cloud
ここからは serverless 社のサービス。アカウントを作る話になりそう。