소개
임시 세션 레코드는 스토리지 정리가 아직 이루어지지 않았더라도 만료 시점부터 제공을 중단해야 합니다. TTL을 활성화하고 잘못된 타입의 만료 속성을 수정한 다음, 제공된 애플리케이션이 실제 서비스 읽기를 통해 만료 데이터를 제외하도록 설정합니다.
주문용 DynamoDB 테이블 생성과 파티션 키와 정렬 키로 주문 쿼리 실습을 먼저 완료하세요. 새 환경에는 독립적인 세션 테이블, 세 개의 가상 레코드, 읽기 도구의 틀이 제공됩니다. TTL과 읽기 필터를 직접 설정하면 됩니다. /home/labex/project, 공식 AWS CLI, AWS View를 사용하세요. 이 실습은 TTL 설정과 만료를 고려한 읽기를 평가하며 AWS 백그라운드 삭제의 완료 시한을 보장하지 않습니다.
인증 시험 관련 주제
| 인증 | 시험 태스크 | 실습 내용 |
|---|---|---|
| Developer – Associate (DVA-C02) | 태스크 1.3 | DynamoDB TTL 설정과 만료를 고려한 읽기. |
| Data Engineer – Associate (DEA-C01) | 태스크 2.3 | 기초 실습: DynamoDB TTL 설정과 만료를 고려한 읽기. |
실습 개요

준비된 세션 테이블에서 만료 활성화
이 단계에서는 테이블의 만료 속성을 설정합니다. Time to Live (TTL)는 DynamoDB가 만료된 항목을 나중에 제거할 수 있게 합니다. 이는 비동기 정리 작업이며 각 항목을 정확한 만료 초에 삭제하는 타이머가 아닙니다. 서비스 삭제를 기다리는 동안에도 애플리케이션은 만료된 데이터를 거부해야 합니다.
이 세션 리더에서는 레코드를 애플리케이션에 제공할 수 있는지와 저장소에서 삭제되었는지가 별개의 결과입니다. TTL 상태를 확인하고 만료 속성의 타입을 수정한 뒤 애플리케이션 결과와 직접 읽기를 비교합니다. ENABLED는 설정을 입증합니다. 만료된 세션을 제외한 결과는 읽기 정책을 입증할 뿐 서비스가 항목을 삭제했다는 뜻은 아닙니다.
새 환경에는 활성, 만료, 영구 상태의 가상 레코드가 있는 세션 테이블이 포함되어 있습니다. 활성화하기 전에 타입과 비활성화된 TTL 상태를 검사하세요.
cd /home/labex/project
aws dynamodb scan --table-name labex-d05-sessions --consistent-read
aws dynamodb describe-time-to-live --table-name labex-d05-sessions
expires_at에 TTL을 활성화하세요. 각 항목은 자체 만료 시간을 제공합니다. 테이블 설정은 TTL 서비스가 검사할 속성을 선택합니다. 속성이 없으면 해당 항목에는 TTL 만료가 없습니다.
aws dynamodb update-time-to-live \
--table-name labex-d05-sessions \
--time-to-live-specification Enabled=true,AttributeName=expires_at
aws dynamodb describe-time-to-live --table-name labex-d05-sessions
설명에 ENABLED와 expires_at이 표시되면 계속하세요. AWS에서는 활성화에 시간이 걸릴 수 있습니다. ENABLING 상태인 동안 설정을 반복해서 변경하지 말고 describe 명령을 반복하세요. 위쪽 AWS View에서 세션 카드 안의 TTL 항목을 펼치세요.
만료된 레코드의 속성 타입 수정
이 단계에서는 유효한 만료 값을 저장합니다. DynamoDB TTL에는 Unix epoch 초를 담은 Number가 필요합니다. 이는 1970-01-01 UTC부터 지난 초입니다. 밀리초를 사용하면 먼 미래의 시간이 됩니다. 타임스탬프처럼 보이는 문자열도 여전히 String이며 TTL 프로세스는 이를 무시합니다.
정확한 키로 준비된 만료 레코드를 검사하세요. 해당 expires_at은 의도적으로 S로 인코딩되어 있습니다. TTL 활성화는 이 타입을 수정하지 않았습니다.
aws dynamodb get-item \
--table-name labex-d05-sessions \
--key '{"session_id":{"S":"expired"}}' \
--consistent-read
Linux date 명령으로 한 시간 전의 만료 시간을 계산하세요. +%s는 Unix 초를 출력하고 $(...)는 그 출력을 EXPIRED에 저장합니다. 값은 실행할 때마다 달라지며 현재보다 이전이어야 합니다.
EXPIRED=$(date -u -d '1 hour ago' +%s)
echo "$EXPIRED"
타입이 지정된 값을 작은 JSON 파일에 넣으세요. 이 heredoc은 따옴표로 감싸지 않은 JSON 구분자를 사용하므로 셸이 $EXPIRED를 타임스탬프로 치환합니다. 이전의 따옴표로 감싼 구분자는 값을 그대로 유지했습니다. JSON을 파일에 보관하면 따옴표를 이스케이프할 필요가 없습니다.
cat > expiry-values.json <<JSON
{":expires":{"N":"$EXPIRED"}}
JSON
UpdateItem으로 만료 속성만 교체하세요. file://는 값 파일을 로드합니다. 존재 조건은 비동기 삭제로 이미 제거된 레코드를 다시 생성하지 않도록 합니다.
aws dynamodb update-item \
--table-name labex-d05-sessions \
--key '{"session_id":{"S":"expired"}}' \
--update-expression 'SET expires_at = :expires' \
--condition-expression 'attribute_exists(session_id)' \
--expression-attribute-values file://expiry-values.json \
--return-values ALL_NEW
반환된 만료 항목은 과거의 expires_at: {"N": "..."}를 가지며 purpose를 유지합니다. 활성 항목은 미래의 만료 시간을 유지하고 영구 항목에는 여전히 만료가 없습니다. AWS에서 이후 읽기나 수정 전에 레코드가 제거되었다면, 연결 실패가 아니라 성공한 서비스 응답으로 확인한 경우에만 삭제로 판단하세요.
애플리케이션 읽기 경로에서 만료 데이터 제외
이 단계에서는 TTL 정리를 기다리는 동안 읽기를 보호합니다. 제공된 session-reader 애플리케이션은 일반적인 session-reader.json 설정을 읽고 실제 Scan 요청을 수행합니다. 기본 설정은 의도적으로 만료 데이터도 반환합니다. 애플리케이션 소스는 검사할 수 있으며 Python을 작성할 필요는 없습니다.
./session-reader
이 환경에서 필터가 없는 읽기 도구는 만료 레코드를 포함한 세 레코드를 여전히 모두 반환합니다. 이것이 TTL 설정 오류를 입증하지는 않습니다. AWS 백그라운드 삭제는 나중에 이루어질 수 있으며 이 실습의 승인 기준에는 정확한 일정이 포함되지 않습니다.
애플리케이션의 만료 필터를 활성화하세요. 따옴표로 감싼 heredoc은 JSON을 그대로 기록해 설정 파일을 교체합니다.
cat > session-reader.json <<'JSON'
{
"table": "labex-d05-sessions",
"filter_expired": true
}
JSON
./session-reader
애플리케이션은 현재 Number 타입의 초 단위 값과 함께 attribute_not_exists(expires_at) OR expires_at > :now를 사용하고 Scan 연속 조회 키를 따라갑니다. 이제 active와 permanent만 반환하며 Count 2와 FilterExpired true를 표시합니다. 영구 레코드는 만료 정책이 없으므로 의도적으로 포함됩니다. 필터링은 만료 데이터 제공을 막지만 스캔의 읽기 작업을 되돌리지는 않습니다.

필터 없는 키 기반 읽기와 애플리케이션 결과를 비교하세요.
aws dynamodb get-item \
--table-name labex-d05-sessions \
--key '{"session_id":{"S":"expired"}}' \
--consistent-read
필터 없는 읽기에는 expired가 여전히 포함될 수 있지만 애플리케이션은 이를 제외합니다. AWS가 이미 삭제했다면 성공한 빈 GetItem도 TTL 동작과 부합합니다. AWS View는 필터링이 저장된 레코드를 물리적으로 삭제한 것처럼 표시하지 않고 TTL 설정과 실제 두 항목의 읽기 도구 결과를 보여 줍니다.

소유한 세션 테이블 제거
이 단계에서는 만료 설정과 애플리케이션 동작을 검증한 뒤 테이블을 명시적으로 정리합니다. TTL이 테이블 전체를 제거하기를 기다리지 마세요. TTL은 테이블 자체가 아니라 항목을 삭제합니다. 이 일회성 테이블을 삭제하면 TTL 설정도 제거됩니다.
aws dynamodb delete-table --table-name labex-d05-sessions
aws dynamodb wait table-not-exists --table-name labex-d05-sessions
aws dynamodb list-tables
aws dynamodb get-item \
--table-name labex-d05-reference \
--key '{"id":{"S":"platform"}}' \
--consistent-read
참조 테이블만 남고 그 note는 keep unchanged입니다. 성공한 목록 조회와 참조 읽기는 삭제 후에도 연결이 작동함을 입증합니다. AWS View에서 세션 테이블과 읽기 도구 결과가 제거됩니다. 일회성 연결은 이 VM과 함께 종료됩니다.
요약
expires_at에 TTL을 활성화하고 문자열 타임스탬프를 숫자형 epoch 초로 교체했으며, 실제 애플리케이션 읽기 경로에서 만료된 세션을 제외했습니다. 논리적 만료와 비동기 물리적 삭제를 구별하고 영구 레코드를 의도적으로 유지했습니다. 마지막으로 소유한 테이블을 삭제하고 관련 없는 참조를 보존했습니다.
자세한 내용은 AWS 공식 문서를 참고하세요: TTL 만료 및 비동기 항목 삭제.



