You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用aws-cdk-lib在TypeScript中扫描DynamoDB表?

问题分析与解决方案

你混淆了AWS CDK的定位:aws-cdk-lib是基础设施即代码(IaC)工具,仅用于定义和部署AWS资源(比如DynamoDB表、Lambda函数、权限策略),不能直接执行DynamoDB的扫描等数据操作。你代码里的ddb.Operation.SCAN只是CDK中用来标识权限操作类型的枚举值,不是执行扫描的方法。

要实现扫描DynamoDB表并转为数组的需求,需要分两步:


1. 用CDK配置运行时环境与权限

你需要用CDK创建一个Lambda函数(或其他支持运行代码的服务),并为它配置读取DynamoDB表的权限。示例代码如下:

import * as cdk from 'aws-cdk-lib';
import * as iam from 'aws-cdk-lib/aws-iam';
import * as ddb from 'aws-cdk-lib/aws-dynamodb';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
import { Construct } from 'constructs';

export class DynamoDbScanStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // 导入已存在的DynamoDB表
    const table = ddb.Table.fromTableArn(this, 'ImportedTable', 'arn:aws:dynamodb:us-east-1:111111111111:table/Things');

    // 创建Node.js Lambda函数,用于执行扫描操作
    const scanFunction = new NodejsFunction(this, 'DynamoDbScanFunction', {
      runtime: lambda.Runtime.NODEJS_20_X,
      entry: './lambda/scan-table.ts', // 指向你的Lambda运行时代码文件
      environment: {
        TABLE_NAME: table.tableName,
      },
    });

    // 给Lambda授予读取DynamoDB表的权限
    table.grantReadData(scanFunction);
  }
}

2. 在运行时代码中执行扫描操作

在Lambda的运行时代码(./lambda/scan-table.ts)中,使用AWS SDK v3的@aws-sdk/client-dynamodb来执行SCAN操作,并将结果转为数组。示例代码:

import { DynamoDBClient, ScanCommand } from '@aws-sdk/client-dynamodb';
import { unmarshall } from '@aws-sdk/util-dynamodb';

const client = new DynamoDBClient({ region: 'us-east-1' });
const TABLE_NAME = process.env.TABLE_NAME || '';

export const handler = async () => {
  try {
    const command = new ScanCommand({
      TableName: TABLE_NAME,
    });

    const response = await client.send(command);
    // 将DynamoDB的Item格式转为普通对象,提取目标列
    const thingList = response.Items?.map(item => unmarshall(item).yourColumnName) || [];

    return {
      statusCode: 200,
      body: JSON.stringify(thingList),
    };
  } catch (error) {
    console.error('扫描表失败:', error);
    return {
      statusCode: 500,
      body: JSON.stringify({ error: '扫描表失败' }),
    };
  }
};

关键说明:

  • unmarshall函数用于将DynamoDB存储的AttributeValue格式(如{ S: 'value' })转换为普通JavaScript对象。
  • 把代码中的yourColumnName替换成你表中的实际列名即可。
  • 若偏好AWS SDK v2,也可替换为aws-sdk包,但v3是更轻量化的推荐版本。

内容的提问来源于stack exchange,提问作者Danielle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 03:54:29