Serverless Framework v3新機能のStage Parameters紹介

| 3 min read
Author: noboru-kudo noboru-kudoの画像

2022/1/27にServerless Frameworkのメジャーアップデート(v3)がありました。

CLIの改善以外にそれほど大きな変更はなさそうですが、v3でStage parametersという新たな機能が導入されました。
これをうまく活用することで、環境ごとに異なる設定を簡潔に記述できます。

今回はこのStage parametersを紹介したいと思います。

v2の書き方

#

いろんな方法がありますが、最もシンプルなやり方だと、環境ごとに異なる設定値はcustomセクションに記述します。
TypeScriptで記述すると以下のようになります。関連部分のみ抜粋しています。

const serverlessConfiguration: AWS = {
  service: 'slsv2',
  frameworkVersion: '2',
  custom: {
    // 環境ごとの設定値を用意しておく
    dev: {
      endpoint: 'https://dev-foo.example.com/api/v1',
    },
    staging: {
      endpoint: 'https://staging-foo.example.com/api/v1',
    },
    prod: {
      endpoint: 'https://foo.example.com/api/v1'
    },
  },
  functions: {
    hello: {
      handler: "src/functions/hello/handler.main",
      events: [
        {
          http: {
            method: 'post',
            path: 'hello',
          },
        },
      ],
      environment: {
        // 環境固有値。stageによって切替。存在しない場合はlocalhostにフォールバック
        FOO_API_ENDPOINT: '${self:custom.${sls:stage}.endpoint, "https://localhost:8000/api/v1"}'
      }
    }
  },
};

上記のように、customセクションに環境ごとに異なる値をそれぞれ記述しておきます。
これをLambdaの環境変数にバインドする際には、${self:custom.${sls:stage}.endpoint, ...}のように、ネストした構文で環境ごとの設定値を取得しています。
ここでは1つのみで、それほど複雑ではありませんが、多数の環境固有値を持つとかなり読みにくくなってきます。
また、customにはプラグインの設定なども記述するので、これが何の設定かをコメント等で補足する必要もありました。

これを軽減するには、各envファイルを作成して環境変数化するなど、ひと手間加える必要がありました。

v3からの書き方

#

v3からは、以下のように書き換えることができます。

const serverlessConfiguration: AWS = {
  service: 'slsv3',
  frameworkVersion: '3',
  // v3から導入。ここに環境ごとの設定値を記述する
  params: {
    // どれにもマッチしない場合のデフォルト値
    default: {
      endpoint: "https://localhost:8000/api/v1"
    },
    dev: {
      endpoint: 'https://dev-foo.example.com/api/v1',
    },
    staging: {
      endpoint: 'https://staging-foo.example.com/api/v1',
    },
    prod: {
      endpoint: 'https://foo.example.com/api/v1',
    }
  },
  functions: {
    hello: {
      handler: "src/functions/hello/handler.main",
      events: [
        {
          http: {
            method: 'post',
            path: 'hello',
          },
        },
      ],
      environment: {
        // paramsより取得。どれを取得するかはstageパラメータによってServerless Frameworkが考慮してくれる
        FOO_API_ENDPOINT: '${param:endpoint}',
      }
    }
  },
};

新しく追加されたparamsセクションに、環境ごとの設定値を記述します。
これを環境変数にバインドするときも、${param:endpoint}とv2よりもかなりシンプルになりました。
どの環境の値を設定するかは、stageパラメータ(sls:stage)からServerless Frameworkが判断してくれます。
優先順位ルールについては、以下を参照してください。

まとめ

#

環境(Stage)ごとに異なる値を新しく導入されたparamsセクションに記述することで、より簡潔に環境固有値を参照できました。
まだv3には移行していませんが、移行する際には積極的に活用していきたいですね。

豆蔵デベロッパーサイト - 先週のアクセスランキング
  1. 基本から理解するJWTとJWT認証の仕組み(2022-12-08)
  2. 直感が理性に大反抗!「モンティ・ホール問題」(2022-07-04)
  3. Nuxt3入門(第4回) - Nuxtのルーティングを理解する(2022-10-09)
  4. Nuxt3入門(第8回) - Nuxt3のuseStateでコンポーネント間で状態を共有する(2022-10-28)
  5. Podman Desktopがv1.0になったのでwindows版を試してみたところ、気付いたらv1.1に上がるくらいに機能豊富だった話(2023-06-09)
  6. Nuxt3入門(第1回) - Nuxtがサポートするレンダリングモードを理解する(2022-09-25)
  7. VS Code で .NET MAUI の開発環境を構築する(macOS/iOS)(2023-08-14)
  8. Pytestを使ってみる(その2:VSCode拡張機能編)(2023-03-05)
  9. GitHub Actions - 構成変数(環境変数)が外部設定できるようになったので用途を整理する(2023-01-16)
  10. 統計学で避けて通れない自由度の話(2022-06-20)