【问题标题】:How to configure dynamodb-to-lambda trigger using amplify framework/cli如何使用放大框架/cli 配置 dynamodb-to-lambda 触发器
【发布时间】: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 模板手动添加了触发器。

标签: amazon-dynamodb-streams aws-amplify-cli amplify


【解决方案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】:

    【讨论】:

    • 那么,有没有办法通过放大框架添加一个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 与我自己的函数进行比较来获得它们

    【讨论】:

      猜你喜欢
      • 2015-10-13
      • 2020-03-03
      • 2017-04-27
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 2016-12-30
      相关资源
      最近更新 更多