

# Lambda 環境変数の操作
<a name="configuration-envvars"></a>

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

**注記**  
セキュリティを強化するには、データベースの認証情報や API キーや認可トークンなどその他の機密情報を保存するために、環境変数の代わりに AWS Secrets Manager を使用することをお勧めします。詳細については、「[Lambda 関数で Secrets Manager シークレットを使用する](with-secrets-manager.md)」を参照してください。

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

## Lambda 環境変数の作成
<a name="create-environment-variables"></a>

Lambda コンソール、AWS Command Line Interface (AWS CLI)、AWS Serverless Application Model (AWS SAM)、または AWS SDK を使用して、Lambda で環境変数を設定できます。

------
#### [ Console ]

環境変数は、関数の未公開バージョンで定義します。バージョンを公開するとき、他の[バージョン固有の構成設定](configuration-versions.md)とともに、そのバージョンの環境変数がロックされます。

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

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

1. Lambda コンソールの [[関数ページ]](https://console.aws.amazon.com/lambda/home#/functions) を開きます。

1. 関数を選択します。

1. **[設定]** タブを選択してから、**[環境変数]** を選択します。

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

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

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

**要件**
   + キーは文字で始まり、少なくとも 2 文字です。
   + キーには、文字、数字、およびアンダースコア (`_`) のみを含める。
   + キーは [Lambda によって予約](#configuration-envvars-runtime)されていない。
   + すべての環境変数の合計サイズは 4 KB を超えない。

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

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

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

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

1. コードエディタの **[ENVIRONMENT VARIABLES]** セクションまでスクロールします。既存の環境変数を以下に示します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/env-var.png)

1. 新しい環境変数を作成するには、プラス記号 (![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/add-plus.png)) を選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/create-env-var.png)

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

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

------
#### [ AWS CLI ]

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

```
aws lambda update-function-configuration \
  --function-name my-function \
  --environment "Variables={BUCKET=amzn-s3-demo-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:111122223333:function:my-function",
    "Runtime": "nodejs24.x",
    "Role": "arn:aws:iam::111122223333:role/lambda-role",
    "Environment": {
        "Variables": {
            "BUCKET": "amzn-s3-demo-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:111122223333:key/055efbb4-xmpl-4336-ba9c-538c7d31f599
```

------
#### [ AWS SAM ]

[AWS Serverless Application Model](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/serverless-getting-started.html ) を使用して関数の環境変数を設定できます。`template.yaml` ファイル内の [Environment](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-environment) プロパティと [Variables](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-environment.html#cfn-lambda-function-environment-variables) プロパティを更新し、[sam deploy](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-deploy.html) を実行します。

**Example template.yaml**  

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: An AWS Serverless Application Model template describing your function.
Resources:
  my-function:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: .
      Description: ''
      MemorySize: 128
      Timeout: 120
      Handler: index.handler
      Runtime: nodejs24.x
      Architectures:
        - x86_64
      EphemeralStorage:
        Size: 10240
      Environment:
        Variables:
          BUCKET: amzn-s3-demo-bucket
          KEY: file.txt
      # Other function properties...
```

------
#### [ AWS SDKs ]

AWS SDK を使用して環境変数を管理するには、以下の API オペレーションを使用します。
+ [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)
+ [GetFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html)
+ [CreateFunction](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html)

詳細については、目的のプログラミング言語の [AWS SDK ドキュメント](https://aws.amazon.com/developer/tools/)を参照してください。

------

## 環境変数のシナリオ例
<a name="configuration-envvars-example"></a>

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

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

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/console-env.png)


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

例えばテスト環境では、`LOG_LEVEL` キーと、デバッグまたはトレースのログレベルを示す値を使用して環境変数を設定できます。Lambda 関数のコードで、この環境変数を使用してログレベルを設定できます。

Python と Node.js の次のコード例は、これを実現する方法を示しています。これらの例では、環境変数の値が Python の場合は `DEBUG`、Node.js の場合は `debug` であることを前提としています。

------
#### [ Python ]

**Example ログレベルを設定する Python コード**  

```
import os
import logging

# Initialize the logger
logger = logging.getLogger()

# Get the log level from the environment variable and default to INFO if not set
log_level = os.environ.get('LOG_LEVEL', 'INFO')

# Set the log level
logger.setLevel(log_level)

def lambda_handler(event, context):
    # Produce some example log outputs
    logger.debug('This is a log with detailed debug information - shown only in test environment')
    logger.info('This is a log with standard information - shown in production and test environments')
```

------
#### [ Node.js (ES module format) ]

**Example ログレベルを設定する Node.js コード**  
この例では、`winston` ログ記録ライブラリを使用します。npm を使用して、このライブラリを関数のデプロイパッケージに追加します。詳細については、「[依存関係を含めて .zip デプロイパッケージを作成する](nodejs-package.md#nodejs-package-create-dependencies)」を参照してください。  

```
import winston from 'winston';

// Initialize the logger using the log level from environment variables, defaulting to INFO if not set
const logger = winston.createLogger({
   level: process.env.LOG_LEVEL || 'info',
   format: winston.format.json(),
   transports: [new winston.transports.Console()]
});

export const handler = async (event) => {
   // Produce some example log outputs
   logger.debug('This is a log with detailed debug information - shown only in test environment');
   logger.info('This is a log with standard information - shown in production and test environment');
   
};
```

------

## Lambda 環境変数の取得
<a name="retrieve-environment-variables"></a>

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

------
#### [ 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\$1 ]

```
string region = Environment.GetEnvironmentVariable("AWS_REGION");
```

------
#### [ PowerShell ]

```
$region = $env:AWS_REGION
```

------

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

## 定義されたランタイム環境変数
<a name="configuration-envvars-runtime"></a>

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

**予約済み環境変数**
+ `_HANDLER` － 関数に設定されているハンドラの場所。
+ `_X_AMZN_TRACE_ID` － [X-Ray トレースヘッダー](services-xray.md)。この環境変数は呼び出しごとに変化します。
  + この環境変数は OS 専用ランタイム (`provided` ランタイムファミリー) には定義されていません。カスタムランタイムには [次の呼び出し](runtimes-api.md#runtimes-api-next) からの `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リージョン](https://docs.aws.amazon.com/sdkref/latest/guide/feature-region.html#feature-region-sdk-compat)」を参照してください。
+ `AWS_EXECUTION_ENV` – `AWS_Lambda_` (例: `AWS_Lambda_java8`) のプレフィックスが付いた[ランタイム識別子](lambda-runtimes.md)。この環境変数は OS 専用ランタイム (`provided` ランタイムファミリー) には定義されていません。
+ `AWS_LAMBDA_FUNCTION_NAME` － 関数の名前。
+ `AWS_LAMBDA_FUNCTION_MEMORY_SIZE` － 関数で使用できるメモリの量 (MB 単位)。
+ `AWS_LAMBDA_FUNCTION_VERSION` － 実行される関数のバージョン。
+ `AWS_LAMBDA_INITIALIZATION_TYPE` – 関数の初期化タイプ。`on-demand`、`provisioned-concurrency`、`snap-start`、`lambda-managed-instances` のいずれかになります。詳細については、「[プロビジョニングされた同時実行の設定](provisioned-concurrency.md)」、「[Lambda SnapStart による起動パフォーマンスの向上](snapstart.md)」、「[Lambda マネージドインスタンス](lambda-managed-instances.md)」を参照してください。
+ `AWS_LAMBDA_LOG_GROUP_NAME`、`AWS_LAMBDA_LOG_STREAM_NAME` － Amazon CloudWatch Logs グループの名前と関数のストリーム。`AWS_LAMBDA_LOG_GROUP_NAME` および `AWS_LAMBDA_LOG_STREAM_NAME` の[環境変数](#configuration-envvars-runtime)は Lambda SnapStart 関数では使用できません。
+ `AWS_ACCESS_KEY`、`AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY`、`AWS_SESSION_TOKEN` – 関数の[実行ロール](lambda-intro-execution-role.md)から取得したアクセスキー。
+ `AWS_LAMBDA_RUNTIME_API` － ([カスタムランタイム](runtimes-custom.md)) [ランタイム API](runtimes-api.md) のホストおよびポート。
+ `LAMBDA_TASK_ROOT` － Lambda 関数コードへのパス。
+ `LAMBDA_RUNTIME_DIR` － ランタイムライブラリへのパス。
+ `AWS_LAMBDA_MAX_CONCURRENCY` – (Lambda マネージドインスタンスのみ) Lambda が 1 つの実行環境に送信する同時呼び出しの最大数。
+ `AWS_LAMBDA_METADATA_API` – `{ipv4_address}:{port}` 形式の[メタデータエンドポイント](configuration-metadata-endpoint.md)サーバーアドレス (例: `169.254.100.1:9001`)。
+ `AWS_LAMBDA_METADATA_TOKEN` – [メタデータエンドポイント](configuration-metadata-endpoint.md)へのリクエストを認証するために使用される現在の実行環境に対する一意の認証トークン。Lambda は、初期化時にこのトークンを自動的に生成します。

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

**予約されていない環境変数**
+ `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](lambda-nodejs.md)) Node.js ライブラリのパス (`/opt/nodejs/node12/node_modules/:/opt/nodejs/node_modules:$LAMBDA_RUNTIME_DIR/node_modules`)。
+ `NODE_OPTIONS` – ([Node.js](lambda-nodejs.md)) Node.js ランタイムの場合、`NODE_OPTIONS` を使用して、Lambda がデフォルトで無効にする実験的機能を再度有効にできます。
+ `PYTHONPATH` – ([Python](lambda-python.md)) Python ライブラリパス (`$LAMBDA_RUNTIME_DIR`)。
+ `GEM_PATH` － ([Ruby](lambda-ruby.md)) Ruby ライブラリのパス (`$LAMBDA_TASK_ROOT/vendor/bundle/ruby/3.3.0:/opt/ruby/gems/3.3.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](lambda-csharp.md)) この変数を設定して、.NET 固有のランタイムの最適化を有効または無効にします。値には `always`、`never`、および `provisioned-concurrency` があります。詳細については、「[関数に対するプロビジョニングされた同時実行数の設定](provisioned-concurrency.md)」を参照してください。
+ `TZ` － 環境のタイムゾーン (`:UTC`)。実行環境は、システムクロックを同期するために NTP を使用します。

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

# Lambda 環境変数の保護
<a name="configuration-envvars-encryption"></a>

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

**注記**  
データベースのセキュリティを強化するには、環境変数の代わりに AWS Secrets Manager を使用してデータベースの認証情報を保存することをお勧めします。詳細については、「[Lambda 関数で Secrets Manager シークレットを使用する](with-secrets-manager.md)」を参照してください。

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

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

カスタマーマネージドキーには、標準の AWS KMS 料金が発生します。詳細については、「[AWS Key Management Service 料金表](https://aws.amazon.com/kms/pricing/)」を参照してください。

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

**環境変数の暗号化を設定するには**

1. AWS Key Management Service (AWS KMS) を使用して、Lambda でサーバー側およびクライアント側の暗号化に使用するカスタマー管理のキーを作成します。詳細については、 *AWS Key Management Service デベロッパーガイド*の「[キーの作成](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)」を参照してください。

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

   1. Lambda コンソールの [[関数ページ]](https://console.aws.amazon.com/lambda/home#/functions) を開きます。

   1. 関数を選択します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1. 許可を設定します。

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

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

## サーバー側の暗号化 KMS キーに対するアクセス許可の管理
<a name="managing-permissions-to-your-server-side-encryption-key"></a>

ユーザーや関数の実行ロールには、デフォルトの暗号化キーを使用するための AWS KMS アクセス許可が不要です。カスタマー管理のキーを使用するには、キーを使用するためのアクセス許可が必要です。Lambda はユーザーのアクセス許可を使用して、キーを付与します。これにより、Lambda はこのキーを暗号化に使用できます。
+ `kms:ListAliases` － Lambda コンソールでキーを表示します。
+ `kms:CreateGrant`、`kms:Encrypt` － 関数でカスタマー管理のキーを設定します。
+ `kms:Decrypt` － カスタマー管理のキーで暗号化された環境変数を表示および管理します。

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

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

**Example IAM ポリシー － キー ARN によるアクセスの拒否**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Deny",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:us-east-2:111122223333:key/3be10e2d-xmpl-4be4-bc9d-0405a71945cc"
        }
    ]
}
```

キーのアクセス許可の管理に関する詳細については、「*AWS Key Management Service デベロッパーガイド*」の「[AWS KMS のキーポリシー](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)」を参照してください。