serverless frameworkによるAWS Lambdaの実践的デプロイ

モバイルアプリサービス部の五十嵐です。

まえがき

以前のserverless framework(当時はJAWS)は独自の仕組みで環境変数のような機能をサポートしていましたが、AWS Lambdaに環境変数がサポートされるようになり、serverless frameworkも設定ファイルに環境変数を設定できるようになりました。

また、serverless frameworkになってからは設定ファイル内で変数が使えるようになり、変数とデプロイコマンドの引数を組み合わせることにより、柔軟なデプロイ設定が可能になりました。

これらのアップデートにより、ようやく実際の開発で使えるデプロイツールになったなと感じています。本記事では、ステージング環境・本番環境など環境毎に適切なデプロイ設定をする方法を紹介します。

環境

  • serverless framework 1.4

Credentialsの切り替え

ステージング環境・本番環境など環境毎に「AWSアカウントが異なる場合」や「デプロイに必要なロールが異なる場合」に以下のように設定することでデプロイ時に使用するCredentialsを切り替えることができます。

provider:
  name: aws
  region: ap-northeast-1
  runtime: nodejs4.3
  stage: ${opt:stage, self:custom.defaultStage}
  profile: ${self:custom.profiles.${self:provider.stage}}

custom:
  defaultStage: dev
  profiles:
    dev: sample_dev
    prd: sample_prd

上記の例は公式ドキュメントで紹介されている例とほぼ同様です。

provider.profile にプロファイル名を指定することで ~/.aws/credentials のプロファイルを使うことができます。上記の例ではさらに custom.profiles. にプロファイル名を設定しています。どちらのプロファイル名を使うかは provider.stage の値によって決まります。 provider.stage は deployコマンドのオプションで --stage に設定された値があればそれが設定され、無ければ custom.defaultStage の値が設定されるようになっています。

設定ファイル内での変数の利用方法について、より詳しくは公式のドキュメントを参照してください。

AWS Lambdaの設定の切り替え

やっていることはCredentialsの切り替えとほぼ同じですが、AWS Lambdaの設定の切り替えの例としてAWS LambdaをVPC内で起動する際に設定するVPCを設定する方法を紹介します。

custom:
  vpc:
    dev:
      securityGroupIds:
        - sg-xxxxxxxx
      subnetIds:
        - subnet-11111111
        - subnet-22222222
    prd:
      securityGroupIds:
        - sg-yyyyyyyy
      subnetIds:
        - subnet-33333333
        - subnet-44444444

functions:
  sample:
    handler: sample.handler
    vpc: ${self:custom.vpc.${self:provider.stage}}

上記の例では functions.sample.vpc を変数にしました。このように変数には複数の値やネストした値を設定することもできます。

AWS Lambdaの環境変数の切り替え

こちらもやっていることはCredentialsの切り替えとほぼ同じです。serverless frameworkでは全functionに共通して設定する環境変数と、function毎に設定する環境変数を設定することができます。

provider:
  environment:
    SOME_VAR: 0

custom:
  sample:
    environment:
      dev:
        SOME_VAR: 1
      prd:
        SOME_VAR: 2

functions:
  sample:
    handler: sample.handler
    environment: ${self:custom.sample.environment.${self:provider.stage}}

上記は説明用の例ですが、 provider.environment が全functionに設定される環境変数、 functions.*.environment がfunction毎に設定される環境変数となります。全functionに設定される環境変数より、function毎に設定される環境変数の方が優先されるため、この設定ファイルでデプロイするとSOME_VARには1または2が設定されます。

環境変数を扱う上での注意点としては、CLIやAWS ConsoleからAWS Lambdaの環境変数を設定した上で設定ファイルに環境変数を設定すると、デプロイ時に 設定ファイルにない環境変数は削除 されてしまいます。CLIやAWS Consoleからは環境変数を設定しないようにしましょう。(理解した上で一時的に変更したいだけなら良いですが。)

デプロイ

各種設定の切り替えはdeployコマンドの stageオプションにより行うことができます。

$ sls deploy              # dev環境へのデプロイ
$ sls deploy --stage prd  # prd環境へのデプロイ

まとめ

1年前にserverless framework(当時はJAWS)について調べて発表した時は、実務で使うにはまだ色々と足りてないと感じていましたが、今は十分に実務で使えるだけの機能がサポートされ、実際に実務でも使ってもいます。

今年も引き継きサーバレス界隈をウォッチしつつ実務に取り入れて行きたいと思います!