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)
更新:包括“如何知道来源”
\n我的理解是,您希望将创建的 docker 代码迁移到 Lambda 函数。您希望重用容器代码,并将其作为 Lambda 调用。
\n如果我的假设是正确的话。您的容器需要运行Lambda Runtime API。AWS提供预安装运行时的基础 docker 镜像。
\n请注意将容器映像部署到 Lambda 时的要求,文档指出:
\n您在 zip 文件中使用的处理程序仍然是必需的,它是使用容器映像设置进行设置的:
\nLambda 支持 Dockerfile 中的以下容器映像设置,AWS 文档概述了以下容器设置:
\nENTRYPOINT\xe2\x80\x93 指定应用程序入口点的绝对路径。
CMD\xe2\x80\x93 指定要通过 传入的参数ENTRYPOINT。
WORKDIR\xe2\x80\x93 指定工作目录的绝对路径。
ENV\xe2\x80\x93 指定 Lambda 函数的环境变量。
这是一篇很棒的博客文章CMD,描述了和之间的区别ENTRYPOINT。
以下博客文章介绍了如何创建可部署为 Lambda 函数的 Docker 容器。
\n将容器部署到 ECR 后,您就可以使用CloudFormation,就像必须使用以下方法将容器作为 Lambda 函数部署在 ECR 中一样AWS::Lambda::Function:
如果部署包是容器镜像,则将包类型设置为镜像。对于容器映像,code 属性必须包含 Amazon ECR 注册表中容器映像的 URI。您不需要指定处理程序和运行时属性,因为这是使用上面提到的容器设置进行设置的。
\n然后,您还可以使用 CloudFormation 创建一个调用 Lambda Function 的 SQS 队列AWS::Lambda::EventSourceMapping。
更多信息请点击这里。
\n作为 zip 或通过控制台部署的标准node.js Lambda 函数的事件处理程序将传递三个参数:
\n这种结构对于其他语言来说是相同的。
\ndef lambda_handler(event, context): public String handleRequest(Map<String,String> event, Context context)public async Task Handler(ILambdaContext context)func HandleRequest(ctx context.Context, name MyEvent) (string, error) {def handler(event:, context:)事件函数返回有关调用事件的信息,在本例中为 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 ]\nRun Code Online (Sandbox Code Playgroud)\n从事件中,您可以检查记录中的事件源字段以确定事件源是什么。
\n该过程不会因 Docker 部署而改变,这里您仍然有一个接收事件和上下文的处理程序。Docker镜像的CMD指向handler。
\n这在以下博客文章中有所体现:
\n\n容器映像中的运行时接口客户端管理 Lambda 与函数代码之间的交互。运行时 API与扩展 API 一起定义了一个简单的HTTP 接口,供运行时接收来自 Lambda 的调用事件并响应成功或失败指示。
\n| 归档时间: |
|
| 查看次数: |
1189 次 |
| 最近记录: |