Amplify Gen 2:使用 Lambda 将数据放入 DynamoDB

问题描述 投票:0回答:1

我无法让 Lambda 将数据插入到 Amplify 中定义的 Todo 表中。

具体来说,如何获取“DATA_TODO_TABLE_NAME”和“AWS_REGION”?我遇到错误““env”对象中的“LambdaProvidedEnvVars & AmplifyBackendEnvVars”类型上不存在属性“DATA_TODO_TABLE_NAME”。

我看过 S3 的示例,其中 Amplify 自动为创建的存储桶创建环境变量,但我无法为 DynamoDB 解决此问题。

根据文档,我有两个选项可以授予 Lambda 对其他资源的访问权限:访问属性和 CDK。不过,我解决这个问题的能力似乎还不够。

我希望能够将 Lambda 中的数据添加到 amplify/data/resource.ts 中定义的 Todo 表中。

我有这个代码:

// amplify/data/resource.ts
import { type ClientSchema, a, defineData } from "@aws-amplify/backend";
import { generateStory } from "../functions/generate-story/resource";

const schema = a.schema({
  Todo: a
    .model({
      content: a.string(),
    })
    .authorization((allow) => [allow.guest()]),
});

export type Schema = ClientSchema<typeof schema>;

export const data = defineData({
  schema,
});

还有这个:

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

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

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

  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" }),
    };
  }
};
aws-lambda amazon-dynamodb aws-amplify aws-cdk
1个回答
0
投票

查看您的代码,我猜您正在使用 Amplify Gen 2 后端?

他们已经放弃了第一代的执行方式(其中 amplify 生成表变量等)。 Lambda 应使用 aws-amplify/data 中的generateClient 架构来访问 dynamodb 表。在我看来,这比到处乱搞环境变量要好得多。该架构必须允许 lambda 函数执行此操作 - (amplify/data/resource.ts) 中定义的权限。

按照此处的指南进行操作:

https://docs.amplify.aws/react-native/build-a-backend/functions/examples/create-user-profile-record/

您需要一切放大的最新版本。为了支持从“$amplify/env/post-confirmation”导入 env,我必须将路径添加到 amplify/tsconfig.json:

{
  "compilerOptions": {
    "target": "es2022",
    "module": "es2022",
    "moduleResolution": "bundler",
    "resolveJsonModule": true,
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "skipLibCheck": true,
    "paths": {
      "$amplify/*": ["../.amplify/generated/*"]
    }
  },
}
© www.soinside.com 2019 - 2024. All rights reserved.