Serverless framework入門

2020-06-16

概要

  • AWS Lambdaのために serverless framework を使い始めたので、簡単にメモを残します。
  • Serverless frameworkは、YAML + CLI でAWS, Azure, Google Cloud, Knative他の開発とデプロイを容易にするので、サーバーレス開発には必須。
  • このフレームワークを使うことにより
    • プログラムラミングのすべてがおこなえる(AWSコンソールでの作業が不要)
    • 継続的インテグレーション/継続的デリバリー/継続的デプロイ(CI/CD)のフレームワークと統合可能
  • たくさんのサンプルを元に作業を開始できる。
  • 以下では、ラムダ関数をどのようにデプロイ、実行、ログの確認をおこない、削除するかについて、ほんのさわりだけ説明する。

各種のインストール

  • Node.jsのインストール
  • serverless frameworkのインストール
> npm install -g serverless

‘serverless-admin’ユーザのためのAWSの設定

  • AWSマネジメントコンソールからIAM(Identity and Access Management)へ移動する。
  • ダッシュボードから「ユーザー」をクリックする。
  • [ユーザーを追加]ボタンをクリックする。
  • ユーザー名を入力する。例:serverless-admin
  • アクセスの種類から[プログラムによるアクセス]をチェックして、[次のステップ:アクセス権限]をクリックする。
  • [既存のポリシーを直接アタッチ]をクリックする。
  • ポリシーの一覧からAdministratorAccessをチェックして、[次のステップ:タグ]をクリックする。
  • タグは追加せず、[次のステップ:確認]をクリックする。
  • [.csv]のダウンロードをクリックする。

認証情報を使うためにserverlessを設定

> serverless config credentials --provider aws --key xxx --secret yyy --profile serverless-admin

関数の作成

> serverless

又は

> sls // コマンドの一覧が表示される
> sls create // 新しいサーバーレスサービスの作成コマンド。エラーが表示され使い方がわかる。
> sls create --template aws-nodejs --path hellow-world-nodejs

serverless.ymlに以下の2行を追加

provider:
  name: aws
  runtime: nodejs12.x
  profile: serverless-admin  <---
  region: ap-northeast-1       <---

関数本体は handler.js に書かれる。Hello world的に簡潔にすると以下の感じ。

module.exports.hello = async event => {
  return {
    message: 'おはよう。',
    event
  };
};

関数のデプロイと実行

> sls deploy -v
> sls invoke -f hello -l
ファイル変更
> sls deploy function -h hello // AWS CloudFormationなしで個々の関数をデプロイ

実行結果の例

$ sls invoke -f hello
{
"message": "おはよう。",
"event": {}
}

ログへのアクセス

AWS CloudWatchで関数実行のログを見ることができるが、コンソールで確認できる。

> sls logs -f hello -t
-t(-tail)オプションは最新のログを表示します。最近のログがない場合、何も表示されません。このコマンドは継続的にログを読み取るので、

関数の設定

関数の設定はこちらにあるように、グローバル的あるいは関数個別にタイムアウトやメモリサイズを設定できる。

以下は設定及び実験用コードの例。

serverless.yml(コメントを除いた)

service: hello-world-nodejs
provider:
  name: aws
  runtime: nodejs12.x
  profile: serverless-admin
  region: ap-northeast-1
  memorySize: 128
  timeout: 3

functions:
  hello-short-timeout:
    handler: handler.hello
  hello-long-timeout:
    handler: handler.hello
    memoriSize: 256
    timeout: 6

handler.js

const sleep = msec => new Promise(resolve => setTimeout(resolve, msec));

module.exports.hello = async (event) => {
  await sleep(2000);
  return {
    message: 'おはよう。',
    event,
  };
};

関数のためのIAMユーザーのアクセス許可の変更

  • 関数のアクセス許可を設定するには、serverless.yml を適切に設定します。
  • 以下はすべてのアクセスとすべてのリソースへのアクセスを許可していますが、適切に絞ったほうが良いです。
provider:
  name: aws
  runtime: nodejs12.x
  profile: serverless-admin
  region: ap-northeast-1
  memorySize: 128
  timeout: 3
  iamRoleStatements: <--- こちら以下の設定
    - Effect: "Allow"
      Action:
        - "*"
      Resource:
       - "*"

サービスの削除

以下のものを削除する必要がある。

  • 関数
  • 関数に関わるもの
  • CloudWatchのログ
  • IAMロール
  • フレームワークが作成したその他

次のコマンドでAWS上のもをすべて削除できる。

$ sls remove
Serverless: Getting all objects in S3 bucket…
Serverless: Removing objects in S3 bucket…
Serverless: Removing Stack…
Serverless: Checking Stack removal progress…
………
Serverless: Stack removal finished…