如何用CDK TypeScript向DynamoDB表添加数据及设置分区键值?
使用TypeScript CDK向DynamoDB表添加数据及分区键数值指定方案
一、向DynamoDB表添加数据的两种方案
CDK核心能力是基础设施编排,默认不提供直接写入数据的功能,但可以通过以下两种方式实现数据写入:
1. 利用CustomResource在部署阶段写入数据
通过自定义资源绑定Lambda函数,在CDK部署表的同时执行数据写入逻辑,示例代码如下:
import * as cdk from 'aws-cdk-lib'; import { Table, AttributeType, BillingMode, TableClass } from 'aws-cdk-lib/aws-dynamodb'; import { Function, Runtime, Code } from 'aws-cdk-lib/aws-lambda'; import { CustomResource, Provider } from 'aws-cdk-lib/custom-resources'; export class DynamoDbDataStack extends cdk.Stack { constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { super(scope, id, props); // 创建DynamoDB表(复用你的代码) const dynamoTable = new Table(this, "dynamoTable", { tableName: "dynamoTable", partitionKey: { name: 'viewer_id', type: AttributeType.STRING }, billingMode: BillingMode.PAY_PER_REQUEST, tableClass: TableClass.STANDARD }); // 创建写入数据的Lambda函数 const putDataLambda = new Function(this, 'PutDataLambda', { runtime: Runtime.NODEJS_20_X, handler: 'index.handler', code: Code.fromInline(` const { DynamoDBClient, PutItemCommand } = require('@aws-sdk/client-dynamodb'); const client = new DynamoDBClient({}); exports.handler = async (event) => { if (event.RequestType === 'Create') { const params = { TableName: '${dynamoTable.tableName}', Item: { viewer_id: { S: '123' }, // STRING类型分区键赋值 username: { S: 'test_user' }, // 自定义属性示例 age: { N: '28' } // 数值类型属性示例 } }; await client.send(new PutItemCommand(params)); } return { PhysicalResourceId: 'put-data-resource' }; }; `), environment: { TABLE_NAME: dynamoTable.tableName } }); // 赋予Lambda写入表的权限 dynamoTable.grantWriteData(putDataLambda); // 创建CustomResource触发Lambda执行 const provider = new Provider(this, 'PutDataProvider', { onEventHandler: putDataLambda }); new CustomResource(this, 'PutDataResource', { serviceToken: provider.serviceToken }); } }
2. 部署后通过AWS SDK写入数据
若无需在部署阶段写入,可在表创建完成后,通过独立脚本或业务代码使用AWS SDK写入数据,示例代码(基于AWS SDK v3):
import { DynamoDBClient, PutItemCommand } from "@aws-sdk/client-dynamodb"; const client = new DynamoDBClient({ region: '你的AWS区域' }); async function putItem() { const params = { TableName: "dynamoTable", Item: { viewer_id: { S: '456' }, // STRING类型分区键赋值 email: { S: 'test@example.com' } } }; try { const response = await client.send(new PutItemCommand(params)); console.log("数据写入成功", response); } catch (err) { console.error("写入失败", err); } } putItem();
二、STRING类型分区键指定数值的方法
当分区键类型为AttributeType.STRING时,只需将数值转换为字符串格式传入即可。比如要存储数值123,直接传入字符串"123",在DynamoDB中会以STRING类型存储。
在写入逻辑中,需遵循DynamoDB的数据格式规则:对应分区键的属性值用{ S: "数值的字符串形式" }表示(S代表STRING类型)。
内容的提问来源于stack exchange,提问作者RDagon
相关产品推荐
相关产品推荐

