[Serverless Framework] JSONのネストされたオブジェクトの値をserverless.ymlの変数として取得してみる

どうも!大阪オフィスの西村祐二です。

今回は超小ネタです。

環境ごとに変数を切り替えたい場面があると思います。

変数の扱い方は下記のドキュメントにかかれていますが、今回のやりたいことは明確には記載されていなかったので、備忘録兼ねて、ブログにしておきます。

https://serverless.com/framework/docs/providers/aws/guide/variables/

やりたいこと

外部のjsonやyamlファイルから、下記のようにすることで変数として取得できるよ、というのはよく見かけますが、

.
.
.
  environment:
    VARIABLE: ${file(./variables.json):KEY}
.
.
.

{
    "KEY": "value"
}

今回やりたいことは、下記のようにネストされたオブジェクトのKEY2の値のvalue2を変数として取得するということをやってみます。

{
    "KEY": {
        "KEY2": "value2"
        }
}

JSONのネストされたオブジェクトの指定方法

「.」で指定することができます。

(知ってしまえば簡単ですが、検索してもあまりヒットしなかったので、少しハマってしまいました。)

具体的には下記のようにKEY.KEY2のように階層を降りるごとに「.」をつなげていくことでネストされたオブジェクトの値を取得することができます。

.
.
.
  environment:
    VARIABLE: ${file(./variables.json):KEY.KEY2}
.
.
.

{
    "KEY": {
        "KEY2": "value2"
        }
}

sls printで確認すると変数のところに>-が記載されていますが、これは改行を半角スペースに置き換え、最終行の改行を取り除くという意味のyamlの記法になります。

どういう場面で使う?

環境ごとに変数が変わるところでjsonの構造を環境名でネストさせて、それを参照する形にして使うと良いと思います。

{
    "API_ENDPOINT": {
        "itg": "itg-endpoint",
        "stg": "stg-endpoint",
        "prd": "prd-endpoint"
    },
    "TABLE_NAME": "hoge"
    .
    .
    .
}

また、下記のにするとコマンドの引数で、ネストされた構造でも参照する環境変数を切替えることができます。

.
.
.
provider:
.
.
.
  environment:
    API_ENDPOINT: ${file(./variables.json):API_ENDPOINT.${self:custom.env}}
.
.
.
custom:
  env: ${opt:env, 'itg'}
.
.
.

環境ごとにファイルを用意するのではダメ?

はじめ、itg-variables.jsonのように環境ごとにそれぞれ分けていましたが、意外と共通して使う環境変数も多く、同じ値をそれぞれのファイルで記載するということがありました。さらに、環境変数が増えたら、それぞれのファイルに追記して回らないといけなくて、スマートではないなと思っていました。

そこで、上記のように環境ごとで変数が変わるところでネストさせ参照させることで、一つのファイルにまとめることができ、共通部分を重複して記載することもなくなるので良いのではと思ったのが今回の動機です。

さいごに

JSONのネストされたオブジェクトの値をserverless.ymlの変数として取得する方法について記載しました。

検索しても意外とヒットしなかったので、ブログにしておきました。

誰かの参考になれば幸いです。