概要
Serverless Framework とはサーバレスなアプリケーションを作成、デプロイが簡単にできるツール。 AWS Lambda や Google Cloud Functions といったFaasの実装や、API Gateway の構成変更が容易にできる。 今回はAPI Gateway経由でAWS Lambdaを呼び出してみる。
環境構築
インストール
まずは Serverless Frameworkをインストール。
$ npm install serverless -g
インストールが完了したらデプロイする際に必要なAWSのユーザ情報を作成する。
IAMユーザの作成・登録
Serverless Framework をAWSで利用するには色々と権限を付与したユーザを用意する必要がある。 公式でセットアップ手順が記載されているのでその通りにユーザを作成する。
- AWSのIAM管理コンソールを開く
- “ユーザを追加"をクリックする
- 適当にユーザ名を入力する。ここでは"serverless-agent"とする。
- “プログラムによるアクセス"にチェックボックスを入れ"次のステップ"をクリック
- “既存のポリシーを直接アタッチ"から"ポリシーの作成を選択”
- JSONをクリックし公式で案内しているgistから内容をコピペして上書き
- ポリシーの確認をクリック
- 適当にポリシー名を入力する。ここでは"serverless-agent-policy"とする。入力したらポリシーの作成をクリック。
- ポリシーが作成されたらユーザを追加の画面に戻ってポリシーをリロード
- ポリシーから"serverless-agent-policy"を選択して"次のステップ"をクリック
- 次のステップ: 確認をクリック
- ユーザの作成をクリック
- ユーザの作成が成功したらアクセスキーIDとシークレットアクセスキーが表示されるので下記コマンドで Serverless Framework にユーザ情報を登録する。
$ serverless config credentials --provider aws --key <アクセスキーID> --secret <シークレットアクセスキー>
これで Serverless Frameworkからサーバレスアプリケーションをデプロイするための準備ができた。
アプリケーションの作成
今回はPython 3.7 でアプリケーション(といっても中身はHello world)を作る。
Serverless Framework はsls
という短いコマンドから操作できるので、これを用いてアプリケーションを実装していく。
まずはサーバレスアプリケーションのプロジェクト作成。
$ sls create -t aws-python -p helloWorld
create
オプションでプロジェクトを作成。
-t
は--template
の略でどの言語で実装するかを選択するオプション。
今回はPython を選択。
使用できる言語の一覧
-p
は--path
の略でプロジェクトのパス名を指定するオプション。
helloWorld
ディレクトリが作成されたら中を見てみる。
serverless.yml
にはアプリケーションの構成情報が定義されている。
service: aws-python3
provider:
name: aws
runtime: python3.7
functions:
hello:
handler: handler.hello
handler.py
にはserverless.yml
で指定したhello
関数が定義されている。
中身は入力内容をそのままjsonとして返すコードになっている。
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
Lambdaの実装を書き換えてみる
handler.py
の中身を下記のように書き換える。
入力に関わらず"Hello Serverless!!“と返すようになる。
import json
def hello(event, context):
body = {
"message": "Hello Serverless!!"
}
response = {
"statusCode": 200,
"body": json.dumps(body)
}
return response
API Gatewayを作成する
次にserverless.yml
を下記のように編集する。
service: aws-python3
provider:
name: aws
runtime: python3.7
functions:
hello:
handler: handler.hello
events:
- http:
path: hello
method: get
hello
エンドポイントに対するGetイベントが発生するとLambda関数を実行するようになる。
デプロイ
デプロイは下記のコマンドでできる。
$ sls deploy -v
デプロイが完了すると下記のような出力がされる。
Service Information
service: aws-python3
stage: dev
region: <AWSのデフォルトのリージョン>
stack: aws-python3-dev
resources: 10
api keys:
None
endpoints:
GET - https://<エンドポイント>.execute-api.us-east-1.amazonaws.com/dev/hello
functions:
hello: aws-python3-dev-hello
layers:
None
endpoints
の部分が今回作成したLambdaのAPIエンドポイント。
期待通りデプロイされているか試しにcurl
でgetリクエストを送ってみる。
$ curl -X GET https://vh3i1rl9nc.execute-api.us-east-1.amazonaws.com/dev/hello
{"message": "Hello Serverless!!"}
Serverless Frameworkを用いてHello worldを書くことができた。
削除
Hello worldを書きながらServerless Frameworkの基本的な挙動を確認することができた。 ただ、Hello worldといってもAWSのリソースを使っているため残しておくと課金が発生する。 なので今回作成したリソースはAWS上から削除しておく。
$ sls remove -v
参考にしたサイト
https://serverless.com/framework/docs/providers/aws/guide/credentials/ https://serverless.com/framework/docs/providers/aws/examples/hello-world/python/ https://dev.classmethod.jp/cloud/aws/serverless-first-serverlessframework/