Serverless FrameworkでAWS Lambdaの開発環境を簡単構築


はじめに

以前Lambdaを使ってSlack通知を飛ばすような機能をつくったのですが、コンソール上でコードをベタ書きしていたのでデバッグに非常に手間がかかりました。

最近の社内勉強会でServerless Frameworkの存在を知り、これを使えばローカル環境で関数をコーディングしてAWSに簡単にデプロイできるということを知ったので早速勉強してみることにしました。

今回の記事では、Serverless Frameworkのインストールからデプロイまでの流れを簡単にまとめました。
これからServerless Frameworkを使ってみたいという初心者の方向けの内容となっています。 

Serverless Frameworkとは

Serverless Frameworkはサーバーレスなアプリケーションを簡単に開発、デプロイするためのツールです。

AWS、Azure、GCP等のクラウドサービスによらず利用することができ、クラウドサービスで使用できる言語(AWSであればC#, Node.js, Pythonなど)を利用することができます。
また、デプロイコマンドを実行することでクラウドサービスのリソースを構築することができます。
例えばAWSだと、ローカルで作成したLambdaのスクリプトとあわせて、Lambdaと連携するDynamoDBやAPI Gatewayなどのリソースも構築することができます。

実装

インストール、serverlessテンプレートの作成、デプロイの流れをそれぞれ簡単にまとめました。

インストール

インストールの流れは以下になります。

  1. nodeのインストール
  2. serverlessのインストール
  3. IAMユーザの作成
  4. Serverless FrameworkにIAMユーザを設定

nodeのインストール

brew install node

serverlessのインストール

npm install -g serverless

IAMユーザの作成

AWSコンソールでIAMを開き、新しくIAMユーザを作成します。
Serverless FrameworkからAWSにアクセスするため、「プログラムによるアクセス」をチェックします。

既存のポリシーである「AdministratorAccess」を選択し、IAMユーザを作成します。

Serverless FrameworkにIAMユーザを設定

IAMユーザの作成後画面にアクセスキーIDとシークレットアクセスキーが表示されるので、これらを控えます。
ターミナルで以下のコマンド(XXX: アクセスキーID、YYY: シークレットアクセスキー)を実行します。

serverless config credentials --provider aws --key XXX --secret YYY --profile serverless-admin

serverlessテンプレートの作成

テンプレート作成のあとに、Lambda関数とserverless.ymlの中身を記述します。

テンプレート作成

以下のコマンドでテンプレートを作成します。

sls create --template aws-python --path [テンプレート名]

使用する言語によって、aws-pythonの箇所をaws-nodejsなどに置き換えます。

Lambda関数の作成

hi !と表示されるだけのスクリプトです。

handler.py
def hello(event, context):
    print("hi !")
    return "hello-world"

serverless.ymlの作成

Lambdaのスクリプトをデプロイするときのクラウドサービスの設定をserverless.ymlに記述します。

serverless.yml
provider:
  name: aws #選択するクラウドサービス
  runtime: python2.7 #言語のバージョン
  profile: serverless-admin #IAMユーザをserverlessに設定したときのプロファイル名
  region: us-east-1 #リソースを作成するリージョン

デプロイ

デプロイは以下のコマンドで実行します。

sls deploy -v

AWSコンソールでLambdaを開くと、ちゃんとデプロイされていることを確認することができます。

Testをクリックすると、デプロイしたLambda関数の実行内容を確認することができます。

デプロイまでの大まかな流れは以上です。

各種slsコマンド

使いそうなslsコマンドをまとめました。

invoke

ターミナル上でLambda関数の実行内容を確認することができます。

sls invoke -f [function名] -l

deploy function -f ~

変更した関数のみデプロイすることができます。
sls deploy -vよりもデプロイに時間がかかりません。

sls deploy function -f [function名]

logs

ターミナル上でLambda関数の実行ログをリアルタイムに出力することができます。

sls logs -f [function名] -t

remove

デプロイしたリソースをすべて削除します。
関数だけではなく、CloudWatchのロググループやIAMロールも削除します。

sls remove

Lambdaの各種設定におけるserverless.ymlの記述

オプションをserverless.ymlに記述しておくと、関数をデプロイする際にそれらの設定を反映してくれます。

IAM

Lambdaはデフォルトで他のAWSサービスへのアクセス権を持っていないので、アクセスが必要な際にはIAMポリシーが必要になります。
S3のデータを取得したり保存したりする場合には、以下のようにiamRoleStatementsを記述します。

serverless.yml
iamRoleStatements:
  - Effect: "Allow"
    Action:
      - "s3:ListBucket"
    Resource: { "Fn::Join" : ["", ["arn:aws:s3:::", { "Ref" : "ServerlessDeploymentBucket" } ] ]  }
  - Effect: "Allow"
    Action:
      - "s3:PutObject"
    Resource:
      Fn::Join:
        - ""
        - - "arn:aws:s3:::"
          - "Ref" : "ServerlessDeploymentBucket"
          - "/*"

メモリ、タイムアウト

Lambda関数が実行時に使用するメモリ量やLambda関数が停止するまでに許可される実行時間の設定については、providerにmemorySizeとtimeoutを追記します。

serverless.yml
provider:
  name: aws
  runtime: python2.7
  profile: serverless-admin
  region: us-east-1
  memorySize: 512
  timeout: 2

環境変数

Lambdaで使用する環境変数は以下のように設定します。

serverless.yml
environment:
  variable1: value1

おわりに

今度はServerless FrameworkでREST APIの構築をやってみようと思います。

参考資料