Serverless Frameworkを使ってGo言語でStageと環境変数を設定する方法を解説します。
- Serverless FrameworkでStageごとにデプロイする方法
 - Serverless Frameworkで環境変数を設定する方法
 - Go言語で環境変数を呼び出す方法
 
- 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=devENV_NAME=productionServeless.ymlを編集
serverless.ymlにuseDotenv: 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を分けたり、環境変数を指定できると思うのでぜひ使ってみてください!

