AWS CDKでLambda関数の環境変数にS3バケット名を設定してみた
こんにちは!製造ビジネステクノロジー部の小林です。
Lambda関数の環境変数を利用すると、様々な値を変数に保存できます。今回はAWS CDKを利用して、Lambda関数の環境変数にS3バケット名を保存して利用する検証を行いました。
AWS CDKでは、S3コンストラクトで作成したバケット名を、Lambdaコンストラクトの環境変数として簡単に渡すことができます。
Lambda関数の環境変数とは?
Lambda関数の環境変数は、関数のコードを変更せずに動作を調整できる便利な機能です。環境変数を使用することで、以下のようなメリットがあります。
- 設定の外部化: データベース接続文字列、APIキー、バケット名などをコードから分離できる
- 環境ごとの切り替え: 開発、ステージング、本番環境で異なる値を簡単に設定できる
- セキュリティ: 機密情報をコードにハードコーディングする必要がない
今回は、S3バケット名を環境変数として設定し、Lambda関数から利用する方法を実装していきます。
プロジェクト構成
今回は以下のようなディレクトリ構成でプロジェクトを作成します。
cdk-lambda-environment/
├── bin/
│ └── cdk-lambda-environment.ts
├── lib/
│ ├── cdk-lambda-environment-stack.ts
│ └── constructs/
│ ├── s3/
│ │ └── index.ts
│ └── lambda/
│ └── index.ts
├── lambda/
│ └── handler.ts
└── package.json
S3コンストラクトの作成
S3バケットを作成するコンストラクトを実装します。
lib/constructs/s3/index.tsを作成します。
import * as cdk from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
import { Construct } from 'constructs';
export class S3Construct extends Construct {
// 他のコンストラクトから参照できるようにpublicで公開
public readonly bucket: s3.Bucket;
constructor(scope: Construct, id: string) {
super(scope, id);
// S3バケットを作成
const bucket = new s3.Bucket(this, 'Default', {
});
// 作成したバケットをプロパティに設定
this.bucket = bucket;
}
}
Lambdaコンストラクトの作成(環境変数なし)
次に、Lambda関数を作成するコンストラクトを実装します。まずは環境変数を設定せずに作成してみます。
lib/constructs/lambda/index.tsを作成します。
import * as cdk from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as nodejs from 'aws-cdk-lib/aws-lambda-nodejs';
import { Construct } from 'constructs';
export class LambdaConstruct extends Construct {
// 他のコンストラクトから参照できるようにpublicで公開
public readonly lambdaFunction: nodejs.NodejsFunction;
constructor(scope: Construct, id: string) {
super(scope, id);
// Lambda関数を作成
const lambdaFunction = new nodejs.NodejsFunction(this, 'Default', {
entry: 'lambda/handler.ts',
runtime: lambda.Runtime.NODEJS_22_X,
handler: 'handler',
});
// 作成した関数をプロパティに設定
this.lambdaFunction = lambdaFunction;
}
}
メインスタックの作成(環境変数なし)
lib/cdk-lambda-environment-stack.tsを更新して、S3とLambdaのコンストラクトを統合します。
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { S3Construct } from './constructs/s3';
import { LambdaConstruct } from './constructs/lambda';
export class CdkLambdaEnvironmentStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// S3バケットの作成
const s3Construct = new S3Construct(this, 'S3');
// Lambda関数の作成
const lambdaConstruct = new LambdaConstruct(this, 'Lambda');
}
}
Lambda関数ハンドラーの作成(環境変数なし)
lambda/handler.tsを作成します。
export const handler = async (event: any) => {
console.log('イベント:', JSON.stringify(event, null, 2));
// この時点では環境変数は設定されていない
const bucketName = process.env.S3_BUCKET_NAME;
if (!bucketName) {
console.log('S3_BUCKET_NAME環境変数が設定されていません');
return {
statusCode: 400,
body: JSON.stringify({
message: 'S3_BUCKET_NAME環境変数が設定されていません',
}),
};
}
return {
statusCode: 200,
body: JSON.stringify({
message: '成功',
bucketName: bucketName,
}),
};
};
このハンドラーは、環境変数S3_BUCKET_NAMEの存在をチェックします。環境変数が設定されていない場合は400エラーを返し、設定されている場合はバケット名を含む成功レスポンスを返します。
この状態でデプロイしてLambda関数を実行すると、環境変数が設定されていないため、エラーメッセージが返されます。

環境変数を追加する
それでは、Lambda関数に環境変数を追加していきましょう。
Lambdaコンストラクトの修正
lib/constructs/lambda/index.tsを修正して、環境変数を受け取れるようにします。
import * as cdk from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as nodejs from 'aws-cdk-lib/aws-lambda-nodejs';
import { Construct } from 'constructs';
export interface LambdaConstructProps {
bucketName: string;
}
export class LambdaConstruct extends Construct {
public readonly lambdaFunction: nodejs.NodejsFunction;
constructor(scope: Construct, id: string, props: LambdaConstructProps) {
super(scope, id);
// プロパティからバケット名を取得
const { bucketName } = props;
// Lambda関数を作成
const lambdaFunction = new nodejs.NodejsFunction(this, 'Default', {
entry: 'lambda/handler.ts',
runtime: lambda.Runtime.NODEJS_22_X,
handler: 'handler',
});
this.lambdaFunction = lambdaFunction;
// 環境変数を追加
lambdaFunction.addEnvironment(
'S3_BUCKET_NAME', // 環境変数名
bucketName, // 設定する値
);
}
}
ポイント
- LambdaConstructProps インターフェースを追加して、バケット名を受け取れるようにしました
- addEnvironment メソッドを使用して、Lambda関数に環境変数を追加しています
addEnvironmentメソッドについて
addEnvironmentメソッドは、Lambda関数に環境変数を追加するためのメソッドです。このメソッドは以下のシグネチャを持ちます。
typescriptaddEnvironment(key: string, value: string, options?: EnvironmentOptions): Function
key: 環境変数のキー(名前)
value: 環境変数の値
options: オプション設定(省略可能)
メインスタックの修正
lib/cdk-lambda-environment-stack.tsを修正して、S3バケット名をLambda関数に渡します。
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { S3Construct } from './constructs/s3';
import { LambdaConstruct } from './constructs/lambda';
export class CdkLambdaEnvironmentStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// S3バケットの作成
const s3Construct = new S3Construct(this, 'S3');
// Lambda関数の作成(S3バケット名を環境変数として渡す)
const lambdaConstruct = new LambdaConstruct(this, 'Lambda',{
bucketName: s3Construct.bucket.bucketName, // バケット名を渡す
});
}
}
ポイント
- s3Construct.bucket.bucketNameでS3バケット名を取得し、Lambda関数に渡しています
以上で準備は完了したので、スタックをデプロイします。デプロイが完了すると、Lambda関数にS3バケット名が環境変数として設定されます。
動作確認
デプロイが完了したら、AWSマネジメントコンソールから動作を確認してみましょう。
まず、Lambda関数の環境変数設定を確認します。

S3_BUCKET_NAMEが正しく設定されていることが確認できました。
次に、Lambda関数を実際に実行してテストしてみます。

実行結果を見ると、ステータスコード200で成功し、環境変数から取得したバケット名が正しく返されていることがわかります。
おわりに
今回は、AWS CDK を使用してLambda関数の環境変数にS3バケット名を設定する方法を解説しました。環境変数を使うことで、コードを変更せずに設定を切り替えられました。
また、コンストラクト間での値の受け渡しは難しそうに見えますが、実際に試してみるとs3Construct.bucket.bucketNameのように直感的に値を取得できることがわかりました。
この記事がどなたかの参考になれば幸いです。






