Serverless Frameworkを使ってLambda & API Gatewayをデプロイする

投稿日:2020-05-19

環境

ubuntu 20.04 LTS


Serverless Frameworkというサーバーレス環境を簡単に構築できるツールがあります。
https://www.serverless.com/framework/docs/

今回はそれを使ってAWS上にLambda & API Gatewayを使ったサーバーレスAPIを作ってみます。

事前準備(awscliの準備)

Serverless Frameworkはaws cliを使ってデプロイするので、インストールしておく必要があります。
既に作業PC等でawscliを使える状態であれば本手順は飛ばして大丈夫です。

awscliのインストール

公式ページの手順を実施します。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-linux.html

$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install

これでawscliのインストールが出来ました。
念の為バージョンを確認しておきます。

$ aws --version
aws-cli/2.0.14 Python/3.7.3 Linux/5.4.0-31-generic botocore/2.0.0dev18

アクセスキーの準備

awscliで利用するアクセスキーをAWS IAMで生成します。
手順は公式ページにあります。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html#cli-quick-configuration

ざっくりいうと、以下の作業をします。

①IAMへアクセス
②アクセスキーを発行するユーザーを選択する。
③「認証情報」タブの「アクセスキーの作成」をクリックする。
④表示されるアクセスキーID/シークレットアクセスキーをメモしておく。

以上です。

awscliの設定

IAMで取得したアクセスキーとリージョン情報をawscliに設定します。

$ aws configure
AWS Access Key ID [None]: YOUR-ACCESS-KEY-ID
AWS Secret Access Key [None]: YOUR-SECRET-ACCESS-KEY
Default region name [None]: ap-northeast-1
Default output format [None]: 

※output formatを空のままエンターするとjsonになる。

もし複数のAWSアカウントを使い分けている場合などであれば、以下のように実行することでアクセスキーを設定するプロファイルを指定することもできます。
以下のprofile01は好きなプロファイル名を入れてください。

$ aws configure --profile profile01

これでプロファイルを切り替えながらawscliを使えるようになります。

Serverless Frameworkの環境構築

Serverless Frameworkのインストール

公式ページの手順に従います。
https://www.serverless.com/framework/docs/getting-started/

ubuntu(Linux)では以下コマンドを実行します。

curl -o- -L https://slss.io/install | bash

Serverless Frameworkのテンプレート読込

作業ディレクトリにてserverlessコマンドを実行し、いくつか質問されるので答えることでServerless Frameworkを利用するためのテンプレートを読み込めます。
下記例ではLambdaの言語はpython、サービス名はsw-testとしています。
※slsコマンドはserverlessコマンドの短縮系です

$ sls
Serverless: No project detected. Do you want to create a new one? Yes
Serverless: What do you want to make? AWS Python
Serverless: What do you want to call this project? sw-test

Project successfully created in 'sw-test' folder.

You can monitor, troubleshoot, and test your new service with a free Serverless account.

Serverless: Would you like to enable this? No
You can run the “serverless” command again if you change your mind later.

Serverless: Would you like to setup a command line <tab> completion? No

これでsw-testディレクトリが生成され、その中にServerless Frameworkのテンプレートが読み込まれています。

Serverless Frameworkの設定

上記で生成したテンプレートに検証/本番環境別のconfigを追加して環境別の変数を定義できるようにします。
ファイル構成はこんな感じです。

sw-test
 ├─conf            ・・・設定ファイルディレクトリ(追加)
 │  ├─dev.yml     ・・・検証環境の設定ファイル(追加)
 │  └─prd.yml     ・・・本番環境の設定ファイル(追加)
 ├─handler.py      ・・・Lambdaで実行するスクリプト(今回はテンプレートのサンプルをそのまま使います)
 └─serverless.yml  ・・・デプロイ内容を定義したファイル

ファイルの中身は以下の通りです。

【dev.yml】
とりあえずリージョンだけ。

region: us-west-2

【prd.yml】
とりあえずリージョンだけ。

region: ap-northeast-1

【serverless.yml】

service: sw-test

custom:
  default_stage: dev
  stage: ${opt:stage, self:custom.default_stage}              deploy時にstageを指定しなかったらdevを設定します。
  config_file:
    dev: ${file(./conf/dev.yml)}
    prd: ${file(./conf/prd.yml)}
  config: ${self:custom.config_file.${self:custom.stage}}     stageに合わせてdev.ymlかprd.ymlを読み込みます。

provider:
  name: aws
  runtime: python3.8
  region: ${self:custom.config.region}                        dev/prd.ymlの中身を呼び出しています。設定ファイルにregion以外の指定をすれば同様の方法で呼び出せます。

functions:
  hello:
    handler: handler.hello                                    以下で指定するeventsが発生するとhandler.pyのhelloメソッドを呼びます
    events:
      - http:
          path: hello                                         リクエストを受けるパス
          method: get

上記のようにfunctionsのeventsでhttpを指定しておくと、Lambdaと一緒にAPI Gatewayもデプロイされます。

■ハマりポイント
全体的にインデントはスペース2つですが、path: helloの部分だけ- http:のハイフンの箇所からスペース4つ分下がっています。
つまりhttp:の部分からスペース2つ分下げるのが正解のようです。
(YAMLに慣れている人にとっては当たり前なのかもしれませんが、ちょっと躓きました)

上記ができていないとデプロイ時に以下のエラーがでます。

Serverless Error ---------------------------------------

  Missing or invalid "path" property in function "hello" for http event in serverless.yml. If you define an http event, make sure you pass a valid value for it, either as string syntax, or object syntax. Please check the indentation of your config values if you use the object syntax. Please check the docs for more options.

デプロイ実行

awscliのプロファイルを分けた場合は先にプロファイルを指定します。

export AWS_PROFILE="profile01"

デプロイします。

sls deploy

特にエラーが発生しなければ、これで検証環境リージョンのLambdaとAPI Gatewayにアプリケーションが追加されています。
本番環境にリリースしたい場合は以下のようにstageを指定してdeployします。

sls deploy --stage prd

以上です。