DynamoDBアダプター
リソース
セットアップ
インストール
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
ですが、アダプターの2番目のパラメーターとして{ 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認証情報
AWSサービス/リソースへのアクセスを許可する場合は、常に最小権限の原則に従ってください。つまり、IDは特定のタスクを実行するために必要な最小限のアクションのみを実行できるようにする必要があります。
- AWSコンソールを開き、「IAM」次に「ユーザー」に移動します。
- 新しいユーザーを作成します。このユーザーの目的は、DynamoDBへのプログラムによるアクセスを許可することです。
- アクセスキーを作成し、キーIDとシークレットを
.env
/.env.local
ファイルにコピーします。 - 「アクセス許可の追加」と「インラインポリシーの作成」を選択します。
- 以下の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"
]
}
]
}
高度な使い方
IaCテンプレート
以下は、DynamoDBを起動するのに役立つ、一般的なプロバイダー向けのInfrastructure-as-Codeテンプレートです。
デフォルトスキーマ
テーブルはシングルテーブル設計パターンに従います。これには多くの利点があります。
- 管理、監視、プロビジョニングが必要なテーブルは1つだけです。
- (例:ユーザーのすべてのセッションを取得するなど)関係のクエリは、マルチテーブルスキーマよりも高速です。
- マルチリージョン化する場合は、レプリケートする必要があるテーブルは1つだけです。
デフォルトでは、アダプターはパーティションキー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",
})