サイト名変更・お引越しのお知らせ

【Go】Serverless FrameworkでStageと環境変数を設定する方法を解説

Serverless Frameworkを使ってGo言語でStageと環境変数を設定する方法を解説します。

この記事でわかること
  • Serverless FrameworkでStageごとにデプロイする方法
  • Serverless Frameworkで環境変数を設定する方法
  • Go言語で環境変数を呼び出す方法

補足

本記事内ではAPI GatewayのREST APIではなく、HTTP APIを使っています。

参考: REST API vs HTTP API

バージョン
  • serverless 3.27.0
  • go 1.18.2

環境を作る方法についてはこちらで解説していますのでよかったらみて見てください!

【Go】Serverless FrameworkでAPI Gateway・Lambdaを作成しAPIを構築する方法を解説

補足

serverlessというコマンドは、slsというエイリアスを使って置き換えることもできるので、皆さんのお好きな方を使ってください。

本記事内では、serverlessの方に統一しています。

Stageを設定する方法

ここのStageとはステージング環境や本番環境のことを指します。

Stageの設定はとてもシンプルで、下記のように--stageオプションを指定するだけです。(省略して-sでも可。)

$ serverless deploy --stage [stage名]

例えば、--stage staging--stage productionのように指定します。

デプロイ結果

デプロイするとこんな感じでAPI GatewayにStageごとのAPIが作られます。

何も指定しないとdevというStage名になります。

参考: 公式ドキュメント

環境変数の設定

続いてStageごとに環境変数を設定する方法を解説します。

.envを使う方法

https://www.serverless.com/framework/docs/environment-variables

.envを使って環境変数を設定できます。

.envファイルを作成

.env.[stage名]のようにするとStageごとに環境変数を指定できます。

該当するファイルがない場合は、.envファイルを読んでくれます。

ENV_NAME=dev
ENV_NAME=production

Serveless.ymlを編集

serverless.ymluseDotenv: trueを追加します。

service: go-serverless-sample

frameworkVersion: "3"

useDotenv: true

provider:
  name: aws
  runtime: go1.x
  region: ap-northeast-1

...

Serveless.ymlにenvoriomentを追加

service: go-serverless-sample

frameworkVersion: "3"

useDotenv: true

provider:
  name: aws
  runtime: go1.x
  region: ap-northeast-1
  environment:
    ENV_NAME: ${env:ENV_NAME}

functionごとに設定することも可能です。

functions:
  hello:
    handler: bin/handlers/hello
    events:
      - httpApi:
          path: /hello
          method: get
    environment:
      ENV_NAME: ${env:ENV_NAME}

Handlerから環境変数を呼び出す

os.Getenv("環境変数KEY")の形で呼び出すことができます。

package main

import (
	"bytes"
	"context"
	"encoding/json"
	"os"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

type Response events.APIGatewayProxyResponse

func Handler(ctx context.Context) (Response, error) {
	var buf bytes.Buffer

	body, err := json.Marshal(map[string]interface{}{
		"message": "Hello World from " + os.Getenv("ENV_NAME"),
	})
	if err != nil {
		return Response{StatusCode: 404}, err
	}
	json.HTMLEscape(&buf, body)

	resp := Response{
		StatusCode:      200,
		IsBase64Encoded: false,
		Body:            buf.String(),
		Headers: map[string]string{
			"Content-Type": "application/json",
		},
	}

	return resp, nil
}

func main() {
	lambda.Start(Handler)
}

モグモグさん

これでLambda関数を叩くと、環境変数が取得できていることがわかります!

dev: {"message":"Hello World from dev"}

production: {"message":"Hello World from production"}

Parametersを使う方法

Parametersを使うことでStageごとに環境変数を設定できます。

service: go-serverless-sample

frameworkVersion: "3"

params:
  prod:
    domain: myapp.com
  dev:
    domain: preview.myapp.com

provider:
  environment:
    APP_DOMAIN: ${param:domain}

その他の方法

主要な2つ以外にもいくつか方法がありますので、公式ドキュメントを確認ください。

モグモグさん

より柔軟に、ユースケースにあった方法が見つかると思います!

まとめ

Serverless Frameworkを使ってGo言語でStageと環境変数を設定する方法を解説しました。

簡単にStageを分けたり、環境変数を指定できると思うのでぜひ使ってみてください!