如何访问触发部署为 Docker 映像的 Lambda 的 SQS 事件?

Kub*_*uba 3 amazon-sqs aws-cloudformation docker aws-lambda

我目前有一个简单的 Lambda,由 SQS 队列触发并打印出触发它的事件。它与 CFN 一起部署,定义为:

PrintMessage:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Runtime: python3.8
      FunctionName: !Sub printMessage-${Environment}
      MemorySize: 1024
      Role: !Sub arn:aws:iam::${AWS::AccountId}:role/service-role/printMessageRole-${Environment}
      Timeout: 900
      Code:
        ZipFile: |
          import os
          import json

          def handler(event, context):
            print("Event: {}".format(event))

PrintMessageEventSource:
    Type: AWS::Lambda::EventSourceMapping
    Properties:
      BatchSize: 1
      Enabled: true
      EventSourceArn: !Sub arn:aws:sqs:${AWS::Region}:${AWS::AccountId}:printMessageQueue-${Environment}
      FunctionName: !Sub printMessage-${Environment}
Run Code Online (Sandbox Code Playgroud)

此流程工作正常 - 编写任何内容来printMessageQueue触发 Lambda 并打印其内容。

我的问题是我需要使用另一个组件的逻辑,该逻辑更复杂并且包含多个依赖项,并且已经作为 Docker 映像部署到 ECR。到目前为止我所拥有的是:

PrintMessage:
    Type: AWS::Lambda::Function
    Properties:
      Code:
        ImageUri: !Sub ${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/component:${ImageTag}
      FunctionName: !Sub printMessage-${Environment}
      ImageConfig:
        EntryPoint:
          - python3
          - print_message.py
      MemorySize: 1024
      PackageType: Image
      Role: !Sub arn:aws:iam::${AWS::AccountId}:role/service-role/printMessageRole-${Environment}
      Timeout: 900
Run Code Online (Sandbox Code Playgroud)

它按预期工作,python3 print_message.py在 Docker 容器内运行。

有没有办法访问触发 Lambda 的 SQS 事件,与def handler(event, context)line 类似,但在print_message.py脚本内部:

import os
import json

event = ???
print("Event: {}".format(event))
Run Code Online (Sandbox Code Playgroud)

Jas*_*son 5

更新:包括“如何知道来源”

\n

我的理解是,您希望将创建的 docker 代码迁移到 Lambda 函数。您希望重用容器代码,并将其作为 Lambda 调用。

\n

如果我的假设是正确的话。您的容器需要运行Lambda Runtime API。AWS提供预安装运行时的基础 docker 镜像。

\n

请注意将容器映像部署到 Lambda 时的要求,文档指出:

\n
    \n
  • 容器映像必须实现 Lambda Runtime API。
  • \n
  • 容器映像必须能够在只读文件系统上运行。您的函数代码可以访问具有 512 MB 存储空间的可写 /tmp 目录。
  • \n
  • 默认 Lambda 用户必须能够读取运行函数代码所需的所有文件。Lambda 通过定义具有最低特权的默认 Linux 用户来遵循安全最佳实践。验证您的应用程序代码不依赖于其他 Linux 用户被限制运行的文件。
  • \n
  • Lambda 仅支持基于 Linux 的容器映像。
  • \n
\n

您在 zip 文件中使用的处理程序仍然是必需的,它是使用容器映像设置进行设置的:

\n

Lambda 支持 Dockerfile 中的以下容器映像设置,AWS 文档概述了以下容器设置:

\n
    \n
  • ENTRYPOINT\xe2\x80\x93 指定应用程序入口点的绝对路径。

    \n
  • \n
  • CMD\xe2\x80\x93 指定要通过 传入的参数ENTRYPOINT

    \n
  • \n
  • WORKDIR\xe2\x80\x93 指定工作目录的绝对路径。

    \n
  • \n
  • ENV\xe2\x80\x93 指定 Lambda 函数的环境变量。

    \n
  • \n
\n

这是一篇很棒的博客文章CMD,描述了和之间的区别ENTRYPOINT

\n

以下博客文章介绍了如何创建可部署为 Lambda 函数的 Docker 容器。

\n

将容器部署到 ECR 后,您就可以使用CloudFormation,就像必须使用以下方法将容器作为 Lambda 函数部署在 ECR 中一样AWS::Lambda::Function

\n

如果部署包是容器镜像,则将包类型设置为镜像。对于容器映像,code 属性必须包含 Amazon ECR 注册表中容器映像的 URI。您不需要指定处理程序和运行时属性,因为这是使用上面提到的容器设置进行设置的。

\n

然后,您还可以使用 CloudFormation 创建一个调用 Lambda Function 的 SQS 队列AWS::Lambda::EventSourceMapping

\n

更多信息请点击这里

\n

作为 zip 或通过控制台部署的标准node.js Lambda 函数的事件处理程序将传递三个参数:

\n
    \n
  • 事件
  • \n
  • 语境
  • \n
  • 打回来
  • \n
\n

这种结构对于其他语言来说是相同的。

\n
    \n
  • Pythondef lambda_handler(event, context):
  • \n
  • 爪哇public String handleRequest(Map<String,String> event, Context context)
  • \n
  • 。网public async Task Handler(ILambdaContext context)
  • \n
  • 戈兰func HandleRequest(ctx context.Context, name MyEvent) (string, error) {
  • \n
  • 红宝石def handler(event:, context:)
  • \n
\n

事件函数返回有关调用事件的信息,在本例中为 SQS。该结构取决于调用服务。对于 SQS 来说是:

\n
"Records": [\n        {\n            "messageId": "5f3feef3-xxxx-xxxx-xxxx-xxxxxxx",\n            "receiptHandle": "some handle",\n            "body": "body from SQS message",\n            "attributes": {\n                "ApproximateReceiveCount": "1",\n                "SentTimestamp": "1628768326353",\n                "SenderId": "senderid",\n                "ApproximateFirstReceiveTimestamp": "1628768326358"\n            },\n            "messageAttributes": {},\n            "md5OfBody": "checksum",\n            "eventSource": "aws:sqs",\n            "eventSourceARN": "arn:aws:sqs:[REGION]:[AccountID]:[FunctionName]",\n            "awsRegion": "REGION"\n        }\n    ]\n
Run Code Online (Sandbox Code Playgroud)\n

从事件中,您可以检查记录中的事件源字段以确定事件源是什么。

\n

该过程不会因 Docker 部署而改变,这里您仍然有一个接收事件和上下文的处理程序。Docker镜像的CMD指向handler。

\n

这在以下博客文章中有所体现:

\n\n

容器映像中的运行时接口客户端管理 Lambda 与函数代码之间的交互。运行时 API与扩展 API 一起定义了一个简单的HTTP 接口,供运行时接收来自 Lambda 的调用事件并响应成功或失败指示。

\n