AWS Lambda入門①(Node編)〜関数をデプロイして動かす〜


概要

  • ServerlessFrameworkを使ってLambda関数を作り、ローカルで動作確認したあとにAWSにデプロイしてアクセスするところまでやってみます

Lambdaとは

  • LambdaはAWSが提供するサービスの1つで以下のような特徴を持ちます

サーバーレス

  • 通常のアプリケーションはサーバにデプロイし稼働させることでアクセスすることができますが、当然サーバが止まっていたら利用することはできません
  • Lambdaはサーバーレスに分類されるサービスで、アクセスがあるとそのつど起動し処理が実行され終了すると停止します
  • つまりLambdaはサーバの死活監視のようなことをする必要がなく、また課金も実行時間単位なので金銭面でもお得といった特徴があります

FaaS

  • LambdaはいわゆるFaaS(Function as a Service)に分類されます
  • つまり、Function(関数)をデプロイして、それを公開するサービスというわけですね

Lambda関数の作成

関数の作成

ServerlessFrameworkのインストール

  • グローバルにインストール
npm i -g serverless
  • 動作確認
sls -v

ServerlessFrameworkのコマンドがslsserverlessのどちらでも動きます

  • 以下のような内容が表示されればOKです
Framework Core: 1.64.1
Plugin: 3.4.1
SDK: 2.3.0
Components Core: 1.1.2
Components CLI: 1.4.0

雛形の生成

  • ServerlessFrameworkの機能でLambda用の関数や設定ファイルの雛形を生成します
    • 今回はaws-nodejsというtemplateを指定します
    • 他にどんなtemplateがあるかはserverless create --helpを実行すると見ることができます
mkdir sls-sample
cd sls-sample
serverless create --template aws-nodejs
  • 以下のようなファイルが生成されているはずです
% tree -a
.
├── .gitignore
├── handler.js
└── serverless.yml
  • handler.jsは今回のメインのファイルでLambdaで実行する処理を書きます
  • serverless.ymlはServerlessFrameworkを使う上での設定ファイルです
  • .gitignoreはgit管理する際にServerlessFrameworkが生成する一時ファイルを管理対象外にするための記載が追加されています

関数をローカルで実行してみる

  • AWSにデプロイする前にまずはローカルで動作確認します

関数の内容を確認

  • 実行する前に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
    ),
  };

  // Use this code if you don't use the http event with the LAMBDA-PROXY integration
  // return { message: 'Go Serverless v1.0! Your function executed successfully!', event };
};
  • メインの処理である関数をhelloという名前でmodule.exportsによって外部からアクセス可能にしています
  • 関数の中を見てみるとreturn文しかありません
  • statusCodebodyの2つのプロパティを持ったobjectを返却しています
    • statusCodeは実行結果を表現していて200は成功を意味しています(詳しくはググって)
    • bodyは実行結果のメイン部分でメッセージを定義したmessageと入力値をそのまま返却するinputを返しています

ローカルで実行する

  • それでは実行してみましょう
  • ServerlessFrameworkを使うとAWSにデプロイせずともLocalマシン上で動作確認ができます
sls invoke local --function hello
  • sls invokeが関数を呼び出すためのコマンドです
    • そのあとのlocalはAWSにアクセスするのではなく手元のファイルにアクセスすることを意味しています
    • 最後の--function helloは実行したい関数を指定していています
      • 先程helloという名前でexportしていることを確認しましたね
  • 実行結果はこんな感じです
{
    "statusCode": 200,
    "body": "{\n  \"message\": \"Go Serverless v1.0! Your function executed successfully!\",\n  \"input\": \"\"\n}"
}
  • inputが空っぽなので適当な値を渡してみます
    • --dataで値を渡すことができます
sls invoke local --function hello --data Hello
{
    "statusCode": 200,
    "body": "{\n  \"message\": \"Go Serverless v1.0! Your function executed successfully!\",\n  \"input\": \"Hello\"\n}"
}
  • Helloも取得できることが確認できました

関数をAWSにデプロイして実行してみる

  • AWSにデプロイしてアクセスしてみます

AWSにアクセスするための設定

  • AWSにデプロイするためにはキー情報の設定が必要になります
  • アクセスキーの発行についてはIAM ユーザーのアクセスキーの管理を参考に実施してください
  • 以下のコマンドのaws_access_key_idにAccess key IDを、aws_secret_access_keyにSecret access keyを入れて実行してください
    • ~/.aws/credentialsがすでに作成されている場合は上書きされるか尋ねられるので問題ないかファイルの内容を確認し対応してください
serverless config credentials --provider aws --key aws_access_key_id --secret aws_secret_access_key
  • キー情報が漏洩し悪用されると多額の請求につながる危険性があるので取り扱いには十分気をつけてください

デプロイする

  • デプロイもServerlessFrameworkの機能で簡単に実行できます
serverless deploy --region ap-northeast-1
  • --region ap-northeast-1はAWSの東京リージョンにデプロイすることを指定しています
    • serverless.ymlに記載しておけば毎回引数で設定する必要はなくなります
serverless.yml
# 抜粋
provider:
  name: aws
  runtime: nodejs12.x
  region: ap-northeast-1 # これ
  • デプロイが成功すると以下のような出力がされます
Service Information
service: sls-sample
stage: dev
region: ap-northeast-1
stack: sls-sample-dev
resources: 6
api keys:
  None
endpoints:
  None
functions:
  hello: sls-sample-dev-hello
layers:
  None
Serverless: Run the "serverless" command to setup monitoring, troubleshooting and testing.
  • エラーが出た場合は出力されたログをよく確認して対処しましょう

デプロイした関数を実行する

  • AWSにデプロイしたLambda関数もコマンドラインから実行することができます
sls invoke --function hello --data Hello --region ap-northeast-1
  • ローカルで実行したときとの違いはlocalを指定していないだけですね
  • ローカルのときと同じように以下のレスポンスを受け取れていれば成功です
{
    "statusCode": 200,
    "body": "{\n  \"message\": \"Go Serverless v1.0! Your function executed successfully!\",\n  \"input\": \"Hello\"\n}"
}

まとめ

  • Lambda関数の基本的な扱い方について紹介しました
  • ServerlessFrameworkを使うと設定やデプロイ周りがとても簡単ですね!