TypeScript DynamoDB
Generator này tạo một dự án TypeScript DynamoDB mới được hỗ trợ bởi Amazon DynamoDB, sử dụng ElectroDB để mô hình hóa thực thể an toàn kiểu. Nó tạo ra mã ứng dụng và cơ sở hạ tầng cần thiết để cung cấp và quản lý bảng DynamoDB bằng AWS CDK hoặc Terraform, với hỗ trợ thiết kế bảng đơn và phát triển cục bộ tích hợp sẵn thông qua DynamoDB Local.
Cách sử dụng
Phần tiêu đề “Cách sử dụng”Tạo một Dự án TypeScript DynamoDB
Phần tiêu đề “Tạo một Dự án TypeScript DynamoDB”pnpm nx g @aws/nx-plugin:ts#dynamodbyarn nx g @aws/nx-plugin:ts#dynamodbnpx nx g @aws/nx-plugin:ts#dynamodbbunx nx g @aws/nx-plugin:ts#dynamodbBạn cũng có thể thực hiện chạy thử để xem những tệp nào sẽ bị thay đổi
pnpm nx g @aws/nx-plugin:ts#dynamodb --dry-runyarn nx g @aws/nx-plugin:ts#dynamodb --dry-runnpx nx g @aws/nx-plugin:ts#dynamodb --dry-runbunx nx g @aws/nx-plugin:ts#dynamodb --dry-run- Cài đặt Nx Console VSCode Plugin nếu bạn chưa cài đặt
- Mở Nx Console trong VSCode
- Nhấp
Generate (UI)trong phần "Common Nx Commands" - Tìm kiếm
@aws/nx-plugin - ts#dynamodb - Điền các tham số bắt buộc
- Nhấp
Generate
Tùy chọn
Phần tiêu đề “Tùy chọn”| Tham số | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
| name Bắt buộc | string | - | Tên của dự án DynamoDB cần tạo |
| directory | string | packages | Thư mục để lưu trữ dự án. |
| subDirectory | string | - | Thư mục con mà dự án được đặt trong đó. Mặc định là tên dự án. |
| framework | electrodb | electrodb | Framework sử dụng cho các entity DynamoDB. |
| tableName | string | - | Tên bảng DynamoDB. Tự động tạo nếu không chỉ định. |
| infra | dynamodb | none | dynamodb | Cơ sở hạ tầng để cung cấp cho bảng DynamoDB. |
| iac | inherit | cdk | terraform | inherit | Nhà cung cấp IaC ưa thích. Mặc định giá trị này được kế thừa từ lựa chọn ban đầu của bạn. |
| preferInstallDependencies | boolean | true | Có nên cài đặt các dependencies sau khi generator chạy hay không. Đặt thành false để hoãn việc cài đặt khi chạy nhiều generator liên tiếp (việc cài đặt vẫn sẽ chạy nếu cần thiết để các generator tiếp theo có thể tính toán Nx project graph); cài đặt một lần vào cuối. |
Đầu ra của Generator
Phần tiêu đề “Đầu ra của Generator”Generator tạo cấu trúc dự án sau trong thư mục <directory>/<name>:
Thư mụcsrc
- index.ts Project entry point and exports
- client.ts DynamoDB client singleton and table name resolution
Thư mụcentities
- example.ts Example ElectroDB entity definition
- index.ts Entity exports
- config.json Table configuration including GSI definitions and local development settings
- package.json Project manifest defining the project’s package name and dependencies
- project.json Project configuration and build targets
Các script phát triển cục bộ được chia sẻ trên tất cả các dự án DynamoDB (cả TypeScript và Python) và được tạo một lần vào:
Thư mụcpackages/common/scripts/src/dynamodb
- create-local-table.ts Creates the DynamoDB table in the local DynamoDB Local instance
- pull-image.ts Pulls the DynamoDB Local image
- start-container.ts Starts the DynamoDB Local container
Cơ sở hạ tầng
Phần tiêu đề “Cơ sở hạ tầng”Vì generator này cung cấp infrastructure as code dựa trên iac bạn đã chọn, nó sẽ tạo một dự án trong packages/common bao gồm các CDK constructs hoặc Terraform modules liên quan.
Dự án infrastructure as code chung được cấu trúc như sau:
Thư mụcpackages/common/constructs
Thư mụcsrc
Thư mụcapp/ Constructs for infrastructure specific to a project/generator
- …
Thư mụccore/ Generic constructs which are reused by constructs in
app- …
- index.ts Entry point exporting constructs from
app
- project.json Project build targets and configuration
Thư mụcpackages/common/terraform
Thư mụcsrc
Thư mụcapp/ Terraform modules for infrastructure specific to a project/generator
- …
Thư mụccore/ Generic modules which are reused by modules in
app- …
- project.json Project build targets and configuration
Thư mụcpackages/common/constructs/src
Thư mụcapp
Thư mụcdynamodb
- <name>.ts Cơ sở hạ tầng cụ thể cho bảng của bạn
Thư mụccore
- dynamodb.ts Construct bảng DynamoDB chung
Thư mụcpackages/common/terraform/src
Thư mụcapp
Thư mụcdynamodb
Thư mục<name>
- <name>.tf Module cụ thể cho bảng của bạn
Thư mụccore
Thư mụcdynamodb
- dynamodb.tf Module DynamoDB chung
Phát triển Cục bộ
Phần tiêu đề “Phát triển Cục bộ”Khởi động DynamoDB Cục bộ
Phần tiêu đề “Khởi động DynamoDB Cục bộ”Generator cấu hình một target dev để khởi động một instance DynamoDB Local và tạo bảng. Sử dụng target dev của dự án:
pnpm nx dev <project-name>yarn nx dev <project-name>npx nx dev <project-name>bunx nx dev <project-name>Điều này tự động:
- Kéo image DynamoDB Local (target
pull-image) - Khởi động một container
- Tạo một bảng local với các index được định nghĩa trong
config.json
Mô hình hóa Dữ liệu
Phần tiêu đề “Mô hình hóa Dữ liệu”Dự án được tạo sử dụng ElectroDB để mô hình hóa thực thể an toàn kiểu trên một bảng DynamoDB đơn, tuân theo thiết kế bảng đơn của DynamoDB. Thêm hoặc cập nhật các tệp thực thể trong src/entities/, sử dụng thực thể ví dụ được tạo làm điểm khởi đầu.
Định nghĩa thực thể ví dụ:
import { Entity } from 'electrodb';import { getDynamoDBClient, resolveTableName } from '../client.js';
export const createExampleEntity = async () => new Entity( { model: { entity: 'example', version: '1', service: 'MyTable', }, attributes: { id: { type: 'string', required: true, }, createdAt: { type: 'string', required: true, default: () => new Date().toISOString(), readOnly: true, }, updatedAt: { type: 'string', required: true, default: () => new Date().toISOString(), watch: '*', set: () => new Date().toISOString(), }, }, indexes: { primary: { pk: { field: 'pk', composite: ['id'], }, sk: { field: 'sk', composite: [], }, }, }, }, { client: getDynamoDBClient(), table: await resolveTableName() }, );Để biết thêm chi tiết, xem tài liệu thực thể ElectroDB.
Sử dụng DynamoDB Client
Phần tiêu đề “Sử dụng DynamoDB Client”src/client.ts được tạo xuất hai tiện ích chính:
getDynamoDBClient()— trả về mộtDynamoDBClientsingleton được lưu trong bộ nhớ cache. KhiLOCAL_DEV=true, kết nối đến phiên bản DynamoDB Local cục bộ; nếu không tạo một AWS client sử dụng chuỗi thông tin xác thực mặc định.resolveTableName()— trả về tên bảng DynamoDB. KhiLOCAL_DEV=true, trả về hằng số tên bảng cục bộ; nếu không lấy tên từ AWS AppConfig sử dụng biến môi trườngRUNTIME_CONFIG_APP_IDvà lưu vào bộ nhớ cache cho các lần gọi tiếp theo.
Dừng DynamoDB Cục bộ
Phần tiêu đề “Dừng DynamoDB Cục bộ”Việc dừng dev (ví dụ: bằng Ctrl+C) sẽ tự động xóa container DynamoDB Local, nhưng vẫn giữ lại named volume để dữ liệu của bạn được bảo toàn qua các lần khởi động lại.
Thêm/Xóa Global Secondary Indexes
Phần tiêu đề “Thêm/Xóa Global Secondary Indexes”GSI được định nghĩa trong config.json ở thư mục gốc dự án dưới khóa tableConfig.globalSecondaryIndexes. Thêm một mục cho mỗi GSI, tuân theo quy ước đặt tên khóa GSI thiết kế bảng đơn:
{ ... "tableConfig": { "globalSecondaryIndexes": [ { "indexName": "gsi1pk-gsi1sk-index", "partitionKey": "gsi1pk", "sortKey": "gsi1sk" }, { "indexName": "gsi2pk-gsi2sk-index", "partitionKey": "gsi2pk", "sortKey": "gsi2sk" } ] }}Trường sortKey là tùy chọn cho các GSI chỉ có hash-key.
File cấu hình này là nguồn sự thật duy nhất được đọc bởi tất cả các consumer:
- Phát triển cục bộ —
devđọcconfig.jsonvà tạo hoặc cập nhật bảng cục bộ để khớp với danh sách GSI - CDK — construct đọc
config.jsontại thời điểm synth, do đó các thay đổi GSI được phản ánh trong lầncdk deploytiếp theo - Terraform — module đọc
config.jsontại thời điểm plan/apply
Một GSI mỗi Triển khai
Phần tiêu đề “Một GSI mỗi Triển khai”Kết nối đến Bảng
Phần tiêu đề “Kết nối đến Bảng”Trong bất kỳ dự án TypeScript nào, import các factory thực thể từ gói DynamoDB của bạn và sử dụng chúng trực tiếp:
import { createExampleEntity } from '@my-scope/my-table';
const entity = await createExampleEntity();const result = await entity.query.primary({ id: '123' }).go();Ở hậu trường, createExampleEntity() gọi resolveTableName() để lấy tên bảng từ AWS AppConfig tại thời điểm chạy.
Triển khai Bảng của bạn
Phần tiêu đề “Triển khai Bảng của bạn”Trình tạo DynamoDB tạo ra cơ sở hạ tầng CDK hoặc Terraform dựa trên iac bạn đã chọn.
Construct CDK được tạo trong common/constructs. Ví dụ sử dụng:
import { MyTable } from '@my-scope/common-constructs';
export class ApplicationStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props);
const table = new MyTable(this, 'Table'); }}Điều này cung cấp một bảng DynamoDB với:
pk(partition key) vàsk(sort key), cả hai đều là kiểuString- Global Secondary Indexes như được định nghĩa trong
config.json - Thanh toán theo yêu cầu (
PAY_PER_REQUEST) - Mã hóa KMS do khách hàng quản lý với tự động xoay khóa
- Khôi phục theo thời điểm được bật
- Bảo vệ xóa được bật
- Tên bảng được đăng ký trong Runtime Config dưới namespace
dynamodbtrong AWS AppConfig
Module Terraform được tạo trong common/terraform. Ví dụ sử dụng:
module "my_table" { source = "../../common/terraform/src/app/dynamodb/my-table"}Điều này cung cấp một bảng DynamoDB với:
pk(partition key) vàsk(sort key), cả hai đều là kiểuString- Global Secondary Indexes như được định nghĩa trong
config.json - Thanh toán theo yêu cầu (
PAY_PER_REQUEST) - Mã hóa KMS do khách hàng quản lý với tự động xoay khóa
- Khôi phục theo thời điểm được bật
- Bảo vệ xóa được bật
- Tên bảng được đăng ký trong Runtime Config
Bảo vệ Xóa
Phần tiêu đề “Bảo vệ Xóa”Bảo vệ xóa được bật mặc định để ngăn chặn việc xóa bảng một cách vô tình.
Tắt Bảo vệ Xóa
Phần tiêu đề “Tắt Bảo vệ Xóa”Tắt nó cho các môi trường mà việc xóa bảng được mong đợi, chẳng hạn như các stack phát triển hoặc xem trước có thời gian tồn tại ngắn.
import { MyTable } from '@my-scope/common-constructs';
const table = new MyTable(this, 'Table', { deletionProtection: false,});module "my_table" { source = "../../common/terraform/src/app/dynamodb/my-table" deletion_protection_enabled = false}Chế độ Thanh toán
Phần tiêu đề “Chế độ Thanh toán”Bảng mặc định sử dụng thanh toán theo yêu cầu (PAY_PER_REQUEST). Chuyển sang dung lượng được cung cấp cho các khối lượng công việc có thông lượng cao và có thể dự đoán.
import { BillingMode } from 'aws-cdk-lib/aws-dynamodb';import { MyTable } from '@my-scope/common-constructs';
const table = new MyTable(this, 'Table', { billingMode: BillingMode.PROVISIONED, readCapacity: 5, writeCapacity: 5,});module "my_table" { source = "../../common/terraform/src/app/dynamodb/my-table" billing_mode = "PROVISIONED"}Khôi phục Theo Thời điểm
Phần tiêu đề “Khôi phục Theo Thời điểm”Khôi phục theo thời điểm được bật mặc định, cho phép bạn khôi phục bảng về bất kỳ thời điểm nào trong 35 ngày qua.
Tắt Khôi phục Theo Thời điểm
Phần tiêu đề “Tắt Khôi phục Theo Thời điểm”import { MyTable } from '@my-scope/common-constructs';
const table = new MyTable(this, 'Table', { pointInTimeRecoverySpecification: { pointInTimeRecoveryEnabled: false },});module "my_table" { source = "../../common/terraform/src/app/dynamodb/my-table" point_in_time_recovery_enabled = false}Xoay Khóa Mã hóa
Phần tiêu đề “Xoay Khóa Mã hóa”Khóa KMS được sử dụng để mã hóa bảng có tính năng tự động xoay khóa được bật mặc định. Tắt nó nếu chính sách bảo mật của bạn quản lý việc xoay khóa từ bên ngoài.
Tắt Xoay Khóa Mã hóa
Phần tiêu đề “Tắt Xoay Khóa Mã hóa”import { MyTable } from '@my-scope/common-constructs';
const table = new MyTable(this, 'Table', { enableKeyRotation: false,});module "my_table" { source = "../../common/terraform/src/app/dynamodb/my-table" enable_key_rotation = false}Kết nối
Phần tiêu đề “Kết nối”Sử dụng generator connection để tích hợp dự án này với các dự án khác trong workspace của bạn. Các kết nối sau liên quan đến dự án này: