【发布时间】:2021-10-15 03:36:33
【问题描述】:
我目前有一个简单的 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}
此流程运行良好 - 写入 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
它按预期工作,在 Docker 容器中运行 python3 print_message.py。
有什么方法可以访问触发 Lambda 的 SQS 事件,类似于def handler(event, context) 行,但在print_message.py 脚本内:
import os
import json
event = ???
print("Event: {}".format(event))
【问题讨论】:
-
为了澄清,您是否希望 SQS 调用 ECR 中的服务,就像调用 Lambda 函数一样?
-
@Jason 我仍然想调用 Lambda 函数,但我不想将代码部署为 ZipFile,而是将其部署为运行特定脚本的 Docker 映像。我想知道如何将处理程序迁移到该脚本,以便处理从 SQS 收到的触发 Lambda 的消息。
标签: docker aws-lambda amazon-cloudformation amazon-sqs