AWS Lambda 지속적인 실행 데이터 암호화
AWS Lambda 내구성 함수를 사용하면 체크포인트를 활용하여 완료된 작업을 재생함으로써 각 실행을 실패로부터 복구할 수 있으므로 최대 1년까지 실행되는 복원력이 뛰어난 다단계 애플리케이션을 구축할 수 있습니다.
Lambda는 항상 지속적인 실행 저장 데이터를 암호화합니다. 교체 제어, 감사 가시성 또는 규정 준수를 위해 함수에 자체 AWS KMS 고객 관리형 키를 추가로 구성할 수 있습니다. 고객 관리형 키를 사용하면 권한을 부여받은 위탁자만 실행 데이터를 읽을 수 있습니다.
암호화 작동 방식
Lambda 지속적인 실행은 시작 시 사용한 동일한 KMS 키를 전체 수명 동안 사용합니다. 함수의 키를 변경하거나 제거할 경우 변경 후 시작되는 실행에만 영향이 있습니다. 키를 사용할 수 없을 때 지속적인 실행의 작동 방식은 고객 관리형 키를 사용할 수 없는 경우 섹션을 참조하세요.
고객 관리형 키에는 표준 AWS KMS 요금이 발생합니다. 요금에 대한 자세한 내용은 AWS Key Management Service 요금
암호화 대상
내구성 함수에서 고객 관리형 키를 구성하면 Lambda는 해당 키를 사용하여 다음과 같은 지속적인 실행 저장 데이터를 암호화합니다.
각
Invoke요청과 함께 전달하는 입력 페이로드단계 결과, 단계 오류, 연결된 간접 호출 입력을 포함하여
CheckpointDurableExecutionAPI에서 유지되는 체크포인트 데이터실행 결과 및 오류
SendDurableExecutionCallbackSuccess및SendDurableExecutionCallbackFailure를 통해 제출하는 콜백 결과 및 오류
함수 수준 키와 지속적인 실행 키는 서로 독립적임
환경 변수, KMSKeyArn .zip 배포 패키지 및 SnapStart 스냅샷을 암호화하는 함수 수준 은 지속적인 실행 데이터를 암호화하는 DurableConfig의 KMSKeyArn과 별개입니다 하나를 설정한다고 해서 다른 하나가 설정되는 것은 아닙니다. 둘 다에 동일한 KMS 키를 사용하거나 서로 다른 KMS 키를 사용할 수 있습니다.
고객 관리형 키 암호화 설정
내구성 함수에 대한 고객 관리형 키 암호화 설정은 3단계 프로세스입니다. 다음 단계를 순서대로 완료하세요.
고객 관리형 키 만들기
내구성 함수는 함수와 동일한 AWS 리전에서 대칭 암호화 KMS 키를 지원합니다. 교차 리전 키는 지원되지 않습니다. 대칭 고객 관리형 키를 생성하려면 AWS Key Management Service 개발자 안내서의 대칭 암호화 KMS 키 생성 단계를 따르세요.
권한
KMS 키의 키 정책을 통해 AWS KMS에 권한을 부여합니다.
고객 관리형 키를 구성하려면 함수를 생성하거나 업데이트하는 위탁자에 대한 AWS KMS 권한이 필요합니다. 내구성 함수를 간접적으로 호출할 때는 호출자에 대한 AWS KMS 권한이 필요하지 않습니다. Lambda는 서비스 위탁자를 사용하여 암호화를 수행합니다.
키 정책
키 정책에서는 고객 관리형 키에 대한 액세스를 제어합니다. 모든 고객 관리형 키에는 정확히 하나의 키 정책이 있어야 합니다. 키 정책에서 Resource: "*"는 해당 정책이 연결된 KMS 키만 나타내며, 계정에 있는 모든 KMS 키를 나타내는 것은 아닙니다.
내구성 함수의 키 정책은 각 위탁자에게 필요한 AWS KMS 작업만 부여하며, 이는 서비스 및 함수 ARN으로 범위가 지정됩니다. 다음 섹션에서는 문, 조건 및 전체 예제를 설명합니다.
필수 정책 설명
이 정책은 다음 기능을 부여합니다.
IAM 사용자 권한 활성화 계정 루트에 키를 관리할 수 있는 무조건 액세스 권한을 부여합니다. 이 설명은 조건을 사용하지 않습니다. 범위를 지정하면 키를 교체, 업데이트 또는 삭제할 수 없기 때문입니다.
Lambda가 내구성 함수에 이 키를 사용할 수 있도록 허용합니다. Lambda 서비스 위탁자에게
kms:GenerateDataKey및kms:Decrypt를 부여합니다.함수 실행 역할이 지속적인 실행 데이터를 복호화할 수 있도록 허용합니다. 실행 역할에 상태를 읽고 실행을 진행하기 위한
kms:Decrypt권한을 부여합니다.함수 작성자가 이 키를 설명할 수 있도록 허용합니다. Lambda가
CreateFunction또는UpdateFunctionConfiguration중에 키가 대칭이고 활성화되었는지 확인할 수 있도록kms:DescribeKey권한을 부여합니다.함수 작성자가 특정 함수에 대해 이 키를 검증할 수 있도록 허용합니다. Lambda가
CreateFunction또는UpdateFunctionConfiguration중 함수의 암호화 컨텍스트를 사용하여 키 권한과 액세스를 검증할 수 있도록kms:GenerateDataKey및kms:Decrypt권한을 부여합니다. 이를 통해 함수가 생성되거나 업데이트되기 전에 키 정책이 이 특정 함수에 대한 직접 호출을 수락하는지 확인합니다.지속적인 실행 운영자를 허용합니다. 운영자에게
GetDurableExecution,IncludeExecutionData=true로 설정된GetDurableExecutionHistory,GetDurableExecutionState,StopDurableExecution및 콜백 API 직접 호출을 위한kms:Decrypt권한을 부여합니다.
실행 역할, 함수 작성자 및 지속적인 실행 운영자에 대해 별도의 위탁자를 사용하여 각 ID가 필요한 기능만 갖도록 하는 것이 가장 좋습니다.
권장 정책 조건
이 정책은 다음 조건을 사용하여 액세스 범위를 제한합니다.
kms:ViaService는 Lambda를 통해 라우팅되는 요청으로 키 사용을 제한합니다. 이를 실행 역할, 함수 작성자 및 운영자 문에 적용하면 AWS KMS를 통해 직접 키를 사용할 수 없습니다.aws:SourceArn과aws:SourceAccount는 교차 서비스 혼동된 대리자 문제를 방지합니다. Lambda는 자체 서비스 자격 증명을 사용하여 AWS KMS를 직접적으로 호출할 때 이들 값을 전달합니다. 이 조건은 Lambda 서비스 위탁자 문에만 적용됩니다. 실행 역할, 함수 작성자 및 운영자 문은 이러한 헤더를 포함하지 않는 호출자의 전달 액세스 세션 자격 증명을 사용하여 AWS KMS를 직접적으로 호출합니다.kms:EncryptionContext:aws:lambda:FunctionArn은 키의 범위를 특정 함수로 지정합니다. Lambda는 지속적인 실행 데이터에 대한 모든 AWS KMS 직접 호출 시 암호화 컨텍스트에 이를 추가합니다.
다음 예제에서는 위의 문과 조건을 결합한 것입니다.
예내구성 함수에 대한 키 정책
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow Lambda to use this key for durable functions", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333", "aws:SourceArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction", "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction" } } }, { "Sid": "Allow the function execution role to decrypt durable execution data", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/myDurableFunctionRole" }, "Action": "kms:Decrypt", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "lambda.us-east-1.amazonaws.com", "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction" } } }, { "Sid": "Allow the function author to describe this key", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/FunctionAuthor" }, "Action": "kms:DescribeKey", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "lambda.us-east-1.amazonaws.com" } } }, { "Sid": "Allow the function author to validate this key for a specific function", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/FunctionAuthor" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "lambda.us-east-1.amazonaws.com", "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction" } } }, { "Sid": "Allow durable execution operators", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/DurableExecutionOperator" }, "Action": "kms:Decrypt", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "lambda.us-east-1.amazonaws.com", "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction" } } } ] }
AWS KMS 키 정책에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서의 키 정책 변경 방법을 참조하세요.
내구성 함수에 대한 고객 관리형 키 구성
DurableConfig 객체의 KMSKeyArn 필드를 통해 지속적인 실행 데이터를 위한 고객 관리형 키를 구성합니다. CreateFunction을 사용하여 함수를 생성할 때 키를 설정하고, UpdateFunctionConfiguration을 사용하여 기존 내구성 함수에서 키를 업데이트합니다.
중요
각 지속적인 실행은 시작 시 함수에 구성된 고객 관리형 키를 사용합니다. 키를 변경하거나 제거하면 변경 후 시작되는 실행에만 영향이 있으며, 진행 중인 실행은 완료되거나 실패할 때까지 시작 시 사용한 키를 계속 사용합니다.
지속적인 실행 데이터 읽기
두 개의 읽기 API가 지속적인 실행 데이터를 반환합니다.
GetDurableExecution는 입력 페이로드, 최신 체크포인트 데이터, 결과 또는 오류 정보를 포함하여 단일 실행의 현재 상태를 반환합니다.GetDurableExecutionHistory는 실행 과정에서 발생된 이벤트의 정렬된 목록을 반환하며 여기에는 체크포인트 입력 및 결과, 연결된 간접 호출 입력 및 결과, 최종 결과가 포함됩니다.
두 API 모두 IncludeExecutionData 요청 파라미터를 수락합니다. IncludeExecutionData가 true이면 Lambda는 호출자의 자격 증명을 사용하여 고객 관리형 키에서 kms:Decrypt를 직접적으로 호출합니다. 그런 다음 Lambda는 복호화된 실행 데이터를 응답으로 반환합니다. 호출자의 ID는 고객 관리형 키에 kms:Decrypt가 있어야 합니다.
IncludeExecutionData가 false이면 Lambda는 AWS KMS를 직접적으로 호출하거나 실행 데이터를 복호화하지 않고 응답은 ExecutionDataIncluded를 false로 설정합니다. 응답에는 여전히 DurableConfig가 포함되어 있으며, 이는 실행에 사용된 고객 관리형 키 ARN이 반영되어 있습니다. IncludeExecutionData는 기본적으로 false이므로 메타데이터만 필요한 호출자는 AWS KMS 권한이 필요하지 않습니다.
예제: IncludeExecutionData=false인 GetDurableExecution 응답
{ "DurableExecutionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction:execution:exec-abc123", "DurableExecutionName": "exec-abc123", "FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:myDurableFunction", "StartTimestamp": 1733256000, "Status": "RUNNING", "ExecutionDataIncluded": false, "DurableConfig": { "ExecutionTimeout": 3600, "KMSKeyArn": "arn:aws:kms:us-east-1:111122223333:key/key-id", "RetentionPeriodInDays": 30 } }
연결된 간접 호출
내구성 함수가 연결된 간접 호출을 사용하여 다른 내구성 함수를 직접적으로 호출하는 경우 Lambda는 하위 실행을 독립적인 지속적인 실행으로 처리합니다. 즉, 자체 실행 ID, 자체 체크포인트 스트림 및 자체 고객 관리형 키가 있습니다. 상위의 고객 관리형 키 구성은 하위의 데이터에 영향을 주지 않으며 하위의 고객 관리형 키 구성은 상위의 데이터에 영향을 주지 않습니다.
권한
Lambda 서비스 위탁자는 하위 함수의 고객 관리형 키에 대해 kms:GenerateDataKey 및 kms:Decrypt 권한을 보유해야 합니다. 상위 함수와 하위 함수가 서로 다른 고객 관리형 키를 사용하는 경우 서비스 위탁자에게 각 키에 대한 액세스 권한을 별도로 부여합니다. 상위 함수의 실행 역할에는 하위 함수의 고객 관리형 키에 대한 권한이 필요하지 않습니다.
어떤 키가 어떤 실행을 암호화했는지 식별
GetDurableExecution과 ListDurableExecutionsByFunction 모두 각 실행을 암호화한 고객 관리형 키 ARN을 반환합니다. 이러한 API를 사용하여 상위 또는 하위 실행이 시작될 때 어떤 키가 적용되었는지 확인합니다.
데이터 키 캐싱
Lambda는 AWS KMS 직접 호출 볼륨을 줄이고 서비스 중단 시 가용성을 높이기 위해 고객 관리형 키에서 생성된 데이터 키를 최대 15분 동안 캐싱합니다. 캐시가 웜 상태인 동안 Lambda는 실행 내의 여러 작업과 캐시 기간 동안 시작된 여러 실행에 걸쳐 동일한 데이터 키를 재사용합니다.
비용
Lambda는 체크포인트당 한 번이 아니라 캐시 기간당 최대 한 번 GenerateDataKey를 직접적으로 호출하기 때문에 실행당 AWS KMS 비용은 낮게 유지됩니다. 요청 속도가 높을수록 더 많은 실행이 캐싱된 각 데이터 키를 공유하므로 실행당 비용이 더욱 감소합니다. 요금은 Lambda가 실제로 수행하는 AWS KMS 직접 호출에 대해서만 청구되며, 모든 체크포인트나 읽기 작업에 대해서는 청구되지 않습니다.
정적 안정성
데이터 키는 최대 15분 동안 캐시에 저장됩니다. 키 변경 사항은 다음 캐시 새로 고침 시 적용됩니다. 서비스 중단이 길어지는 동안 Lambda는 캐시에서 계속 데이터를 제공하여 진행 중인 실행을 유지합니다.
CloudTrail
데이터 키 캐싱으로 인해 CloudTrail에는 실행 횟수 또는 체크포인트 수보다 적은 GenerateDataKey 이벤트가 표시됩니다. 예제 이벤트는 내구성 함수를 위한 KMS 키 모니터링 섹션을 참조하세요.
고객 관리형 키를 사용할 수 없는 경우
실행 시작 시 사용한 고객 관리형 키가 비활성화되었거나, 삭제가 예약되었거나, 키 정책을 통해 액세스가 취소된 경우 실행이 더 이상 진행될 수 없습니다. 다음 체크포인트에서 Lambda는 재시도할 수 없는 AWS KMS 오류와 함께 실행에 실패합니다. 키에 대한 액세스를 복원해도 실행이 자동으로 재개되지 않습니다. 새 실행을 시작해야 합니다.
키를 사용할 수 없는 경우에도 페이로드를 읽거나 쓰는 API가 실패합니다. 다음 예외 중 하나를 반환할 수 있습니다.
KMSAccessDeniedException: KMS 키에 대한 액세스가 거부되어 Lambda가 지속적인 실행 데이터를 복호화할 수 없습니다.KMSDisabledException: KMS 키가 비활성화되어 있어 Lambda가 지속적인 실행 데이터를 복호화할 수 없습니다.KMSInvalidStateException: KMS 키의 상태가Decrypt에 유효하지 않아 Lambda가 지속적인 실행 데이터를 복호화할 수 없습니다.KMSNotFoundException: KMS 키를 찾을 수 없어 Lambda가 지속적인 실행 데이터를 복호화할 수 없습니다.
KMS 키에 대한 액세스를 복원하면 이미 실패한 실행에 대해 이러한 읽기 API가 다시 성공할 수 있습니다. 실패한 실행은 실패 상태로 유지되므로 새 실행을 시작해야 합니다.
KMS 키를 사용할 수 없는 동안 실행 메타데이터를 검사하려면 IncludeExecutionData=false를 사용하여 GetDurableExecution을 직접적으로 호출합니다. 그러면 AWS KMS를 직접적으로 호출하지 않고 실행 상태, 타임스탬프 및 DurableConfig(KMS 키 ARN 포함)가 반환됩니다.
Lambda는 데이터 키를 캐싱하므로 키를 비활성화해도 즉시 적용되지 않습니다. 자세한 내용은 데이터 키 캐싱을 참조하세요.
중요
진행 중이거나 유지된 실행이 여전히 의존하는 KMS 키를 삭제하면 해당 실행과 기록이 영구적으로 삭제됩니다.
내구성 함수를 위한 KMS 키 모니터링
내구성 함수와 함께 고객 관리형 키를 사용하는 경우 AWS CloudTrail을 사용하여 Lambda가 사용자 대신하여 수행하는 AWS KMS 직접 호출을 추적할 수 있습니다. AWS KMS 이벤트 검색에 대한 일반적인 지침은 AWS KMS API 활동 검색을 참조하세요.
Lambda가 의도한 대로 키를 사용하고 있는지 확인하려면 각 이벤트에서 다음 필드를 찾습니다.
eventName:GenerateDataKey,Decrypt또는DescribeKey중 하나입니다.eventSource:kms.amazonaws.com.rproxy.govskope.causerIdentity.invokedBy:lambda.amazonaws.com.rproxy.govskope.carequestParameters.encryptionContext.aws:lambda:FunctionArn: 내구성 함수의 ARN
다음 예제는 내구성 함수에서 고객 관리형 키를 구성하는 CreateFunction 또는 UpdateFunctionConfiguration 직접 호출의 CloudTrail 이벤트입니다. Lambda는 키를 검증하기 위해 세 개의 AWS KMS 직접 호출(실제 DescribeKey와 드라이런 GenerateDataKey 및 Decrypt)을 수행합니다.