webtask.io
ServerlessFramework

はじめに

本稿はオープンストリーム Advent Calendar 2017の14日目の記事です。
Serverless Frameworkがいつの間にかWebtaskに対応していたので試してみました。執筆に際しての実行環境はVirtualBox上に構築したCentOS 7サーバですが、Node.js(npm)が使えれば環境的な差異はほとんどないと思われます。

導入

Node.jsのインストール

sudo yum install -y nodejs

Serverless Frameworkのインストール

npm install -y serverless

webtask-nodejsテンプレートを用いてサービスを作成

sls create --template webtasks-nodejs --path my-service

依存ライブラリのインストール

cd my-service
npm install

credentialの初期設定

sls config credentials --provider webtasks

メールアドレスまたは電話番号の入力を求められます。メールアドレスを入力するとWebtask Verification Codeという件名でメールが送信されるので、それに記載されたverification codeを入力します。(電話番号を入力した場合の挙動は未確認)

デプロイと実行

ここまでの手順を行うとテンプレートより設定ファイル(serverless.yml)とソースコード(handler.js)が生成され、デプロイを行うことができるようになります。デプロイ方法は他のプロバイダと変わりはありません。

sls deploy

実行も同様です。テンプレートではmainというファンクションが定義されています。

sls invoke --function main

設定

設定ファイルserverless.confに記述できるWebtaskのための設定は多くありません。
service.nameにはサービス名を指定します。生成された設定ファイルにはwebtasks-nodejsと記載されています。sls create時の--nameオプションを指定した場合はその値が入りそうな気がしましたがそんなことはありませんでした。この値はWebtaskのエンドポイントURLの一部となるため、公開するのであれば意識する必要があります。

provider.environmentに記述した変数群はWebtaskのSecretsとして登録されます。Lambdaの環境変数のようなものです。生成された設定ファイルではコメントアウトされているので、これを有効にすればSecretsに登録されます。

# you can define service wide environment variables here
#  environment:
#    variable1: value1

Lambdaのようにfunctionsに記述することでファンクションごとにSecretsが設定できるかと思いましたが、残念ながら無視されてしまいました。

その他

以下はWebtask特有の挙動はないのでさらっとご紹介します。

ステージ

--stageオプションでステージを指定することができます。本番とステージングなど、複数の環境を構築する場合などに使用します。

ログ

sls logsでログ出力を捕捉することができます。別窓でinvokeと併用するのが定番です。

INFO

sls infoで諸々の情報を出力します。エンドポイントURLを知りたければこのコマンドを使用します。

削除

sls removeで関数(群)を削除します。

余談

さて、いろいろ試しているうちにServerless Frameworkでデプロイした関数がwt-cliに現れないということに気付いてしまいました。CLIだけでなく、オンラインエディタにも居ません。同じメールアドレスでセットアップしたのに不可解な現象です。
結論から言うとプロファイルが分かれていて、ホスティング先が異なっていました。

$ cat ~/.webtask

{
  "default": {
    "url": "https://webtask.it.auth0.com",
    "token": "(秘密)",
    "container": "wt-00112233445566778899aabbccddeeff-0"
  },
  "serverless": {
    "url": "https://sandbox.auth0-extend.com",
    "token": "(秘密)",
    "container": "wt-00112233445566778899aabbccddeeff-0"
  }
}

つまりデフォルトとは別のserverlessプロファイルが作成されていて、Serverless Frameworkからはこのプロファイルが使用されていたということです。
CLIで関数一覧を取得する場合:

wt ls -p serverless

オンラインエディタを開く場合:

wt edit -p serverless

といった風に指定することで解決しました。

所感

Webtaskは使い勝手の良いCLI(wt-cli)が提供されているため、AWS Lambdaほどの必須感はありませんが、やはりServerless Frameworkの恩恵はあると感じました。初期設定さえ済ませてしまえば他のプロバイダとの違いを意識せず画一的に操作できるのが最大の利点だと思います。