かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

AWS CDK で作った Lambda に .env ファイルで環境変数を設定したい

前回までのあらすじ

AWS CDK を使って Lambda 関数をデプロイできるようになりました。

Lambda 関数内で環境変数 (environment variables) を使いたい

AWS コンソールの Lambda から 設定 > 環境変数環境変数を設定することができ、環境変数は Lambda 関数内で process.env から使用することができます。

コンソールから追加した環境変数cdk deploy をするとリセットされてしまう

デプロイの度にコンソールから環境変数を作成するのは非現実的ですし、コードでリソースの設定ができる CDK の思想に反しているように思います。

Stack 内に environment環境変数の設定ができる

Lambda 関数を設定する NodejsFunction のオプションに environment オブジェクト作成する
environment オブジェクトの Key - Value環境変数として設定される

lib/cdk-app-stack.ts

export class CdkAppStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);
    
    const lambda = new NodejsFunction(this, 'lambda', {
      entry: 'src/index.ts',
      handler: 'handler',
      runtime: Runtime.NODEJS_16_X,
      // setting environment variables
      environment: {
        MY_SECRET: '1234567890',
        REGION: cdk.Stack.of(this).region,
      },
    });
  }
}

environment を設定して cdk deploy コマンドでデプロイ
AWS コンソールの Lambda をリロードし環境変数が設定されていればOK

.env ファイルを使って環境変数を設定したい

上記の方法ではコード上に環境変数の値が直接載ってしまうので SECRET 情報などが GitHub に上がってしまったりとセキュリティ上の問題があるので、よくある gitignore された .env ファイルを使って Stack に環境変数を埋め込めると便利そうです。

dotenv を使う

$ npm i -D dotenv

.env ファイルを Git 管理下から外す

.gitignore

+ .env

.env ファイルを作成

MY_SECRET=1234567890

Stack に .env を使って環境変数を設定
lib/cdk-app-stack.ts

+ import * as dotenv from 'dotenv';

+ // .env を読み込み
+ dotenv.config();

export class CdkAppStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);
    
    const lambda = new NodejsFunction(this, 'lambda', {
      entry: 'src/index.ts',
      handler: 'handler',
      runtime: Runtime.NODEJS_16_X,
      // setting environment variables
      environment: {
-       MY_SECRET: '1234567890',
+       MY_SECRET: process.env.MY_SECRET ?? '',
        REGION: cdk.Stack.of(this).region,
      },
    });
  }
}

process.env.MY_SECRETstring | undefined なので ?? (Null 合体演算子) でデフォルト値を設定しておく
これで cdk deploy で再度デプロイ。AWS コンソール > Lambda から環境変数が設定されいれば OK

所感

デプロイをするとコンソール上から作成した環境変数がリセットされるのに最初気づかずにハマってしまいました。
CDK に環境変数を設定するオプションが用意されており、設定方法が JavaScript なので知っている dotenv を使った方法で問題なく環境変数の設定ができてしまったので CDK 便利〜となりました。
AWS ちから高めていきたい。

₍ ᐢ. ̫ .ᐢ ₎ おわり。


[参考]