※2019/7/1 デプロイ先バケット名を任意の名前にする方法を追記しました。
概要
前回、Serverless Frameworkについて書きましたが、書ききれなかった点があったので、今回はその点についての内容になります。
serverless.ymlで使用できる変数について
Serverless.ymlでは、下記の変数を使用できます。
- 変数は${self;;xxx}のように、「${}」形式で参照します。
- 「custom」項目内に変数名と値のペアを設定することで、独自の変数&値を設定することができます。
- 外部ファイルに定義した変数を使用することもできます。(下記ソース参照)
- 下記変数は、カンマの後に値を指定することで、初期値を設定可能。
記載方法 | 説明 | 備考 |
---|---|---|
${self:xxx} | そのserverless.ymlファイル自身の項目(xxx)を参照する | |
${env:YYY} | 使用しているPCの環境変数(YYY)を参照する | |
${opt:zzz} | deployコマンド実施時に、引数(zzz)に指定された値を参照する | |
${file(aaa):bbb} | 外部ファイル(aaa)に定義した変数(bbb)を参照する | bbbは外部ファイルの変数名。省略した場合、外部ファイルの変数すべてが読み込まれる。 |
${cf:リージョン名.ccc} | 別のCloudFormationの「出力」cccに設定されている値を参照する | 「出力」にはServerless.ymlの「Outputs」で登録可能。 リージョン名は省略可能。その場合、デフォルトのリージョン名が適用される。 |
service: name: makky12-service # 独自の変数を定義する場合、こんな感じでcustom内に定義する。 custom: author: makky12 # 外部ファイルの変数を参照する例。 # exportは外部ファイルの内容をすべて読み込み、export_partnerは外部ファイルの # 特定の変数(partner)の値のみを読み込む。 # またどちらも実際に読み込むファイルは、ルート直下の「--env xxx」で # 指定されたxxxフォルダ内のserverless.ymlファイル。 # 例えば、 deploy --env dev なら、ルート直下の「dev」フォルダ内の # serverless.ymlファイルを参照する。 export: ${(./${opt:env, 'dev'}/serverless.yml)} export_partner: ${(./${opt:env, 'dev'}/serverless.yml):partner} provider: # 環境変数を使用する例。 # 例えば事前にser MY_REGION=ap-northeast-1としていた場合、 # regionにはap-northeast-1が設定される。 region: ${env:MY_REGION} apiName: HogehogeGateway # 例えば、事前にOutputsに下記定義をしたserverless.ymlをデプロイした場合... # resources: # Outputs: # Value: # "Ref": myRestApi # Export: # name: myRestApiId # # restApiIdには、スタック名が「myStack」というCloudFormationの、 # 事前にmyRestApiで定義したAPI GatewayのRestAPI IDが代入される。 apiGateway: restApiId: ${cf:myStack.myRestApiId} # serverless.ymlの変数を使用する方法 functions: myFunction: # この場合、参照先serverless.ymlで下記定義をしていた場合、 # partner: abc # thanksto: xyz # # 実際のdescriptionの出力内容は以下の通りになる。 # author=makky12_partner=abc_thanksto=xyz description: author=${self:custom.author}_partner=${self:custom.export_partner}_thanksto=${self:custom.export.thanksto} myFunction2: # もちろん、serverless framework既定の項目の値を参照することも可能。 description: ApiGateway=${self.provider.apiName}
deploymentBucket記載時の注意
前回「deploymentBucketには、パッケージ化したファイルが格納されるバケット情報を指定する」と記載しましたが、これには一つ問題があり、
という現象があります。(nameを指定しない場合、バケットがデフォルトの名前で新規作成されます。またnameのバケットが既に存在する場合は問題ありません)
これだとバケット名を任意の名前で新規作成できないのですが、下記方法で回避できます。
- npm経由で「serverless-deployment-bucket」モジュールをインストールする
- serverless.ymlの「plugins」に、このモジュールを追加する。(配列で定義する)
- deploymentBucket.nameに、デプロイ先バケットの名前を設定する。
- serverless-deployment-bucketの設定を「custom」に定義する。(下表参照。なおすべて任意項目で、値はすべてbooleanで指定。)
項目名 | 説明 | 初期値 |
---|---|---|
versioning | デプロイ先バケットで、バージョニングを可能にする | false |
enabled | serverless-deployment-bucketを有効にするか | true |
policy | バケットのポリシーをJSONで出力するか(?) | なし(設定しない) |
> npm install serverless-deployment-bucket --save-dev
# オプション項目を設定する場合。(基本、デフォルトで問題ないと思う) custom: enabled: true versioning : true policy: true plugins: - serverless-deployment-bucket provider: deploymentBucket: name: self-custom-bucket-name
【参考】:serverless-deployment-bucket
デプロイのやり方
といっても、デプロイ自体はとても簡単で、サービスのルートフォルダ(serverless.ymlがあるフォルダ)で、「sls deploy」コマンドを実施するだけです。
ただ、いくつか便利なオプションがあります。
オプション名 | 説明 | 備考 |
---|---|---|
--packege(-P) <格納先フォルダのパス> | 関連ファイルのパッケージのみ行い、デプロイはしない | フォルダのパスを省略した場合、serverlessというフォルダを作成し、そこにパッケージ化したファイルを格納する |
--verbose(-v) | デプロイ状況をコンソール上で確認できる | CloudFormationのログに近い。よく使うと思う。 |
--function(-f) <functions:内の定義名> | 定義名のLambda関数のみデプロイし、全体のデプロイは行わない | 一回デプロイ後、Lambda関数のみ修正した場合に便利。通常デプロイに比べて、短時間で済む |
もちろん、まだまだフォローしきれてない部分もありますので、そこは適宜公式サイトで確認すると、いろいろ理解が深まると思います。
それでは、今回はこの辺で。