echo("備忘録");

IT技術やプログラミング関連など、技術系の事を備忘録的にまとめています。

【Serverless Framework】簡単デプロイとserverless.ymlの記載について その2

※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を指定しない場合、バケットがデフォルトの名前で新規作成されます。また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関数のみ修正した場合に便利。通常デプロイに比べて、短時間で済む

もちろん、まだまだフォローしきれてない部分もありますので、そこは適宜公式サイトで確認すると、いろいろ理解が深まると思います。

それでは、今回はこの辺で。