serverless framework で AWS lambdaのデプロイをする

主に利用方法のメモです。

前提

  • nodeはインストール済み
  • AWSの権限は設定済み

インストール

serverlessコマンドのエイリアスとしてslsコマンドが登録される。

$ npm install -g serverless
$ sls -v
1.30.0

新規サービスの作成

ここではpython3のテンプレートから作成する。利用できるテンプレートはsls create -hで確認できる。

$ sls create -t aws-python3 -p sample-app
$ cd sample-app
$ tree -L 1
.
├── handler.py # lambdaファンクションのテンプレート
└── serverless.yml # serverlessの設定ファイル

プラグイン機能

serverlessにはプラグイン機能が準備されている。

プラグインの検索

pythonプラグインを検索する。

$ sls plugin search --query python

プラグインのインストール

serverless-python-requirementsをインストールする。serverless-python-requirementsはrequirements.txtに記載されたモジュールをデプロイ時にまとめてパッケージ化してくれるプラグイン

$ sls plugin install -n serverless-python-requirements

サービスのデプロイ

プロファイルを指定する場合は--aws-profileオプションで、ステージを指定する場合は--stageオプションで行う。

$ sls deploy --aws-profile profile_file --stage prod

serverlessの設定

基本的な設定はドキュメントを参照。自身が運用するにあたってハマりどころだけ記載する。

既存のroleを指定する

既存のロールの権限を与えたい場合は、roleキーにIAMロールのarnを指定する。

provider:
  name: aws
  runtime: python3.6
  stage: ${opt:stage, 'dev'}
  region: ap-northeast-1
  role: arn:aws:iam::xxxxxxxxxx:role/lambda-role
  ...

stage毎に環境変数を変える

各ステージ用の設定ファイル作成

$ mkdir conf && cd conf
$ touch dev.yml, prod.yml 
$ vi dev.yml
DYNAMODB_TABLE: 'dev_dynamo_table'
# 本番用も同じように

serverlessの設定

stage毎の設定ファイルを読み込ませ、環境変数の設定で指定したstageの値をセットする。 devを指定した場合はdev.yml、prodを指定した場合はprod.ymlのDYNAMODB_TABLEの値がセットされることになる。

functions:
  speech-translation:
    handler: handler.handler
    events:
      - schedule: rate(30 minutes)
    environment:
      DYNAMODB_TABLE: ${self:custom.otherfile.environment.${self:provider.stage}.DYNAMODB_TABLE}

custom:
  otherfile:
    environment:
      dev: ${file(./conf/dev.yml)}
      prod: ${file(./conf/prod.yml)}

共通の環境変数を設定する

provider.environmentに指定する。

provider:
  ... 省略
  environment:
    DYNAMODB_ENDPOINT: 'https://dynamodb.ap-northeast-1.amazonaws.com'

注意事項

serverlessでデプロイした場合、タイムアウトが6秒に設定される。時間がかかる処理をする場合は変更する必要がある。

参考