

# Lambda .zip デプロイパッケージの暗号化
<a name="encrypt-zip-package"></a>

Lambda では、.zip デプロイパッケージと関数設定詳細の保管時のサーバー側暗号化に常に AWS KMS keyを提供します。デフォルトでは、Lambda は [AWS 所有のキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk) を使用します。このデフォルトの動作がワークフローに適している場合は、他の設定をする必要はありません。AWS では、このキーの使用に料金は発生しません。

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

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

## カスタマーマネージドキーを作成する
<a name="create-key"></a>

 対称カスタマーマネージドキーを作成するには、AWS マネジメントコンソール または AWS KMS API を使用します。

**対称カスタマーマネージドキーを作成するには**

「*AWS Key Management Service デベロッパーガイド*」の「[KMS キーを作成する](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)」の手順に従ってください。

### アクセス許可
<a name="enable-zip-permissions"></a>

**キーポリシー**

[キーポリシー](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)は、カスタマーマネージドキーへのアクセスを制御します。すべてのカスタマーマネージドキーには、キーポリシーが 1 つだけ必要です。このポリシーには、そのキーを使用できるユーザーとその使用方法を決定するステートメントが含まれています。詳細については、「*AWS Key Management Service デベロッパーガイド*」の「[キーポリシーを変更する方法](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html#key-policy-modifying-how-to)」を参照してください。

カスタマーマネージドキーを使用して .zip デプロイパッケージを暗号化する場合、Lambda はキーに [grant](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html) を追加しません。AWS KMS キーポリシーで、Lambda がユーザーに代わって次の AWS KMS API オペレーションを呼び出せるようにする必要があります。
+ [kms:GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)
+ [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)

次のキーポリシーの例では、アカウント 111122223333 のすべての Lambda 関数が、指定されたカスタマーマネージドキーに必要な AWS KMS オペレーションを呼び出せるようにします。

**Example AWS KMS キーポリシー**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": [
                "kms:GenerateDataKey",
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/key-id",
            "Condition": {
                "StringLike": {
                "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:*"
                }
            }
        }
    ]
}
```

[キーアクセスのトラブルシューティング](https://docs.aws.amazon.com/kms/latest/developerguide/policy-evaluation.html#example-no-iam)に関する詳細については、「AWS Key Management Service デベロッパーガイド」を参照してください。**

**プリンシパルアクセス権限**

カスタマーマネージドキーを使用して .zip デプロイパッケージを暗号化すると、そのキーにアクセスできる[プリンシパル](https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html)のみが .zip デプロイパッケージにアクセスできます。例えば、カスタマーマネージドキーにアクセスできないプリンシパルは、[GetFunction](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html) レスポンスに含まれている署名付き S3 URL を使用して .zip パッケージをダウンロードすることはできません。`AccessDeniedException` は、レスポンスの `Code` セクションで返されます。

**Example AWS KMS AccessDeniedException**  

```
{
    "Code": {
        "RepositoryType": "S3",
        "Error": {
            "ErrorCode": "AccessDeniedException",
            "Message": "KMS access is denied. Check your KMS permissions. KMS Exception: AccessDeniedException KMS Message: User: arn:aws:sts::111122223333:assumed-role/LambdaTestRole/session is not authorized to perform: kms:Decrypt on resource: arn:aws:kms:us-east-1:111122223333:key/key-id with an explicit deny in a resource-based policy"
        },
        "SourceKMSKeyArn": "arn:aws:kms:us-east-1:111122223333:key/key-id"
    },
	...
```

AWS KMS キーのアクセス許可については、「[AWS KMS キーアクセスとアクセス許可](https://docs.aws.amazon.com/kms/latest/developerguide/control-access.html)」を参照してください。

## .zip デプロイパッケージにカスタマーマネージドキーを使用する
<a name="enable-zip-custom-encryption"></a>

次の API パラメータを使用して、.zip デプロイパッケージのカスタマーマネージドキーを設定します。
+ [SourceKMSKeyArn](https://docs.aws.amazon.com/lambda/latest/api/API_FunctionCode.html#lambda-Type-FunctionCode-SourceKMSKeyArn): ソースの .zip デプロイパッケージ (アップロードするファイル) を暗号化します。
+ [KMSKeyArn](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html#lambda-CreateFunction-request-KMSKeyArn): [環境変数](configuration-envvars-encryption.md)と [Lambda SnapStart](snapstart.md) のスナップショットを暗号化します。

`SourceKMSKeyArn` と `KMSKeyArn` の両方が指定されている場合、Lambda は `KMSKeyArn` キーを使用して、Lambda が関数の呼び出しに使用する解凍されたバージョンのパッケージを暗号化します。`SourceKMSKeyArn` が指定されていて `KMSKeyArn` が指定されていない場合、Lambda は [AWS マネージドキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk)を使用して解凍されたバージョンのパッケージを暗号化します。

------
#### [ Lambda console ]

**関数の作成時にカスタマーマネージドキーの暗号化を追加するには**

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

1. [**関数の作成**] を選択してください。

1. **[Author from scratch]** (一から作成) または **[Container image]** (コンテナイメージ) をクリックします。

1. **[基本的な情報]** で、以下を実行します。

   1. [**関数名**] に関数名を入力します。

   1. [**Runtime**] (ランタイム) で、関数で使用する言語バージョンを選択します。

1. **[詳細設定]** を展開し、**[AWS KMS カスタマーマネージドキーによる暗号化を有効にする]** を選択します。

1. カスタマーマネージドキーを選択します。

1. [**関数の作成**] を選択してください。

カスタマーマネージドキーの暗号化を削除するか、別のキーを使用するには、.zip デプロイパッケージを再度アップロードする必要があります。

**カスタマーマネージドキーの暗号化を既存の関数に追加するには**

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

1. 関数の名前を選択します。

1. **[コードソース]** ペインで、**[アップロード元]** をクリックします。

1. **[.zip ファイル]** または **[Amazon S3 の場所]** を選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/upload-zip.png)

1. ファイルをアップロードするか、Amazon S3 の場所を入力します。

1. **[AWS KMS カスタマーマネージドキーによる暗号化を有効にする]** を選択します。

1. カスタマーマネージドキーを選択します。

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

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

**関数の作成時にカスタマーマネージドキーの暗号化を追加するには**

次に [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) の例を示します。
+ `--code`: zip デプロイパッケージへのローカルパス (`ZipFile`) および暗号化するためのカスタマーマネージドキー (`SourceKMSKeyArn`) を指定します。
+ `--kms-key-arn`: 環境変数と解凍されたバージョンのデプロイパッケージを暗号化するカスタマーマネージドキーを指定します。

```
aws lambda create-function \
  --function-name myFunction \
  --runtime nodejs24.x \
  --handler index.handler \
  --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
  --code ZipFile=fileb://myFunction.zip,SourceKMSKeyArn=arn:aws:kms:us-east-1:111122223333:key/key-id \
  --kms-key-arn arn:aws:kms:us-east-1:111122223333:key/key2-id
```

次に [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) の例を示します。
+ `--code`: Amazon S3 バケット内の .zip ファイルの場所 (`S3Bucket`、`S3Key`、`S3ObjectVersion`) および暗号化するためのカスタマーマネージドキー (`SourceKMSKeyArn`) を指定します。
+ `--kms-key-arn`: 環境変数と解凍されたバージョンのデプロイパッケージを暗号化するカスタマーマネージドキーを指定します。

```
aws lambda create-function \
  --function-name myFunction \
  --runtime nodejs24.x --handler index.handler \
  --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
  --code S3Bucket=amzn-s3-demo-bucket,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion,SourceKMSKeyArn=arn:aws:kms:us-east-1:111122223333:key/key-id \
  --kms-key-arn arn:aws:kms:us-east-1:111122223333:key/key2-id
```

**カスタマーマネージドキーの暗号化を既存の関数に追加するには**

次に [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) の例を示します。
+ `--zip-file`: .zip デプロイパッケージへのローカルパスを指定します。
+ `--source-kms-key-arn`: zip 化されたバージョンのデプロイパッケージを暗号化するカスタマーマネージドキーを指定します。Lambda は、AWS 所有キーを使用して、解凍されたパッケージを関数呼び出しのために暗号化します。カスタマーマネージドキーを使用して解凍されたバージョンのパッケージを暗号化する場合は、`--kms-key-arn` オプションを指定して [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) コマンドを実行します。

```
aws lambda update-function-code \
  --function-name myFunction \
  --zip-file fileb://myFunction.zip \
  --source-kms-key-arn arn:aws:kms:us-east-1:111122223333:key/key-id
```

次に [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) の例を示します。
+ `--s3-bucket`: Amazon S3 バケット内の .zip ファイルの場所を指定します。
+ `--s3-key`: デプロイパッケージの Amazon S3 キーを指定します。
+ `--s3-object-version`: バージョニングオブジェクトの場合、使用するデプロイパッケージオブジェクトのバージョンです。
+ `--source-kms-key-arn`: zip 化されたバージョンのデプロイパッケージを暗号化するカスタマーマネージドキーを指定します。Lambda は、AWS 所有キーを使用して、解凍されたパッケージを関数呼び出しのために暗号化します。カスタマーマネージドキーを使用して解凍されたバージョンのパッケージを暗号化する場合は、`--kms-key-arn` オプションを指定して [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) コマンドを実行します。

```
aws lambda update-function-code \
  --function-name myFunction \
  --s3-bucket amzn-s3-demo-bucket \
  --s3-key myFileName.zip \
  --s3-object-version myObject Version
  --source-kms-key-arn arn:aws:kms:us-east-1:111122223333:key/key-id
```

**既存の関数からカスタマーマネージドキーの暗号化を削除するには**

次の [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) の例では、`--zip-file` で .zip デプロイパッケージのローカルパスを指定します。`--source-kms-key-arn` オプションを指定せずにこのコマンドを実行すると、Lambda は AWS 所有キーを使用して、zip 化されたバージョンのデプロイパッケージを暗号化します。

```
aws lambda update-function-code \
  --function-name myFunction \
  --zip-file fileb://myFunction.zip
```

------