前回までのあらすじ
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_SECRET
は string | undefined
なので ??
(Null 合体演算子) でデフォルト値を設定しておく
これで cdk deploy
で再度デプロイ。AWS コンソール > Lambda から環境変数が設定されいれば OK
所感
デプロイをするとコンソール上から作成した環境変数がリセットされるのに最初気づかずにハマってしまいました。
CDK に環境変数を設定するオプションが用意されており、設定方法が JavaScript なので知っている dotenv を使った方法で問題なく環境変数の設定ができてしまったので CDK 便利〜となりました。
AWS ちから高めていきたい。
₍ ᐢ. ̫ .ᐢ ₎ おわり。
[参考]