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
コメント