50
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Serverless Frameworkでstage毎に外部ファイルから環境変数を参照させる

Last updated at Posted at 2019-01-22

はじめに

$ 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.rbserverless.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.ymlprod.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

と表示されるかと思います。
以上です。

50
19
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
50
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?