DynamoDB Adapter
리소스
설정
설치
npm install @auth/dynamodb-adapter @aws-sdk/lib-dynamodb @aws-sdk/client-dynamodb
환경 변수
AUTH_DYNAMODB_ID=accessKey
AUTH_DYNAMODB_SECRET=secretKey
AUTH_DYNAMODB_REGION=eu-west-1
설정
모듈형 aws-sdk
v3에서 DynamoDBDocument
클라이언트를 어댑터에 전달해야 합니다. 기본 테이블 이름은 next-auth
이지만, 어댑터의 두 번째 매개변수로 { tableName: 'your-table-name' }
을 전달하여 커스터마이즈할 수 있습니다.
./auth.ts
import NextAuth from "next-auth"
import { DynamoDB, DynamoDBClientConfig } from "@aws-sdk/client-dynamodb"
import { DynamoDBDocument } from "@aws-sdk/lib-dynamodb"
import { DynamoDBAdapter } from "@auth/dynamodb-adapter"
const config: DynamoDBClientConfig = {
credentials: {
accessKeyId: process.env.AUTH_DYNAMODB_ID,
secretAccessKey: process.env.AUTH_DYNAMODB_SECRET,
},
region: process.env.AUTH_DYNAMODB_REGION,
}
const client = DynamoDBDocument.from(new DynamoDB(config), {
marshallOptions: {
convertEmptyValues: true,
removeUndefinedValues: true,
convertClassInstanceToMap: true,
},
})
export const { handlers, auth, signIn, signOut } = NextAuth({
providers: []
adapter: DynamoDBAdapter(client),
})
AWS Credentials
AWS 서비스/리소스에 접근 권한을 부여할 때는 항상 최소 권한 원칙을 따르세요. 특정 작업을 수행하는 데 필요한 최소한의 작업만 허용해야 합니다.
- AWS 콘솔을 열고 “IAM”으로 이동한 후 “Users”를 선택하세요.
- 새로운 사용자를 생성하세요. 이 사용자의 목적은 DynamoDB에 프로그래밍 방식으로 접근할 수 있도록 하는 것입니다.
- 액세스 키를 생성한 후 Key ID와 Secret을
.env
/.env.local
파일에 복사하세요. - “Add Permission”을 선택하고 “Create Inline Policy”를 선택하세요.
- 아래 JSON을 JSON 입력란에 복사하고
region
,account_id
,table_name
을 여러분의 값으로 대체하세요.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DynamoDBAccess",
"Effect": "Allow",
"Action": [
"dynamodb:BatchGetItem",
"dynamodb:BatchWriteItem",
"dynamodb:Describe*",
"dynamodb:List*",
"dynamodb:PutItem",
"dynamodb:DeleteItem",
"dynamodb:GetItem",
"dynamodb:Scan",
"dynamodb:Query",
"dynamodb:UpdateItem"
],
"Resource": [
"arn:aws:dynamodb:{region}:{account_id}:table/{table_name}",
"arn:aws:dynamodb:{region}:{account_id}:table/{table_name}/index/GSI1"
]
}
]
}
Advanced usage
IaC 템플릿
아래는 DynamoDB를 빠르게 구축할 수 있도록 도와주는 인기 프로바이더들의 인프라스트럭처 코드(IaC) 템플릿입니다.
기본 스키마
이 테이블은 단일 테이블 디자인 패턴을 따릅니다. 이 패턴은 여러 장점을 가지고 있습니다:
- 관리, 모니터링, 프로비저닝할 테이블이 하나뿐입니다.
- 다중 테이블 스키마보다 관계를 조회하는 속도가 빠릅니다 (예: 사용자의 모든 세션을 가져오는 경우).
- 다중 리전으로 확장하려면 하나의 테이블만 복제하면 됩니다.
기본적으로, 어댑터는 pk
를 파티션 키로, sk
를 정렬 키로 가지는 테이블과 GSI1PK
를 파티션 키로, GSI1SK
를 정렬 키로 가지는 GSI1
이라는 글로벌 보조 인덱스를 기대합니다. DynamoDB TTL을 사용하여 세션과 검증 요청이 만료된 후 자동으로 삭제되도록 하려면, expires
속성 이름으로 TTL을 활성화해야 합니다. 테이블 이름과 청구 방식을 원하는 대로 설정할 수 있습니다. 아래 테이블 구조 섹션에서 전체 스키마를 확인할 수 있습니다.
커스텀 스키마 사용하기
options
키를 어댑터 생성자에 전달하여 커스텀 테이블 스키마를 설정할 수 있습니다:
./auth.js
const adapter = DynamoDBAdapter(client, {
tableName: "custom-table-name",
partitionKey: "custom-pk",
sortKey: "custom-sk",
indexName: "custom-index-name",
indexPartitionKey: "custom-index-pk",
indexSortKey: "custom-index-sk",
})