AWS Lambda 環境変数の使用 - AWS Lambda

AWS Lambda 環境変数の使用

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

注記

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

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

Lambda コンソールで環境変数を設定するには

  1. Lambda コンソール (関数ページ) を開きます。

  2. 関数を選択します。

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

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

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

    要件

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

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

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

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

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

環境変数を使用して、環境固有の設定をコードに渡します。たとえば、同じコードでも設定が異なる 2 つの関数を持つことができます。1 つの関数はテストデータベースに接続し、もう 1 つはプロダクションデータベースに接続します。この状況では、環境変数を使用して、データベースのホスト名とその他の接続の詳細を関数に伝えます。

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


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

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

注記

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

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

Node.js
let region = process.env.AWS_REGION
Python
import os region = os.environ['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 Secrets Manager で AWS CloudFormation テンプレートを使用して環境変数を設定したりするように Lambda を設定できます。

ランタイム環境変数

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

予約済み環境変数

  • _HANDLER – 関数に設定されているハンドラーの場所。

  • _X_AMZN_TRACE_IDX-Ray トレースヘッダー

  • AWS_REGION – Lambda 関数を実行する AWS リージョン。

  • AWS_EXECUTION_ENVAWS_Lambda_ のプレフィックスが付いたランタイム識別子 (例: AWS_Lambda_java8)。

  • AWS_LAMBDA_FUNCTION_NAME – 関数の名前。

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

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

  • AWS_LAMBDA_LOG_GROUP_NAMEAWS_LAMBDA_LOG_STREAM_NAME – Amazon CloudWatch Logs グループの名前と関数のストリーム。

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

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

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

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

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

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

予約されていない環境変数

  • LANG – ランタイムのロケール (en_US.UTF-8)。

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

  • LD_LIBRARY_PATH – システムライブラリのパス (/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 トレースで、X-Ray SDK からランタイムエラーがスローされないように、Lambda は、これを LOG_ERROR に設定します。

  • AWS_XRAY_DAEMON_ADDRESS – X-Ray トレース用の X-Ray デーモンの IP アドレスとポート。

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

環境変数の保護

Lambda は、アカウントで作成したキー (AWS 管理のカスタマーマスターキー (CMK)) を使用して環境変数を暗号化します。このキーの使用は無料です。デフォルトのキーの代わりに、Lambda で使用する独自のキーを指定することもできます。

キーを指定すると、そのキーへのアクセス権を持つアカウントのユーザーのみが、関数の環境変数を表示または管理できます。組織には、暗号化に使用するキーを管理したり、キーの更新時期を制御したりするための内外の要件が存在する場合もあります。

カスタマー管理の CMK を使用するには

  1. Lambda コンソール (関数ページ) を開きます。

  2. 関数を選択します。

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

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

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

  6. カスタマー管理の CMK を選択します。

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

カスタマー管理の CMK には、標準の AWS KMS 料金がかかります。

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

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

  • kms:CreateGrant kms:Encrypt – 関数でカスタマー管理の CMK を設定します。

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

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

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 KMS でのキーポリシーの使用」を参照してください。

また、環境変数値を Lambda に送信する前にクライアント側で暗号化し、関数コードで復号することもできます。これにより、キーを使用するアクセス許可を持つユーザーであっても、Lambda コンソールと API 出力でシークレットの値が隠されます。コードでは、暗号化された値を環境から取得し、AWS KMS API を使用して復号します。

クライアント側で環境変数を暗号化するには

  1. Lambda コンソール (関数ページ) を開きます。

  2. 関数を選択します。

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

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

  5. [Enable helpers for encryption in transit (転送中の暗号化のためにヘルパーを有効にする)] を選択します。

  6. 変数の横にある [暗号化] を選択して、値を暗号化します。

  7. [保存] を選択します。

注記

コンソール暗号化ヘルパーを使用する場合、関数に実行ロールkms:Decrypt API オペレーションを呼び出すアクセス許可が必要です。

関数の言語のサンプルコードを表示するには、環境変数の横にある [コード] を選択します。サンプルコードは、関数の環境変数を取得してその値を復号する方法を示しています。

もう 1 つのオプションは、パスワードを AWS Secrets Manager シークレットに保存することです。AWS CloudFormation テンプレート内のシークレットを参照して、データベースにパスワードを設定できます。また、Lambda 関数に環境変数の値を設定することもできます。例については、次のセクションを参照ください。

Lambda 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": "nodejs12.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

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

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

サンプルアプリケーション

  • Blank 関数 – 同じテンプレートに関数と Amazon SNS トピックを作成します。トピックの名前を環境変数の関数に渡します。コードで環境変数を読み取ります(複数言語)。

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