我无法让 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" }),
};
}
};
查看您的代码,我猜您正在使用 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/*"]
}
},
}