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

Amplify Gen2:如何通过Lambda向DynamoDB Todo表写入数据

解决Lambda向Amplify Data定义的Todo表写入数据的问题

问题核心

你在尝试用Lambda往Amplify Data定义的Todo表写入数据时,遇到两个关键问题:

  • 无法获取DATA_TODO_TABLE_NAME和AWS_REGION环境变量,TypeScript提示该属性不存在于LambdaProvidedEnvVars & AmplifyBackendEnvVars类型中
  • 不清楚如何正确配置Lambda对DynamoDB表的访问权限

解决方案步骤

1. 配置Lambda对Todo表的访问权限

首先需要在Lambda的资源定义文件(amplify/functions/generate-story/resource.ts)中明确授予Lambda访问Todo表的权限,Amplify会自动注入对应的环境变量。如果还没有这个文件,创建它并添加以下内容:

import { defineFunction } from "@aws-amplify/backend";
import { data } from "../../data/resource";

export const generateStory = defineFunction({
  // 授予Lambda对Todo表的读写权限
  access: (allow) => [
    allow.resource(data.models.Todo).to(["create", "read", "update", "delete"])
  ],
  runtime: "nodejs20.x"
});

2. 修正handler.ts中的环境变量使用

配置权限后,Amplify会自动注入DATA_TODO_TABLE_NAME和AWS_REGION环境变量,通过类型断言修正TypeScript报错:

import { DynamoDBClient, PutItemCommand } from "@aws-sdk/client-dynamodb";
import { env } from "$amplify/env/generate-story";

// 类型断言确保环境变量被正确识别
const { DATA_TODO_TABLE_NAME, AWS_REGION } = env as typeof env & {
  DATA_TODO_TABLE_NAME: string;
  AWS_REGION: string;
};

const ddbClient = new DynamoDBClient({ region: AWS_REGION });

export const handler = async (event) => {
  const command = new PutItemCommand({
    TableName: DATA_TODO_TABLE_NAME,
    Item: {
      id: { S: 'example-id' },
      content: { S: 'example-content' },
      createdAt: { S: new Date().toISOString() },
      updatedAt: { S: new Date().toISOString() }
    },
  });

  try {
    await ddbClient.send(command);
    
    return {
      statusCode: 200,
      body: JSON.stringify({ message: "Item inserted successfully" }),
    };
  } catch (error) {
    console.error("Error inserting item:", error);
    return {
      statusCode: 500,
      body: JSON.stringify({ message: "Error inserting item" }),
    };
  }
};

3. 更简便的替代方案:使用Amplify Data Client

直接调用DynamoDB需要手动处理字段格式,改用Amplify Data Client可简化操作:

import { generateClient } from "aws-amplify/data";
import { Schema } from "../../data/resource";
import { env } from "$amplify/env/generate-story";
import { Amplify } from "aws-amplify";

// 初始化Amplify配置
Amplify.configure({
  API: {
    GraphQL: {
      endpoint: env.DATA_API_ENDPOINT,
      region: env.AWS_REGION,
      defaultAuthMode: "iam"
    }
  }
});

const client = generateClient<Schema>();

export const handler = async (event) => {
  try {
    await client.models.Todo.create({
      content: "example-content",
      id: "example-id" // 不指定则自动生成UUID
    });
    
    return {
      statusCode: 200,
      body: JSON.stringify({ message: "Item inserted successfully" }),
    };
  } catch (error) {
    console.error("Error inserting item:", error);
    return {
      statusCode: 500,
      body: JSON.stringify({ message: "Error inserting item" }),
    };
  }
};

验证步骤

完成配置后运行部署命令:

amplify push

部署完成后触发Lambda函数,即可验证数据是否成功写入Todo表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 01:16:00