如何使用放大框架/cli 配置 dynamodb-to-lambda 触发器
Posted
技术标签:
【中文标题】如何使用放大框架/cli 配置 dynamodb-to-lambda 触发器【英文标题】:How to configure dynamodb-to-lambda trigger using amplify framework/cli 【发布时间】:2021-04-12 09:12:27 【问题描述】:放大停靠here 说我们可以通过运行**amplify add function**
并选择“Lambda 触发器”选项将 lambda 函数配置为 dynamodb 触发器,但是当我运行 "amplify add api"
(选择 Python 作为运行时语言)我没有得到 lambda 触发器选项,我只得到了“无服务器函数”和“lambda 层”选项。
请帮助我解决此问题以访问该功能。
文档快照 - 显示 4 个选项
我的 CLI 快照 - 仅显示 2 个选项
我知道它适用于 nodejs 运行时 lambda,但我也希望这个选项适用于 Python Lambda。
【问题讨论】:
它在选择 NodeJS 时显示“Lambda 触发器”选项,但我想要 Python lambda 函数的选项。目前,我们通过编辑 amplify 框架生成的 CF 模板手动添加了触发器。 【参考方案1】:只需按照这些步骤使用放大 CLI 版本 4.50.2
。
要创建由对 DynamoDB 表的更改触发的 lambda 函数,您可以使用以下命令行操作,这些操作在输入以下命令后在 CLI 内逐步完成:
amplify add function
选择您要添加的功能:
❯ Lambda 函数(无服务器函数)提供一个 AWS Lambda 函数名称:
选择您要使用的运行时:
> NodeJS # 重要提示:目前必须是 NodeJS,您可以稍后通过手动编辑函数目录中的 ...-cloudformation-template.json 文件来更改此设置选择你要使用的函数模板
> Lambda 触发器您想将什么事件源与 lambda 触发器关联
> Amazon DynamoDB 流选择一个 DynamoDB 事件源选项
>在当前 Amplify 项目中使用 API 类别 graphql @model 后端 DynamoDB 表选择 graphql @model(s)
是否要触发高级设置
Y # IMPORTANT: 如果您使用基于 graphql 模式定义的表的 dynamodb 事件源,则需要授予此函数对包含定义的 graphql 模式的api
资源的读取访问权限推动事件的表
您想从您的 Lambda 函数访问此项目中的其他资源吗?
y # 见上文,选择包含数据模型的 api 并确保函数至少具有读取权限。在此之后,其他选项(层、呼叫调度)由您决定。
通过上述 CLI 选项创建函数后,您可以更改函数目录中 -cloudformation-template.json 文件中的 "Runtime"
字段,例如,如果您想要一个 python lambda 函数,请将运行时更改为“python3.8 ”。您还需要在您的函数目录中创建一个名为index.py
的文件,该文件具有handler(event, context)
函数。请参见下面的示例:
import json
def handler(event, context):
print("Triggered via DynamoDB")
print(event)
return json.dumps('status_code': 200, "message": "Received from DynamoDB")
进行这些编辑后,您可以运行amplify push
,如果您在管理控制台在线打开您的 fxn,它应该会显示一个附加的 dynamoDB 流。
【讨论】:
【参考方案2】:在 CLI 代码库中似乎不再可用 - 请参阅 Supported-service.json 已删除并替换为 supported-services.ts
https://github.com/aws-amplify/amplify-cli/commit/607ae21287941805f44ea8a9b78dd12d16d71f85#diff-a0fd8c5607fd81977cb4745b9af3af2c6649ded748991bf9968a7d782b000c6b
https://github.com/aws-amplify/amplify-cli/commits/4e974007d95c894ab4108a2dff8d5996e7e3ce25/packages/amplify-category-function/src/provider-utils/supported-services.ts
【讨论】:
那么,有没有办法通过放大框架添加一个dynamodb触发器? 选择 NodeJS 时显示“Lambda 触发器”选项,但我想要一个 Python lambda 函数。【参考方案3】:选择nodejs,就可以看到lambda trigger
【讨论】:
是的,我知道,我什至在上述 cmets 之一中也提到了这一点。我实际上只是在寻找 Python lambda 设置,到目前为止,通过添加到 cloudformation 模板中手动完成了。【参考方案4】:只需将以下内容添加到YOUR_FUNCTION_NAME-cloudformation-template.json
,记得将 (YOUR_TABLE_NAME) 替换为您的表名。
"LambdaTriggerPolicyPurchase":
"DependsOn": [
"LambdaExecutionRole"
],
"Type": "AWS::IAM::Policy",
"Properties":
"PolicyName": "amplify-lambda-execution-policy-Purchase",
"Roles": [
"Ref": "LambdaExecutionRole"
],
"PolicyDocument":
"Version": "2012-10-17",
"Statement": [
"Effect": "Allow",
"Action": [
"dynamodb:DescribeStream",
"dynamodb:GetRecords",
"dynamodb:GetShardIterator",
"dynamodb:ListStreams"
],
"Resource":
"Fn::ImportValue":
"Fn::Sub": "$apilanguageGraphQLAPIIdOutput:GetAtt:(YOUR_TABLE_NAME):StreamArn"
]
,
"LambdaEventSourceMappingPurchase":
"Type": "AWS::Lambda::EventSourceMapping",
"DependsOn": [
"LambdaTriggerPolicyPurchase",
"LambdaExecutionRole"
],
"Properties":
"BatchSize": 100,
"Enabled": true,
"EventSourceArn":
"Fn::ImportValue":
"Fn::Sub": "$apilanguageGraphQLAPIIdOutput:GetAtt:(YOUR_TABLE_NAME):StreamArn"
,
"FunctionName":
"Fn::GetAtt": [
"LambdaFunction",
"Arn"
]
,
"StartingPosition": "LATEST"
,
我通过使用在您选择 nodejs 后显示的模板创建一个虚拟函数并检查将其 -cloudformation-template.json
与我自己的函数进行比较来获得它们
【讨论】:
以上是关于如何使用放大框架/cli 配置 dynamodb-to-lambda 触发器的主要内容,如果未能解决你的问题,请参考以下文章
如何在 AWS 放大 DynamoDB 架构中设置嵌套字段的限制?
自动 DynamoDB 数据库检查 | ReactJS + AWS 放大
使用aws cli将全局二级索引添加到DynamoDB中的现有表