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
相关产品推荐
相关产品推荐

