サナギわさわさ.json

サナギさんとキルミーベイベーとプログラミングが好きです

Serverless Framework V.1 Alphaのかなり丁寧なチュートリアル

サーバーレスアーキテクチャという言葉を聞くようになってしばらく経ちました。 サーバーレスアーキテクチャに関しては以下の記事が非常に綺麗なのでそちらをご覧ください。

サーバーレスアーキテクチャという技術分野についての簡単な調査 - Qiita

サーバーレス・アーキテクチャの話 - yoshidashingo

個人的にも、サーバーを一番簡単に建てる方法はサーバーを建てない事で、サーバーを一番簡単に管理する方法もサーバーを建てない事だと思っているので、サーバーレスアーキテクチャは使えるところでは使っていきたいです。(パフォーマンスが求められる部分ではまだ厳しいですが)

というわけで、Serverless Frameworkが 先日V.1 Alphaをリリースしたようなので試してみます。AWSアカウントの準備から行っているので、既にある程度の知識がある方にとっては冗長な記事になっているかと思います。ご容赦ください。

また、AWSの無料枠(アカウント開設後1年間有効)を持っている方でしたら本記事の内容を全て試してもお金はかからないはずです。

Serverless Frameworkとは

AWS Lambdaを主に活用してサーバレスなアプリケーションサービスを構築するためのフレームワークです。今後はGoogle Cloud Functions, Microsoft Azure,IBM OpenWhiskなどにも対応していくとの事です。Serverless Frameworkってまさにそのままの名前付けられるのも先駆者の特権というやつでしょうか。

blog.serverless.com

環境

  • OSX 10.11
  • Serverless V.1 Alpha

事前準備

本当に1からやるので、ほとんどの方は飛ばしていただいて大丈夫だと思います。

AWSアカウント作成

以下を参考にして行ってください。面倒くさいかもしれませんが、二段階認証と請求情報のアラームは絶対に設定しておきましょう。

AWS アカウント作成の流れとポイント | AWS

AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ - Qiita

IAMユーザ作成

https://console.aws.amazon.com/iam/home#usersからServerless Frameworkが使用するためのIAMユーザーを作成します。アクセスキー・シークレットキーを安全な場所に保管しておいてください。

※公式のTutorialでは簡易化のため作成したユーザーにAdministratorAccessのポリシーを付けていますが、本番で使う時は適切な権限だけをつけるようにしてください。

AWS CLIインストール

AWS CLIをインストールします。インストール済みの方はスキップでOKですが、公式では[default]にServerless Frameworkが使用するIAMユーザーを設定するよう推奨していますので、そこだけ設定を変更したほうが良いかもしれません。

serverless/provider-account-setup.md at v1.0 · serverless/serverless · GitHub

We'd recommend to create a default AWS profile on your local machine as Serverless uses this as a default which makes developing a lot faster and easier.

$ sudo pip install awscli --ignore-installed six
$ aws configure # 先ほど作成したIAMユーザのアクセスキーを入力
AWS Access Key ID [None]: xxxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxxx
Default region name [None]: us-west-2
Default output format [None]: ENTER

$ cat ~/.aws/credentials
[default] #ここがServerless FrameworkのIAMになっていること推奨
aws_access_key_id = xxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxx

[user_2]
aws_access_key_id = xxxxxxxxxxxx
aws_secret_access_key = Fxxxxxxxxxxxx

node環境構築

Serverless Frameworkのインストールにnpmが必要なので、node環境を構築します。 nodeはnodebrewを使って管理しますが、OSX 10.11ではnodebrewはhomebrewでインストールすると正常に動かないので注意してください。公式に従ってcurlを使ってインストールしましょう。

GitHub - hokaccha/nodebrew: Node.js version manager

$ curl -L git.io/nodebrew | perl - setup

~/.bash_profileに以下を追加

export PATH=$HOME/.nodebrew/current/bin:$PATH

設定を反映

$ source ~/.bash_profile

nodebrewを使ってnodeの安定版をインストール(今回はv6.3.0)

$ nodebrew install-binary stable
fetch: http://nodejs.org/dist/v6.3.0/node-v6.3.0-darwin-x64.tar.gz
######################################################################## 100.0%
Install successful

インストールされたバージョンを使うように設定

$ nodebrew ls
v6.3.0

current: none

$ nodebrew use v6.3.0
use v6.3.0

$ node -v
v6.3.0

一応npmもupdateしておく。

$ npm install -g npm 
$ npm --version
3.10.5

Serverless Frameworkインストール

事前準備が終わったので、実際にServerless FrameworkをインストールしてHello Worldを行ってみます。ここからは公式のセットアップ手順に従って行います。

インストール自体はコマンド1つ打つだけで完了します。

$ npm install -g serverless@alpha
$ sls --help
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v1.0.0-alpha.1
 -------'

プロジェクト作成

$ sls create --name first-service --provider aws
Serverless: Creating new Serverless service...
Serverless: Successfully created service "first-service"
Serverless:   |- serverless.yaml
Serverless:   |- serverless.env.yaml
Serverless:   |- handler.js

設定ファイル書き換え

公式のドキュメントを参考にして設定ファイルを書き換えます。今回はランタイムをnodejs4.3で、HTTP経由でアクセスできるようにします。

serverless.yaml

service: first-service
provider: aws
runtime: nodejs4.3
defaults: # overwrite defaults
    stage: dev
    region: ap-northeast-1
    memory: ${memoryVar} # reference a Serverless variable
    timeout: 30
functions:
    hello:
        handler: handler.hello
        events:
            - http:
                path: greet
                method: get

serverless.env.yaml

vars:
memoryVar: 256
stages:
    dev:
        vars:
        regions:
            ap-northeast-1:
                vars:

デプロイ

設定ファイルを変更したらデプロイします。

$ sls deploy
Serverless: Creating Stack...
Serverless: Checking stack creation progress...
Serverless: Stack successfully created.
Serverless: Zipping functions...
Serverless: Uploading zip files to S3...
Serverless: Adding function resources to CF...
Serverless: Updating Stack...
Serverless: Checking stack update progress...
Serverless: Deployment successful!

デプロイが成功したら、AWSのコンソールにアクセスして確認してみます。 LambdaのコンソールとAPI Gatewayのコンソールにアクセスして、実際に登録されていればOKです。

Lambdaコンソール

f:id:kakakazuma:20160716162603p:plain

API Gatewayコンソール

f:id:kakakazuma:20160716162719p:plain

最後に実際にHTTP経由でアクセスできるかどうか確認してみます。きちんと結果が返ってきますね!

$ curl https://xxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/greet
{"message":"Go Serverless v1.0! Your function executed successfully!","event":{"body":{},"method":"GET","headers":{...}}

終わり

以上でServerless Frameworkのチュートリアルは終了です。AWS LambdaとAPI Gatewayを手動で連携させようとするとかなり面倒くさいので、個人的には非常に良い感じです。 今後も使えるところでは是非使っていきたいと思います。