Lambda 環境変数の使用 - AWS Lambda

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Lambda 環境変数の使用

環境変数を使用すると、コードを更新せずに関数の動作を調整できます。環境変数は、関数のバージョン固有の設定に保存される文字列のペアです。Lambda ランタイムは、環境変数をコードで使用できるようにし、関数と呼び出しリクエストに関する情報を含む追加の環境変数を設定します。

注記

データベースのセキュリティを強化するには、環境変数の代わりに AWS Secrets Manager を使用してデータベースの認証情報を保存することをお勧めします。詳細については、「Amazon RDS で AWS Lambda 使用する」を参照してください。

環境変数は、関数を呼び出す前には評価されません。定義した値はリテラル文字列とみなされ、展開されません。関数コードで変数の評価を実行します。

環境変数の設定

環境変数は、関数の未公開バージョンで定義します。バージョンを公開するとき、他のバージョン固有の設定とともに、そのバージョンの環境変数がロックされます。

関数の環境変数を作成するには、キーと値を定義します。関数は、キーの名前を使用して、環境変数の値を取得します。

Lambda コンソールで環境変数を設定するには
  1. Lambda コンソールの [関数ページ] を開きます。

  2. 関数を選択します。

  3. [Configuration] (設定) を選択してから、[Environment variables] (環境変数) を選択します。

  4. [環境変数] で、[編集] を選択します。

  5. [環境変数の追加] を選択します。

  6. キーと値を入力します。

    要件
    • キーは文字で始まり、少なくとも 2 文字です。

    • キーには、文字、数字、およびアンダースコア (_) のみを含める。

    • キーは Lambda によって予約されていない。

    • すべての環境変数の合計サイズは 4 KB を超えない。

  7. [Save] を選択します。

コンソールコードエディタで環境変数のリストを生成するには

Lambda コードエディタで環境変数のリストを生成することができます。これを使用することで、コーディング中に環境変数を簡単に参照することができます。

  1. [コード] タブを選択します。

  2. [環境変数] タブを選択します。

  3. [ツール][環境変数を表示] の順に選択します。

環境変数は、コンソールのコードエディタに一覧表示されても暗号化されたままです。転送中の暗号化の暗号化ヘルパーを有効にした場合、それらの設定は変更されません。詳細については、「環境変数の保護」を参照してください。

環境変数リストは読み取り専用で、Lambda コンソールでのみ使用できます。このファイルは、関数の .zip ファイルアーカイブをダウンロードしたときには含まれていません。また、このファイルをアップロードしても環境変数を追加することはできません。

API を使用した環境変数の設定

AWS CLI または AWS SDK で環境変数を管理するには、以下の API オペレーションを使用します。

次の例では、my-function という名前の関数に 2 つの環境変数を設定します。

aws lambda update-function-configuration --function-name my-function \ --environment "Variables={BUCKET=my-bucket,KEY=file.txt}"

update-function-configuration コマンドを使用して環境変数を適用すると、Variables 構造体の内容全体が置き換えられます。新しい環境変数を追加するときに既存の環境変数を保持するには、リクエストに既存の値をすべて含めます。

現在の設定を取得するには、get-function-configuration コマンドを使用します。

aws lambda get-function-configuration --function-name my-function

以下の出力が表示されます。

{ "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs20.x", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Environment": { "Variables": { "BUCKET": "my-bucket", "KEY": "file.txt" } }, "RevisionId": "0894d3c1-2a3d-4d48-bf7f-abade99f3c15", ... }

get-function-configuration の出力にあるリビジョン ID をパラメータとして update-function-configuration に渡すことができます。これにより、構成を読み込んだときから更新したときまでの間に、値が変更されることはありません。

関数の暗号化キーを設定するには、KMSKeyARN オプションを設定します。

aws lambda update-function-configuration --function-name my-function \ --kms-key-arn arn:aws:kms:us-east-2:123456789012:key/055efbb4-xmpl-4336-ba9c-538c7d31f599

環境変数のシナリオ例

環境変数を使用して、テスト環境および本番環境における関数の動作をカスタマイズできます。例えば、同じコードでも設定が異なる 2 つの関数を作成できます。1 つの関数はテストデータベースに接続し、もう 1 つはプロダクションデータベースに接続します。この状況では、環境変数を使用して、データベースのホスト名とその他の接続に関する詳細を関数に渡します。

次の例は、データベースホストとデータベース名を環境変数として定義する方法を示しています。


        Lambda コンソールの環境変数。

テスト環境で本番環境よりも多くのデバッグ情報を生成する場合は、環境変数を設定して、より詳細なログ記録またはトレースを使用するようにテスト環境を設定できます。

環境変数の取得

関数コード内の環境変数を取得するには、プログラミング言語の標準メソッドを使用します。

Node.js
let region = process.env.AWS_REGION
Python
import os region = os.environ['AWS_REGION']
注記

場合によっては、次の形式の使用が必要になる場合があります。

region = os.environ.get('AWS_REGION')
Ruby
region = ENV["AWS_REGION"]
Java
String region = System.getenv("AWS_REGION");
Go
var region = os.Getenv("AWS_REGION")
C#
string region = Environment.GetEnvironmentVariable("AWS_REGION");
PowerShell
$region = $env:AWS_REGION

Lambda は、環境変数を保管時に暗号化して安全に保存します。別の暗号化キーを使用したり、クライアント側で環境変数値を暗号化したり、AWS CloudFormation テンプレートで AWS Secrets Manager を使用して環境変数を設定したりするように Lambda を設定できます。

定義されたランタイム環境変数

Lambda ランタイムは、初期化中にいくつかの環境変数を設定します。ほとんどの環境変数は、関数またはランタイムに関する情報を提供します。これらの環境変数のキーは予約済みであるため、関数設定では設定できません。

予約済み環境変数
  • _HANDLER - 関数に設定されているハンドラの場所。

  • _X_AMZN_TRACE_IDX-Ray トレースヘッダー。この環境変数は呼び出しごとに変化します。

    • この環境変数は OS 専用ランタイム (provided ランタイムファミリー) には定義されていません。カスタムランタイムには 次の呼び出し からの Lambda-Runtime-Trace-Id レスポンスのヘッダーに _X_AMZN_TRACE_ID を設定できます。

    • Java ランタイムバージョン 17 以降では、この環境変数は使用されません。代わりに、Lambda はトレース情報を com.amazonaws.xray.traceHeader システムプロパティに保存します。

  • AWS_DEFAULT_REGION - Lambda 関数が実行されるデフォルトの AWS リージョン。

  • AWS_REGION - Lambda 関数が実行される AWS リージョン。定義されている場合、この値は AWS_DEFAULT_REGION を上書きします。

    • AWS SDK での AWS リージョン 環境変数を使用する方法の詳細については、「AWS SDK とツールリファレンスガイド」の「AWSリージョン」を参照してください。

  • AWS_EXECUTION_ENVAWS_Lambda_ (例: AWS_Lambda_java8) のプレフィックスが付いたランタイム識別子。この環境変数は OS 専用ランタイム (provided ランタイムファミリー) には定義されていません。

  • AWS_LAMBDA_FUNCTION_NAME - 関数の名前。

  • AWS_LAMBDA_FUNCTION_MEMORY_SIZE - 関数で使用できるメモリの量 (MB 単位)。

  • AWS_LAMBDA_FUNCTION_VERSION - 実行される関数のバージョン。

  • AWS_LAMBDA_INITIALIZATION_TYPE - 関数の初期化タイプ。これは、on-demandprovisioned-concurrency、または snap-start になります。詳細については、「プロビジョニングされた同時実行の設定」または「Lambda による起動パフォーマンスの向上 SnapStart」を参照してください。

  • AWS_LAMBDA_LOG_GROUP_NAMEAWS_LAMBDA_LOG_STREAM_NAME - Amazon CloudWatch Logs グループの名前と関数のストリーム。AWS_LAMBDA_LOG_GROUP_NAME および AWS_LAMBDA_LOG_STREAM_NAME の環境変数は Lambda SnapStart 関数では使用できません。

  • AWS_ACCESS_KEYAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN – 関数の実行ロールから取得したアクセスキー。

  • AWS_LAMBDA_RUNTIME_API - (カスタムランタイム) ランタイム API のホストおよびポート。

  • LAMBDA_TASK_ROOT - Lambda 関数コードへのパス。

  • LAMBDA_RUNTIME_DIR - ランタイムライブラリへのパス。

以下の追加の環境変数は予約されていないため、関数設定で拡張できます。

予約されていない環境変数
  • LANG - ランタイムのロケール (en_US.UTF-8)。

  • PATH - 実行パス (/usr/local/bin:/usr/bin/:/bin:/opt/bin)。

  • LD_LIBRARY_PATH - システムライブラリのパス (/var/lang/lib:/lib64:/usr/lib64:$LAMBDA_RUNTIME_DIR:$LAMBDA_RUNTIME_DIR/lib:$LAMBDA_TASK_ROOT:$LAMBDA_TASK_ROOT/lib:/opt/lib)。

  • NODE_PATH - (Node.js) Node.js ライブラリのパス (/opt/nodejs/node12/node_modules/:/opt/nodejs/node_modules:$LAMBDA_RUNTIME_DIR/node_modules)。

  • PYTHONPATH - (Python 2.7、3.6、3.8) Python ライブラリのパス ($LAMBDA_RUNTIME_DIR)。

  • GEM_PATH - (Ruby) Ruby ライブラリのパス ($LAMBDA_TASK_ROOT/vendor/bundle/ruby/2.5.0:/opt/ruby/gems/2.5.0)。

  • AWS_XRAY_CONTEXT_MISSING - X-Rayトレースの場合、Lambda は X-Ray SDK からランタイムエラーがスローされないように、これを LOG_ERROR に設定します。

  • AWS_XRAY_DAEMON_ADDRESS - X-Ray トレーシングの場合、X-Ray デーモンの IP アドレスとポート。

  • AWS_LAMBDA_DOTNET_PREJIT - .NET 6 と .NET 7 ランタイムの場合、この変数を設定して、.NET 固有のランタイムの最適化を有効または無効にします。値には alwaysnever、および provisioned-concurrency があります。詳細については、「プロビジョニング済み同時実行の設定」を参照してください。

  • TZ - 環境のタイムゾーン (UTC)。実行環境は、システムクロックを同期するために NTP を使用します。

表示されるサンプル値は、最新のランタイムを反映しています。特定の変数やその値の有無は、以前のランタイムでは異なる場合があります。

環境変数の保護

環境変数の保護する場合、サーバー側の暗号化を使用して保管中のデータを保護し、クライアント側の暗号化を使用して転送中のデータを保護することができます。

注記

データベースのセキュリティを強化するには、環境変数の代わりに AWS Secrets Manager を使用してデータベースの認証情報を保存することをお勧めします。詳細については、「Amazon RDS で AWS Lambda 使用する」を参照してください。

保管時のセキュリティ

Lambda は、AWS KMS key で常にサーバー側の暗号化を提供します。デフォルトでは、Lambda は AWS マネージドキーを使用します。このデフォルトの動作がワークフローに適している場合は、他の設定をする必要はありません。Lambda はアカウントに AWS マネージドキーを作成し、それに対するアクセス許可を管理します。このキーの使用に対する AWS の請求は発生しません。

必要に応じて、AWS KMS カスタマー管理のキーを使用することもできます。その場合、KMS キーのローテーションの制御や、KMS キーの管理に関する組織の要件への準拠を行うことができます。カスタマー管理のキーを使用すると、KMS キーへのアクセス許可があるアカウントのユーザーのみが、関数の環境変数を表示または管理できます。

カスタマーマネージドキーには、標準の AWS KMS 料金が発生します。詳細については、「AWS Key Management Service 料金表」を参照してください。

転送中のセキュリティ

セキュリティを強化するために、転送中の暗号化のヘルパーを有効にして、転送中の保護のために環境変数をクライアント側で暗号化することができます。

環境変数の暗号化を設定するには
  1. AWS Key Management Service (AWS KMS) を使用して、Lambda でサーバー側およびクライアント側の暗号化に使用するカスタマー管理のキーを作成します。詳細については、 AWS Key Management Service デベロッパーガイドの「キーの作成」を参照してください。

  2. Lambda コンソールを使用して、[環境変数の編集] ページに移動します。

    1. Lambda コンソールの [関数ページ] を開きます。

    2. 関数を選択します。

    3. [設定] を選択し、左側のナビゲーションバーで [環境変数] を選択します。

    4. [環境変数] セクションで、[編集] を選択します。

    5. [暗号化設定] を展開します。

  3. コンソール暗号化ヘルパーを有効にして、クライアント側の暗号化を使用し、転送中のデータを保護します (オプション)。

    1. [転送時の暗号化] で、[転送時の暗号化に使用するヘルパーの有効化] を選択します。

    2. コンソール暗号化ヘルパーを有効にする各環境変数に対して、環境変数の横にある [Encrypt] (暗号化) を選択します。

    3. 転送時に暗号化する AWS KMS key で、この手順の最初で作成したカスタマー管理キーを選択します。

    4. [実行ロールポリシー] をクリックしてポリシーをコピーします。このポリシーは、環境変数を復号化するアクセス許可を関数の実行ロールに付与します。

      このポリシーは、この手順の最後のステップで使用するために保存します。

    5. 環境変数を暗号化する関数にコードを追加します。例を表示するには、[Decrypt secrets snippet] を選択します。

  4. 保管中の暗号化に使用するカスタマーマネージドキーを指定します (オプション)。

    1. [カスタマーマスターキーの使用] を選択します。

    2. この手順の最初に作成したカスタマー管理のキーを選択します。

  5. [Save] を選択します。

  6. 許可を設定します。

    サーバー側の暗号化でカスタマーマネージドキーを使用している場合は、関数の環境変数を表示または管理できるようにしたいユーザーまたはロールに許可を付与します。詳細については、「サーバー側の暗号化 KMS キーに対するアクセス許可の管理」を参照してください。

    転送時のセキュリティの目的でクライアント側の暗号化を有効にする場合、関数に kms:Decrypt API オペレーションを呼び出すためのアクセス許可が必要です。この手順で以前に保存したポリシーを関数の実行ロールに追加します。

サーバー側の暗号化 KMS キーに対するアクセス許可の管理

ユーザーや関数の実行ロールには、デフォルトの暗号化キーを使用するための AWS KMS アクセス許可が不要です。カスタマー管理のキーを使用するには、キーを使用するためのアクセス許可が必要です。Lambda はユーザーのアクセス許可を使用して、キーを付与します。これにより、Lambda はこのキーを暗号化に使用できます。

  • kms:ListAliases - Lambda コンソールでキーを表示します。

  • kms:CreateGrantkms:Encrypt - 関数でカスタマー管理のキーを設定します。

  • kms:Decrypt - カスタマー管理のキーで暗号化された環境変数を表示および管理します。

これらの許可は、AWS アカウントから、またはキーのリソースベースの許可ポリシーから取得できます。ListAliases は、Lambda のマネージドポリシーから提供されます。キーポリシーは、キーユーザーグループのユーザーに対して残りのアクセス許可を付与します。

Decrypt アクセス許可を持たないユーザーは、引き続き関数を管理できますが、Lambda コンソールで環境変数を表示または管理することはできません。ユーザーが環境変数を表示できないようにするには、デフォルトキー、カスタマー管理キー、またはすべてのキーへのアクセスを拒否するステートメントをユーザーのアクセス許可に追加します。

例 IAM ポリシー - キー ARN によるアクセスの拒否
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Deny", "Action": [ "kms:Decrypt" ], "Resource": "arn:aws:kms:us-east-2:123456789012:key/3be10e2d-xmpl-4be4-bc9d-0405a71945cc" } ] }

          Lambda コンソールでの復号アクセス許可のないユーザーに対するエラーメッセージ。

キーのアクセス許可の管理についての詳細は、AWS Key Management Service デベロッパーガイドの「AWS KMS でのキーポリシー」を参照してください。

サンプルコードとテンプレート

このガイドの GitHub リポジトリのサンプルアプリケーションは、関数コードと AWS CloudFormation テンプレートで環境変数を使用する方法を示しています。

サンプルアプリケーション
  • Blank function – ログ記録、環境変数、AWS X-Ray トレース、レイヤー、単位テスト、および AWS SDK の使用状況を表示する基本的な関数を作成します。

  • RDS MySQL - 1 つのテンプレートに VPC と Amazon Relational Database Service (Amazon RDS) DB インスタンスを作成して、パスワードを Secrets Manager に保存します。アプリケーションテンプレートで、VPC スタックからデータベースの詳細をインポートし、Secrets Manager からパスワードを読み取り、すべての接続設定を環境変数の関数に渡します。