Lambdaの環境変数を使用しようと思うと色々と工夫が必要になります。
私なりの環境変数の管理方法をメモしておきます。
利用環境
- nodejsでLambda関数を構築
- 実際のLambda関数にはAmplifyでデプロイ
- ローカルではjestでテスト
試行錯誤した結果、結果的に以下のような構成にしています。
Amplifyでの環境変数利用
amplify add functionでLambda関数を作成する際に環境変数の設定が可能です。
設定した環境変数は基本的にprocessで取得可能になります。
const parameter = process.env.PARAMETER
また、SSMに暗号化させて保存することもできます。
その場合はaws-cdkを用いて取得する必要があります。
import { SSMClient, GetParameterCommand } from "@aws-sdk/client-ssm"
const config = { region: "ap-northeast-1" }
const client = new SSMClient(config)
const input = {
Name: "PARAMETER_NAME",
WithDecryption: true,
}
const command = new GetParameterCommand(input)
const response = await client.send(command)
このようにAmplifyを利用すれば、商用環境とテスト環境で環境変数を使い分けることが可能です。
jestでテストするときにどうするか?
しかし、amplifyでデプロイする前にローカルでjestを利用して単体テストを行おうと思うとAmplifyで設定した環境変数はjest利用時には読み込まれません。
そのため、jest起動前に都度環境変数をprocess.envに設定してあげる必要があります。
これについてはこちらの記事を参考にしながらjest.config.jsを設定し、テスト前にスクリプトを起動するようにしました。
また、jestでテストする際は自動的にprocess.env.NODE_ENVに'test'が設定されますので、単体テスト時のみに何かしらの処理を行いたい場合に利用できます。
if(process.env.NODE_ENV == 'test'){
// 単体テスト時にのみ行いたい処理、例えば・・・
console.log('debug・・・')
}
これでjest利用時も環境変数を利用できます。
まとめ
以上の方法でAmplify,jestを利用して環境変数をコントロールできるようになりました。
Lambda関数の開発はまだまだベストプラクティスが確立されていないようで色々工夫が必要そうです。
