AWS SDK for PHP 버전 3에서 DynamoDB 세션 핸들러 사용 - AWS SDK for PHP

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS SDK for PHP 버전 3에서 DynamoDB 세션 핸들러 사용

DynamoDB 세션 핸들러는 개발자가 Amazon DynamoDB를 세션 저장소로 사용할 수 있는 PHP용 사용자 지정 세션 핸들러입니다. DynamoDB를 세션 스토리지로 사용하면 세션을 로컬 파일 시스템에서 공유 위치로 이동하여 분산 웹 애플리케이션에서 세션 처리 중에 발생하는 문제를 완화할 수 있습니다. DynamoDB는 빠르고 확장 가능하며 설정이 쉬우며 데이터 복제를 자동으로 처리합니다.

DynamoDB 세션 핸들러는 진정한 드롭인 교체가 가능하도록 session_set_save_handler() 함수를 사용하여 DynamoDB 작업을 PHP의 고유 세션 함수에 후크합니다. 여기에는 PHP의 기본 세션 핸들러의 일부인 세션 잠금 및 가비지 수집과 같은 기능에 대한 지원이 포함됩니다.

DynamoDB 서비스에 대한 자세한 내용은 Amazon DynamoDB. 홈 페이지를 참조하세요.

기본 사용법

1단계: 핸들러 등록

먼저 세션 핸들러를 인스턴스화하고 등록합니다.

use Aws\DynamoDb\SessionHandler; $dynamoDb = new Aws\DynamoDb\DynamoDbClient([ 'region'=>'us-east-1' // Since version 3.277.10 of the SDK, ]); // the 'version' parameter defaults to 'latest'. $sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions' ]); $sessionHandler->register();

2단계. 세션을 저장할 테이블 생성

실제로 세션 핸들러를 사용하기 전에 먼저 세션을 저장할 테이블을 생성해야 합니다. Amazon DynamoDB용 AWS 콘솔을 사용하거나 AWS SDK for PHP를 사용하여 이 작업을 사전에 수행할 수 있습니다.

이 테이블을 생성할 때는 'id'를 기본 키 이름으로 사용합니다. 또한 세션의 자동 가비지 수집을 이용하려면 'expires' 속성을 사용해 Time To Live 속성을 설정하는 것이 좋습니다.

3단계. 일반적인 방식으로 PHP 세션 사용

세션 핸들러가 등록되고 테이블이 생성된 후에는 일반적으로 PHP의 기본 세션 핸들러를 사용할 때와 똑같은 방식으로 $_SESSION superglobal을 사용하여 세션에서 쓰고 읽을 수 있습니다. DynamoDB 세션 핸들러는 DynamoDB와의 상호 작용을 캡슐화하고 추상화하며 이 핸들러를 통해 PHP의 고유 세션 함수와 인터페이스를 쉽게 사용할 수 있습니다.

// Start the session session_start(); // Alter the session data $_SESSION['user.name'] = 'jeremy'; $_SESSION['user.role'] = 'admin'; // Close the session (optional, but recommended) session_write_close();

구성

다음 옵션을 사용하여 세션 핸들러의 동작을 구성할 수 있습니다. 모든 옵션은 선택 사항이지만, 기본값이 무엇인지 이해해야 합니다.

table_name

세션을 저장할 DynamoDB 테이블의 이름입니다. 기본값은 'sessions'입니다.

hash_key

DynamoDB 세션 테이블에 있는 해시 키의 이름입니다. 기본값은 'id'입니다.

data_attribute

세션 데이터가 저장된 DynamoDB 세션 테이블에 있는 속성의 이름입니다. 기본값은 'data'입니다.

data_attribute_type

세션 데이터가 저장된 DynamoDB 세션 테이블에 있는 속성의 유형입니다. 기본값은 'string'이지만, 선택에 따라 'binary'으로 설정할 수 있습니다.

session_lifetime

가비지 수집되기 전 비활성 세션의 수명입니다. 이 옵션을 제공하지 않으면 사용되는 실제 수명 값은 ini_get('session.gc_maxlifetime')입니다.

session_lifetime_attribute

세션 만료 시간이 저장된 DynamoDB 세션 테이블에 있는 속성의 이름입니다. 기본값은 'expires'입니다.

consistent_read

세션 핸들러가 GetItem 작업에 일관된 읽기를 사용하는지 여부입니다. 기본값은 true입니다.

locking

세션 잠금을 사용할지 여부입니다. 기본값은 false입니다.

batch_config

가비지 수집 중에 배치 삭제하는 데 사용되는 구성입니다. 이 옵션은 DynamoDB WriteRequestBatch 객체에 직접 전달됩니다. SessionHandler::garbageCollect()를 통해 가비지 수집을 수동으로 트리거합니다.

max_lock_wait_time

세션 핸들러가 포기하기 전에 잠금을 획득하기 위해 대기해야 하는 최대 시간(초)입니다. 기본값은 10이며 세션 잠금에만 사용됩니다.

min_lock_retry_microtime

세션 핸들러가 잠금을 획득하기 위한 시도 간에 대기해야 하는 최소 시간(마이크로초)입니다. 기본값은 10000이며 세션 잠금에만 사용됩니다.

max_lock_retry_microtime

세션 핸들러가 잠금을 획득하기 위한 시도 간에 대기해야 하는 최대 시간(마이크로초)입니다. 기본값은 50000이며 세션 잠금에만 사용됩니다.

세션 핸들러를 구성하려면 핸들러를 인스턴스화할 때 구성 옵션을 지정합니다. 다음 코드는 모든 구성 옵션이 지정된 예제입니다.

$sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions', 'hash_key' => 'id', 'data_attribute' => 'data', 'data_attribute_type' => 'string', 'session_lifetime' => 3600, 'session_lifetime_attribute' => 'expires', 'consistent_read' => true, 'locking' => false, 'batch_config' => [], 'max_lock_wait_time' => 10, 'min_lock_retry_microtime' => 5000, 'max_lock_retry_microtime' => 50000, ]);

요금

데이터 스토리지 및 데이터 전송 요금과 별도로, 테이블의 프로비저닝된 처리 능력을 기반으로 DynamoDB 사용과 관련된 비용이 계산됩니다(Amazon DynamoDB 요금 내역 참조). 처리량은 쓰기 용량 및 읽기 용량 단위로 측정됩니다. Amazon DynamoDB 홈페이지에는 다음과 같이 나와 있습니다.

읽기 용량 단위는 4KB 크기의 항목에 대해 초당 하나의 강력히 일관된 읽기(또는 초당 두 개의 최종적 일관된 읽기)를 나타냅니다. 쓰기 용량 단위는 1KB 크기의 항목에 대해 초당 하나의 쓰기를 나타냅니다.

궁극적으로 세션 테이블에 필요한 처리량과 비용은 예상 트래픽 및 세션 크기와 관련됩니다. 다음 표에서는 각 세션 함수에 대해 DynamoDB 테이블에서 수행되는 읽기 및 쓰기 작업의 양을 설명합니다.

session_start()를 통한 읽기

  • 1개의 읽기 작업입니다(consistent_readfalse인 경우 0.5만).

  • (조건부) 세션이 만료된 경우 세션을 삭제하기 위한 1개의 쓰기 작업입니다.

session_start()를 통한 읽기(세션 잠금 사용)

  • 최소 1개의 쓰기 작업입니다.

  • (조건부) 세션에서 잠금 획득 시 각 시도에 대해 추가 쓰기 작업입니다. 구성된 잠금 대기 시간 및 재시도 옵션을 기반으로 합니다.

  • (조건부) 세션이 만료된 경우 세션을 삭제하기 위한 1개의 쓰기 작업입니다.

session_write_close()를 통한 쓰기

  • 1개의 쓰기 작업입니다.

session_destroy()를 통한 삭제

  • 1개의 쓰기 작업입니다.

가비지 수집

  • 만료된 세션에 대해 스캔할 테이블의 데이터 4KB당 0.5개의 읽기 작업입니다.

  • 삭제할 만료된 항목당 1개의 쓰기 작업입니다.

세션 잠금

DynamoDB 세션 핸들러는 PHP의 기본 세션 핸들러 동작을 모방하는 수동적 세션 잠금을 지원합니다. 특히 애플리케이션이 Ajax 요청이나 iframe을 사용하는 DynamoDB 세션에 액세스하는 경우 이 기능으로 인해 성능 병목 현상이 발생하고 비용이 급상승할 수 있기 때문에, 기본적으로 DynamoDB 세션 핸들러에서는 이 기능이 꺼져 있습니다. 이 기능을 활성화하기 전에 애플리케이션에 세션 잠금이 필요한지 여부를 신중하게 고려하세요.

세션 잠금을 활성화하려면 'locking'를 인스턴스화할 때 true 옵션을 SessionHandler로 설정합니다.

$sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions', 'locking' => true, ]);

가비지 수집

'expires' 속성을 사용해 DynamoDB 테이블에 TTL 속성을 설정합니다. 그러면 세션에서 가비지를 자동으로 수집하기 때문에 직접 가비지를 수집할 필요 없습니다.

또한 DynamoDB 세션 핸들러는 일련의 ScanBatchWriteItem 작업을 사용하여 세션 가비지 수집을 지원합니다. Scan 작업이 작동하는 방식의 특성 때문에 그리고 모든 만료된 세션을 찾아서 삭제하기 위해 가비지 수집 프로세스에는 많은 프로비저닝된 처리량이 필요합니다.

따라서 이를 통해 자동 가비지 수거를 지원하지 않습니다. 더 좋은 방법은 사용되는 처리량의 급증으로 인해 나머지 애플리케이션이 중단되지 않도록 피크가 아닌 시간에 가비지 수집 실행을 예약하는 것입니다. 예를 들어, 가비지 수집을 실행할 야간 cron 작업 트리거 스크립트가 있을 수 있습니다. 이 스크립트를 실행하려면 다음과 같은 작업을 수행해야 합니다.

$sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions', 'batch_config' => [ 'batch_size' => 25, 'before' => function ($command) { echo "About to delete a batch of expired sessions.\n"; } ] ]); $sessionHandler->garbageCollect();

또한 'before' 내에서 'batch_config' 옵션을 사용하여 가비지 수입 프로세스에서 수행되는 BatchWriteItem 작업에 지연을 도입할 수 있습니다. 이렇게 하면 가비지 수집이 완료되는 데 걸리는 시간의 양이 증가하지만, DynamoDB 세션 핸들러에서 수행되는 요청을 분산하여 가비지 수집 중에 프로비저닝된 처리 능력에 근접하거나 범위 이내로 처리량을 유지할 수 있습니다.

$sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions', 'batch_config' => [ 'before' => function ($command) { $command['@http']['delay'] = 5000; } ] ]); $sessionHandler->garbageCollect();

모범 사례

  1. 애플리케이션 서버와 지리적으로 가장 가까운 AWS 리전 또는 동일한 리전에서 세션을 생성합니다. 이렇게 하면 애플리케이션과 DynamoDB 데이터베이스 간에 지연 시간을 최소화할 수 있습니다.

  2. 세션 테이블의 프로비저닝된 처리 능력을 신중하게 선택합니다. 애플리케이션의 예상 트래픽과 세션의 예상 크기를 고려합니다. 또는 테이블에 '온디맨드' 읽기/쓰기 용량 모드를 사용합니다.

  3. AWS Management Console 또는 Amazon CloudWatch를 통해 사용되는 처리량을 모니터링하고 필요에 따라 애플리케이션의 수요에 맞게 처리량을 조정합니다.

  4. 세션 크기를 작게 유지합니다(1KB 미만이 이상적). 작은 세션이 더 좋은 성능을 나타내며 필요한 프로비저닝된 처리 능력이 더 적습니다.

  5. 애플리케이션에 필요하지 않은 한 세션 잠금을 사용하지 마세요.

  6. PHP의 내장 세션 가비지 수집 트리거를 사용하는 대신, cron 작업 또는 다른 예약 메커니즘을 통해 피크가 아닌 시간 중에 실행되도록 가비지 수집을 예약합니다. 'batch_config' 옵션을 유리하게 사용합니다.

필수 IAM 권한

DynamoDB 세션 핸들러를 사용하려면 구성된 자격 증명이전 단계에서 생성한 DynamoDB 테이블을 사용할 권한이 있어야 합니다. 다음 IAM 정책에는 필요한 최소 권한이 포함되어 있습니다. 이 정책을 사용하려면 리소스 값을 이전에 생성한 테이블의 Amazon Resource Name (ARN)으로 바꿉니다. IAM 정책 생성 및 첨부에 대한 자세한 내용은 IAM 사용 설명서의 관리형 IAM 정책을 참조하세요.

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "dynamodb:GetItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:Scan", "dynamodb:BatchWriteItem" ], "Effect": "Allow", "Resource": "arn:aws:dynamodb:<region>:<account-id>:table/<table-name>" } ] }