• Amazon Lambda 转 Container Image 方式部署


    背景描述

    对于从 Lambda Console通过 Author from scratch 创建的函数, 可以直接在浏览器中编辑代码和调试, 非常方便. 不过由于 Lambda 函数 Quota 限制 Console 编辑器最大 3MB, 包含 Layer 和自定义 Runtim 后最大 250MB, 并且此配额不支持提限, 因此当函数体量较大时就不适合了. 而 Container Image 方式最大支持 10GB (包含 Layer 和自定义 Runtime), 可以满足更高的需求.

    本文将讨论如何将现有的 Lambda 函数转换成 Container Image 方式进行部署.

    操作步骤

    导出现有的 Lambda 函数

    从 Console 创建的一个简单的 Python 3.10 函数, 入口函数名为 lambda_handler

    import json
    
    def lambda_handler(event, context):
        # TODO implement
        return {
            'statusCode': 200,
            'body': json.dumps('Hello from Lambda!')
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Console 方式

    在这里插入图片描述

    AWS CLI 方式

    # Linux
    aws lambda get-function --function-name pd-demo --query 'Code.Location' | xargs curl -o function.zip
    
    # 如果 xargs 命令找不到, 需要单独安装
    # sudo apt install findutils
    
    # Windows PowerShell
    Invoke-WebRequest -Uri (aws lambda get-function --function-name pd-demo --query 'Code.Location').trim('"') -OutFile function.zip
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    创建 Container image

    官方文档

    # 解压导出的 ZIP 文件
    unzip function.zip -d function && cd function
    
    # 创建依赖说明文件
    vim requirements.txt
    
    # 创建 Dockerfile
    vim Dockerfile
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    requirements.txt 示例

    pandas == 2.0.3
    requests == 2.31.0
    
    • 1
    • 2

    Dockerfile 示例 (Python 3.10)

    FROM public.ecr.aws/lambda/python:3.10
    
    # Copy requirements.txt
    COPY requirements.txt ${LAMBDA_TASK_ROOT}
    
    # pip 使用清华大学镜像源
    RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt --no-cache-dir
    
    # Copy function code
    COPY lambda_function.py ${LAMBDA_TASK_ROOT}
    
    # 注意这里的入口命令需要和代码中的入口函数名称保持一致
    CMD [ "lambda_function.lambda_handler" ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    # 构建 Image
    docker build --platform linux/amd64 -t pd-demo:latest .
    
    # 本地启动 Container 测试
    docker run -p 9000:8080 --rm pd-demo:latest
    
    # 使用 curl 测试调用
    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
    
    # 成功返回
    {"statusCode": 200, "body": "\"Hello from Lambda!\""}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    上传 Container image 到 ECR

    首先在和 Lambda 相同 Region 的 ECR Console 创建 Repository, 或者通过 AWS CLI 创建:

    aws ecr create-repository --repository-name pd-demo --region cn-northwest-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
    
    • 1

    登录并推送本地构建好的 Image 到 ECR, 相关命令可以直接从 ECR repository 的 View push commands 获取
    在这里插入图片描述

    aws ecr get-login-password --region cn-northwest-1 | docker login --username AWS --password-stdin 000000000000.dkr.ecr.cn-northwest-1.amazonaws.com.cn
    
    docker tag pd-demo:latest 000000000000.dkr.ecr.cn-northwest-1.amazonaws.com.cn/pd-demo:latest
    
    docker push 000000000000.dkr.ecr.cn-northwest-1.amazonaws.com.cn/pd-demo:latest
    
    • 1
    • 2
    • 3
    • 4
    • 5

    通过 Container image 创建 Lambda 函数

    Lambda Console > Create function > Container image > Browse images

    在这里插入图片描述
    在这里插入图片描述

    需要留意, 通过 Container image 创建的函数将不再能从浏览器中直接查看和编辑代码
    在这里插入图片描述

    测试正常运行
    在这里插入图片描述

  • 相关阅读:
    Linux shell编程学习笔记16:bash中的关联数组
    Java并发编程之Future原理分析
    Vue底层监测数据变化的原理
    Python--类
    操作系统实验 & bochs 环境配置
    理解STM32的低功耗模式
    认识SQLServer
    Vue-1.8生命周期
    stm32单片机测量外部脉冲宽度
    【玩转Rabbitmq系列】01:一文带你敲响Rabbitmq的大门
  • 原文地址:https://blog.csdn.net/lpwmm/article/details/134076376