

# Lambda .zip 배포 패키지 암호화
<a name="encrypt-zip-package"></a>

Lambda에서는 AWS KMS key를 사용하여 .zip 배포 패키지 및 함수 구성 세부 정보에 대해 항상 저장 중 서버 측 암호화를 제공합니다. 기본적으로 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 Management Console 또는 AWS KMS API를 사용하여 대칭형 고객 관리형 키를 만들 수 있습니다.

**대칭 고객 관리형 키를 만들려면**

*AWS Key Management Service 개발자 안내서*의 [Creating symmetric encryption Creating symmetric KMS keys](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)에서는 고객 관리형 키에 대한 액세스를 제어합니다. 모든 고객 관리형 키에는 키를 사용할 수 있는 사람과 키를 사용하는 방법을 결정하는 문장이 포함된 정확히 하나의 키 정책이 있어야 합니다. 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [How to change a key policy](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html#key-policy-modifying-how-to)를 참조하세요.

고객 관리형 키를 사용하여 .zip 배포 패키지를 암호화하는 경우 Lambda는 키에 [권한 부여](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 키 액세스 제어에 대한 자세한 내용은 [Authentication and access control for 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. **함수 이름(Function name)**에 함수 이름을 입력합니다.

   1. **런타임**에서 함수에 사용할 언어 버전을 선택합니다.

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/ko_kr/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 버킷(`S3Bucket`, `S3Key`, `S3ObjectVersion`)의 .zip 파일 위치와 암호화할 고객 관리형 키(`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`: 배포 패키지의 압축된 버전을 암호화할 고객 관리형 키를 지정합니다. 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`: 배포 패키지의 압축된 버전을 암호화할 고객 관리형 키를 지정합니다. 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 소유 키를 사용하여 배포 패키지의 압축된 버전을 암호화합니다.

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

------