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

Amplify Gen2中允许Lambda函数访问数据的配置问题

Amplify Gen2 实现Lambda访问数据模型的方案

问题背景

在Amplify Gen2项目中,尝试通过allow.resource()给Lambda授权访问Procurement数据模型时,发现模型授权的allow对象属于BaseAllowModifier类型,没有resource方法(该方法仅在defineStorage的访问配置中可用),需要找到适配defineData的替代方案。

解决方案:通过IAM权限绑定实现Lambda访问

Amplify Gen2中,Lambda访问数据模型的标准方式是启用IAM授权模式 + 给Lambda绑定模型权限,具体步骤如下:

1. 配置数据模型的IAM授权规则

修改./amplify/data/resource.ts中的模型授权配置,添加allow.iam()规则:

import { type ClientSchema, a, defineData } from "@aws-amplify/backend";
import { sayHello } from "../custom-functions/helloworld/resource";

const schema = a.schema({
  Procurement: a
    .model({
      name: a.string(),
      price: a.float(),
      account: a.string(),
      s3AttachmentCount: a.integer(),
      s3Attachments: a.string(),
      comments: a.string()
    })
    .authorization((allow) => [
      allow.publicApiKey(),
      // 添加IAM授权规则,允许具备对应权限的IAM实体访问
      allow.iam().to(['read','write','delete'])
    ]),
});

export type Schema = ClientSchema<typeof schema>;

export const data = defineData({
  schema,
  authorizationModes: {
    defaultAuthorizationMode: "apiKey",
    apiKeyAuthorizationMode: {
      expiresInDays: 30,
    },
    // 启用IAM授权模式
    iamAuthorizationMode: { enabled: true }
  }
});

2. 给Lambda函数绑定数据模型权限

修改Lambda的资源定义文件./amplify/custom-functions/helloworld/resource.ts,通过permissions属性绑定Procurement模型的读写删权限:

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

export const sayHello = defineFunction({
  // 可根据需求配置函数的运行时、内存等参数
  runtime: "python3.12",
  permissions: [
    // 绑定Procurement模型的读写删权限
    data.models.Procurement.read,
    data.models.Procurement.write,
    data.models.Procurement.delete
  ]
});

3. Lambda中调用数据模型(以Python为例)

在Lambda代码index.py中,通过Amplify SDK使用IAM授权访问数据模型:

import boto3
from aws Amplify import Amplify

# 初始化Amplify,使用IAM授权
Amplify.configure(
    {
        "API": {
            "default": {
                "endpoint": "<你的AppSync端点>",
                "region": "<你的AWS区域>",
                "authorizationType": "AWS_IAM"
            }
        }
    }
)

# 示例:查询Procurement数据
def handler(event, context):
    # 使用Amplify Data API执行操作,这里以查询为例
    response = Amplify.API.query(
        query="listProcurements",
        variables={}
    )
    return {
        "statusCode": 200,
        "body": response
    }

补充说明

defineStorage中的allow.resource()是存储资源特有的授权方式,而defineData的数据模型授权体系更依赖IAM角色权限绑定。通过上述步骤,Lambda将通过自身的IAM执行角色获取访问数据模型的权限,实现和defineStorage中类似的资源授权效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:17:14