※2019/6/27 Outputs項目に関する記載を追加しました。
※2019/6/27 さらにapiKeys/usagePlan/private項目に関する記載を追加しました。
概要
近日、仕事でAWSを触っていますが、その関係でServerless Frameworkを触ることになりました。
公式サイト:Serverless Framework
Serverless FrameworkはSAM同様、サーバーレスアプリ開発のフレームワーク(正確にはテンプレートモデルに近い。Webアプリなどのフレームワークとはちょっと違う)CLIで、以下のことを行うことができます。
- 環境(言語)ごとのテンプレートモデルの適用
- 使用するリソース(Lambda、S3、DymnamoDBなど)の定義
- コマンドライン上からの一括デプロイ(CloudFormationへの展開)
また、主に下記の点がSAMと異なります。
があります。
ただ、公式ドキュメントが全編英語で、解説してるサイトもあまり多くなかったので、自分なりに「とりあえずデプロイ」できるところまでをまとめました。
インストール &プロジェクト作成
インストールは公式サイトのトップにもある通り、npm installをするだけです。(「-g」は必要に応じて置き換えてください。)
npm install -g serverless
プロジェクト作成は「serverless create」コマンドで作成します。
- テンプレート名は言語別のテンプレート名。「aws-nodejs」「aws-python3」「aws-csharp」など。(詳細は公式ページを参照)
- サービス名はアプリのプロジェクト名(≒アプリ名)。Serverless Frameworkでは「サービス」という扱いになる。
- プロジェクトフォルダのパスはオプション。このフォルダがない場合、プロジェクト作成時に自動で作成して、そこをプロジェクトのルートにしてくれる。
# 「sls」は「serverless」の省略系。どちらでも実行可。 sls create --template (テンプレート名) --name (プロジェクト名) --path (プロジェクトフォルダのパス) # e.g. sls create --template aws-nodejs --name makky12-serverless-fw-app --path makky12-dir
テンプレートファイル(serverless.yml) の定義
※これ以降は、AWSをベースに説明します。(それ以外の場合は、公式ドキュメントを参照)
serverless.ymlは、デプロイされるサービスの定義を行うファイルです。
(SAMのtemplate.ymlに該当)
つまりこの内容が、CloudFormationやLambdaなどの各種機能に設定されます。
ただこの公式ドキュメントのボリュームが大きいので、補足説明がいるなという項目だけ説明します。
(基本的なことは、公式の下記ページに書いてあります。全編英語ですが)
※プロジェクトに最初から入ってるhandler.jsを動かすだけなら、下記を設定してデプロイを実施するだけで、API Gateway経由でブラウザ実行できます。
(項目数は多いですが、ほとんどにデフォルト値が設定されてます。)
- providerに「region: ap-northeast-1」を設定する。
- 66 ~ 69行目(「events」~「method:get」)までのコメントを外す
ルート項目(インデントがない項目)
| 項目名 | 説明 | 備考 |
|---|---|---|
| provider | 複数項目で共通で使用する項目の値を設定する | 項目別に上書き可能 |
| custom | serverless.yml内で使用する変数と値のペアを設定する | 変数については後述 |
| package | プロジェクトをパッケージする際の設定をする | |
| plugins | 外部プラグインを使用する場合、プラグイン名を記入する | 公式に書いてないんだけど... |
| functions | Lambda関数の設定をする | |
| resources | プロジェクトで使用するリソース(S3/DynamoDBなど)の設定をする |
provider項目
| 項目名 | 説明 | 備考 |
|---|---|---|
| stage | dev(開発)/stg(ステージング)など、環境が分かる設定をする | 初期値はdev |
| 〇〇name | CloudFormation/API Gatewayなどで使用される名前 | 未指定の場合、デフォルト名がつけられる(プロジェクト名+αなど) |
| apiKeys | 作成するAPIKeyの名前を指定する | 配列で指定する |
| usagePlan | 使用量プランの定義を指定する | apiKeysに指定したAPIKeyに紐づく使用量プランとして登録される。 (なぜか)usagePlanName(使用量プラン名)は指定できない。(resourcesだと指定可能) |
| profile | credentialを定義済の場合、そのプロファイル名を指定する | デプロイの際、設定したプロファイルの認証情報を使用する |
| deploymentBucket | パッケージされたファイルを格納するS3のバケット名を指定する | 注意が必要。(後述) |
| role | 全Lambda関数に適用される共通のIAMロールを設定する | |
| iamRoleStatements | Lambda関数以外のリソース(S3/DynamoDBなど)のIAMロールの設定をする | |
| environment | Lambda関数の環境変数と値のペアを設定する |
package項目
| 項目名 | 説明 | 備考 |
|---|---|---|
| include/exclude | パッケージされるファイルとして含めたい/除きたいファイルを指定 | ワイルドカードによる再帰的指定可能。tsconfig.jsonの同盟項目と同じ |
| excludeDevDependencies | excludeDevDependenciesのモジュールを自動で除外するか | デフォルトはtrue |
| artifact | 自分でパッケージをする際のパッケージファイルの置き場? | include/exclude設定関係なく、deploy時にパッケージファイルから除外される |
| individually | Lambda関数単位でのパッケージを行うかどうか |
functions項目
※functionsの子要素には、デプロイされるLambda関数のfunction名を記載する。下記はその子要素(functionsの孫要素)
| 項目名 | 説明 | 備考 |
|---|---|---|
| handler | 実行する関数。[ファイル名.exports名]形式で記載 | |
| events | Lambda関数を実行するトリガーとなるイベントの種類 | http(API Gateway)/s3/Alexa Skillなど |
| reservedConcurrency | この関数を同時並行で実行できる数? | |
| environment | この関数に定義する環境変数と値のペア |
resources項目
※resources要素には「Resources」-「リソース定義名」までは決め打ちになる。(「serverless.ymlのサンプル」参照)
下記は「リソース定義名」の子要素になる。(=resourcesのひ孫要素)
※Propertiesの子要素は、Typeごとに異なる。CloudFormationのテンプレートを参照。
| 項目名 | 説明 | 備考 |
|---|---|---|
| Type | リソースのタイプ。DynamoDB/S3など [ファイル名.exports名]形式で記載 | AWS::S3::Bucketのように、CloudFormation形式で記載 |
| Properties | リソースタイプ別の詳細設定 | S3ならバケット名など。(設定項目はリソースにより異なる) |
Outputs項目
※Outputsの子要素には、Output項目の定義名を指定する。下記はその子要素になる。(=Outputsの孫要素)
※Outputsに定義した項目はCloudformationの「出力」に登録され、別のCloudFormationテンプレイートファイルから参照することができる。
※もちろん別のserverless.ymlファイルからも参照することが可能。(詳細はその2で記載予定)
| 項目名 | 説明 | 備考 |
|---|---|---|
| Value | 他の定義で参照させたいリソース、プロパティなどの情報。 | Ref, Fn::GetAttなど、参照を使用して設定することが可能 |
| Export | 他の定義から参照する際に使用する名前(≒エイリアス) | 「Name」プロパティに設定する |
| Description | この定義についての説明 |
serverless.ymlのサンプル
app: makky12-serverless-app
# You can pin your service to only deploy with a specific Serverless version
# Check out our docs for more details
frameworkVersion: ">=1.0.0"
custom:
author : makky12
provider:
name: aws
runtime: nodejs10.x
stage: dev
region: ap-northeast-1
stackName: makky12-serverless-app
apiName: makky12-serverless-app-dev
deploymentBucket:
name: makky12-serverless-app-dev-bucket
serverSideEncryption: AES256
deploymentPrefix: makky12
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"
- "/*"
package:
exclude:
- exclude-dir/readmme.txt
functions:
greeting:
handler: handler.greeting
events:
# httpはAPI Gatewayがトリガになるイベント。
# corsはクロスオリジン制約に関する設定。
# privateにtrueを設定すると、APIキーの指定が必須になる。(x-api-key)
- http:
path: users/create
method: get
cors: true
private: true
environment:
NENGO: Reiwa
resources:
Resources:
makky12Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: makky12-bucket
makky12Table:
Type: AWS::DynamoDB::Table
Properties:
TableName: makky12Table
AttributeDefinitions:
- AttributeName: e-mail
AttributeType: S
KeySchema:
- AttributeName: e-mail
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
Outputs:
MyWebHookUrl:
Description: The Url of the Custom WebHook
Value:
"Fn::GetAtt": [ myWebHook, Url ]
Export:
Name: myWebHookUrlVal
と、なんか書いてたらものすごく長くなってしまいましたので、本当はデプロイやserverless.ymlの変数仕様についても書く予定だったのですが、それはその2に書きます。