Serverless Frameworkでデプロイ環境ごとに環境変数や設定を分ける(AWS Lambdaで利用するEFSの設定を環境ごとに分ける)

技術備忘録

Serverless Frameworkで開発時に、ステージング環境と本番環境ごとに環境変数やAWS内の設定を分けたいということがよくあると思います。今回は簡単に環境を分けてAWS LambdaのAPIをデプロイする方法について説明します。

以下の例では環境ごとに使用する環境変数だけでなく、EFSを使用するときのVPC等のAWS上の設定も環境ごとに分けてServerless Frameworkでデプロイします。

スポンサーリンク

serverless.ymlの設定方法

serverless.ymlの書き方を一部抜粋すると以下の通りになります。

環境変数の分離についてはこちらを参考にしました。

...
functions:
  hello:
    handler: handler.hello
    environment: ${self:custom.environment.${self:provider.stage}} # 使用する環境変数の指定(custom内で指定)
    ...
    vpc:
      securityGroupIds:
        - ${file(env/${opt:stage, self:custom.defaultStage}.yml):SECURITY_GROUP_ID} # env/dev.ymlのSECURITY_GROUP_IDという変数を参照
      subnetIds:
        - ${file(env/${opt:stage, self:custom.defaultStage}.yml):SUBNET_ID_0}
        - ${file(env/${opt:stage, self:custom.defaultStage}.yml):SUBNET_ID_1}
        - ${file(env/${opt:stage, self:custom.defaultStage}.yml):SUBNET_ID_2}
    fileSystemConfig:
      localMountPath: ${file(env/${opt:stage, self:custom.defaultStage}.yml):EFS_MOUNT_PATH}
      arn: ${file(env/${opt:stage, self:custom.defaultStage}.yml):EFS_ARN}
...
custom:
  defaultStage: dev
  environment:
    dev: ${file(env/dev.yml)}
    staging: ${file(env/staging.yml)}
    prod: ${file(env/prod.yml)}

${opt:stage, self:custom.defaultStage}ではstageを指定した場合は指定したものを、指定しなかった場合はdefaultStage (上記例ではcustom.defaultStageであるdev)が使用されるという意味です。

スポンサーリンク

環境ごとのファイルの作成

serverless.ymlと同じフォルダにenvフォルダを作成し、dev.yml, staging.yml, prod.ymlを環境に合わせてそれぞれ作成します。

# env/dev.yml, staging.yml, prod.ymlを下記のように作成

ENV_1: XXXXXXXX
SECURITY_GROUP_ID: sg-YYYYYYYYY
SUBNET_ID_0: subnet-YYYYYYYY0
SUBNET_ID_1: subnet-YYYYYYYY1
SUBNET_ID_2: subnet-YYYYYYYY2
EFS_MOUNT_PATH: /mnt/efs-path
EFS_ARN: arn:aws:elasticfilesystem:ZZZZZZZZZZZZZZZZZZZZZZZZ
スポンサーリンク

実行方法

環境を分ける場合は–stageキーを指定してデプロイします。

(デフォルトではdevを使用) sls deploy
(staging環境) sls deploy --stage staging
(本番環境) sls deploy --stage prod

コメント

タイトルとURLをコピーしました