はじめに
$ sls deploy --stage dev
と実行したら、dev用の環境変数を外部ファイルから参照させるようにしました。
調べたところいくつか方法はあったのですが、色々省略されていてわかりづらかったり、シンプルでなかったりでやりたいことが出来なかったので書くに至りました。
出来るだけ、省略せずに関数をcreateするところから書いてみました
環境
- AWS
- Serverless Framework
- Nodejs
1. 準備
// ディレクトリ作成
$ mkdir lamda-test
// 作業ディレクトリへ移動
$ cd lamda-test
// npm初期化
$ npm init
// serverlessをインストール
$ npm i serverless
2. Lambda関数を作成
LambdaでRubyが使用出来るようになったので、Rubyを使用していきます。
以下のコマンドを実行することで、ランタイム(Lamda関数を定義する言語)にRuby、関数のパスをhoge
として関数を作成出来ます。
$ sls create -t aws-ruby -p hoge
実行後
// 関数のディレクトリへ移動
$ cd hoge
// 作成されたファイルを確認
$ ls
// 結果: handler.rb serverless.yml
handler.rb
とserverless.yml
が作成されます。
3. 環境変数定義用のディレクトリとファイルを作成する
現状のディレクトリ構成は、以下のようになるかと思います。
lambda-test
- hoge/
- handler.rb
- serverless.yml
- node_modules/
- package-lock.json
ここにさらにディレクトリとファイルを作成していきます。
lambda-test
ディレクトリの直下にenv
ディレクトリを作成し、以下のような構造にします。
開発用を
dev
、本番用をprod
のようにしてみました
階層は以下
lambda-test
- hoge/
- handler.rb
- serverless.yml
- node_modules/
- package-lock.json
- env/
- dev.yml
- prod.yml
dev.yml
とprod.yml
を編集します。
それぞれを以下のように編集します。
dev.yml
URL: https://dev.com
prod.yml
URL: https://prod.com
4. serverless.ymlを修正する
service: hoge
provider:
name: aws
runtime: ruby2.5
stage: ${opt:stage, self:custom.defaultStage}
region: ap-northeast-1
custom:
defaultStage: dev
environment:
dev: ${file(../env/dev.yml)}
prod: ${file(../env/prod.yml)}
functions:
hello:
handler: handler.hello
environment: ${self:custom.environment.${self:provider.stage}}
要所を説明します。
-
${opt:stage}
とは、sls deploy --stage dev
のように--stage
オプションで設定した値を使用することが出来ます。第二引数には何も設定されていない場合に使用する値を指定できます。 -
self:custom.defaultStage
で、以下の値を取得しています。
custom:
defaultStage: dev # これ
-
${file(../env/dev.yml)}
という記述は相対パスでymlファイルを参照させています
5. Lambda関数内で環境変数を呼び出す方法
普段Rubyを書く人には慣れたように、以下のようにすれば参照出来ます。
ENV['URL']
6. 動作検証
動作検証のために、handler.rb
を以下のように編集します。
require 'json'
def hello(event:, context:)
#{ statusCode: 200, body: JSON.generate('Go Serverless v1.0! Your function executed successfully!') }
puts ENV['URL']
end
保存し、コマンドを実行していきます。
$ sls invoke local -f hello --stage dev
// 結果: https://dev.com
// null
$ sls invoke local -f hello --stage prod
// 結果: https://prod.com
// null
// --stageオプション無しだと、devが呼ばれるようになっています。
$ sls invoke local -f hello
// 結果: https://dev.com
// null
と表示されるかと思います。
以上です。