在AWS Lambda中运行Docker容器的完整指南

本文详细介绍了如何将Docker容器部署到AWS Lambda服务器less服务中,涵盖从本地构建、测试Docker镜像,到推送到Amazon ECR容器仓库,最后在Lambda中创建和测试函数的全流程。文章包含具体的代码示例、Dockerfile配置和AWS CLI操作命令,为开发者提供了一份实用的操作指南。

如何在AWS Lambda中运行Docker容器

虽然容器相当轻量级并提供各种好处,但决定如何最好地部署它们可能具有挑战性。部署和运行Docker容器有多种方式。但有些方法最适合编排和管理容器,可能不适合仅运行单个容器的简单用例。

在本文中,我将教你如何使用AWS上一个名为Lambda的服务器less服务来部署单个Docker容器。

目录

  • 前提条件/要求
  • 使用AWS Lambda实现服务器less
  • 如何在本地构建、运行和测试容器
  • 如何将镜像推送到Amazon Elastic Container Registry (ECR)
  • 如何将Docker镜像部署到Lambda
  • 清理工作
  • 结论

前提条件/要求

遵循本教程需要以下工具和技能:

  • 了解Docker,并在本地安装Docker。
  • 一个具有管理员权限的AWS账户,用于通过CLI进行API调用。最佳实践是将权限限制为仅执行所需操作。
  • 本地安装AWS CLI
  • Python虚拟环境管理器,如uv(可选)

使用AWS Lambda实现服务器less

容器提供了一种轻量级、一致且资源友好的运行应用程序的方式。服务器less消除了管理容器运行的底层基础设施的开销。因此,正如你可能开始看到的,结合这些工具可以帮助你部署应用程序,让你专注于业务逻辑、性能以及赋予产品竞争优势的方面。

AWS上一个让你实现服务器less的工具是Lambda。使用Lambda时,你只需为函数中代码运行的次数、配置服务时选择的内存大小以及每次函数调用的持续时间付费。

除了消除操作开销外,Lambda还可以帮助你节省资金,因为你无需处理闲置资源。该函数仅在收到发送给它的请求触发时才启动。

如何在本地构建、运行和测试容器

Docker是一个工具,可以帮助你将应用程序或软件打包成可移植、标准化和可共享的单元,这些单元拥有应用程序运行所需的一切,例如库、运行时、系统工具、应用程序代码。这些单元被称为容器。

在本节中,我将引导你完成构建Docker镜像、运行容器以及在运行后对其进行测试的过程。

你可以在此GitHub仓库中找到将使用的项目。

构建Docker镜像

要运行Docker容器,首先需要构建一个镜像。镜像成为创建容器或类实例的模板或类。

你可以在lambda_function.py中找到构建镜像的代码。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# lambda_function.py

def lambda_handler(event, context):
    name = event["name"]
    message = f"Hello, {name}!"

    try:
        return {
            "statusCode": 200,
            "body": message
        }
    except Exception as e:
        return {
            "statusCode": 400,
            "body": {"error": str(e)}
        }

从上面的代码可以看出,这是一个非常基础的Python应用程序,期望一个POST HTTP请求,其中包含一个JSON负载,该负载包含键name及其对应的值。然后代码返回一个包含接收到的名字的问候语。该应用程序只有一个函数,该函数也作为其入口点。

要构建Docker镜像,你需要一个Dockerfile来提供镜像的蓝图。对于这个特定情况,你将使用的Dockerfile也非常基础。Dockerfile中的每一行称为一个指令,这提供了Docker在创建镜像时应遵循的说明。因此,构建Docker镜像意味着通过遵循Dockerfile中的指令或指示来为容器创建模板。

1
2
3
4
5
6
7
8
9
# Dockerfile

FROM public.ecr.aws/lambda/python:3.12

# 复制功能代码... LAMBDA_TASK_ROOT是/var/task,基础镜像中设置的工作目录
COPY lambda_function.py ${LAMBDA_TASK_ROOT}

# 将CMD设置为你的处理器 - lambda_handler
CMD ["lambda_function.lambda_handler"]

Dockerfile通常以基础镜像开始。要在AWS Lambda中将应用程序部署为Docker容器,基础镜像必须是特定类型的,具体取决于应用程序的运行时。对于这种情况,你需要Python运行时,所以基础镜像是public.ecr.aws/lambda/python:3.12。使用不同的Python版本也可以。

Dockerfile中的下一个指令是将lambda_function.py文件复制到基础镜像中的特定路径。该路径使用一个环境变量引用,该变量已在基础镜像中定义并指向/var/task。这是你的代码将运行的目录。

最后一个指令只是一个在容器运行时启动应用程序的命令。

现在,你可以从项目的根目录运行构建命令:

1
docker build -t <镜像名称>:<镜像标签> .

运行Docker容器

接下来,让我们从此镜像创建一个运行中的容器。

1
docker run -it --rm -p 8080:8080 lambda_docker:1.0.0

上面的命令将创建一个容器并以交互模式运行它,以便你可以查看容器中应用程序生成的日志。端口8080也在运行容器的主机上公开,并映射到容器端口,该端口也是8080(由AWS定义)。一旦你用CTRL + C终止运行进程,容器将自动移除。

测试运行中的容器

现在确认在容器内运行的应用程序可以接收和处理请求。为此,使用test.py文件中的代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# test.py

import requests

url = "http://localhost:8080/2015-03-31/functions/function/invocations"

data = {
    "name": "Janet"
}

response = requests.post(url, json=data)

print("状态码:", response.status_code)
print("响应体:", response.json())

你可以使用Python的requests库来进行此调用。通过使用虚拟环境将应用程序与整个系统隔离来安装该库。这有助于防止应用程序使用的库版本冲突问题。

如果你使用uv来管理虚拟环境,只需运行命令:

1
uv add requests

然后从虚拟环境中运行test.py中的代码:

1
uv run python3 test.py

你应该在终端上看到期望的响应。

如何将镜像推送到Amazon Elastic Container Registry (ECR)

现在你有一个可工作的Docker镜像要部署到Lambda,下一步是将镜像推送到Docker仓库。对于这个用例,你的镜像必须推送到Amazon ECR,这是一个用于存储Docker镜像的容器仓库。

要推送你的Docker镜像,首先需要给镜像打标签,这只是以一种特定的方式命名镜像。

目前,这个镜像标签是lambda-docker:1.0.0。要按AWS的方式标记它,首先创建一个ECR仓库。让我们为此使用AWS CLI(这要求你通过在本地运行aws configure命令并提供你的凭证来配置AWS凭证)。

设置环境变量

1
2
3
4
5
6
7
8
9
# 设置AWS配置文件
export AWS_PROFILE=<配置文件名称>

# 设置其他变量

AWS_REGION=<AWS区域>
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
REPO_NAME=lambda-docker
TAG=1.0.0

上述命令设置CLI的AWS_PROFILE以针对正确的AWS账户进行API调用。其他变量指定区域、账户ID以及ECR仓库名称和标签。

创建ECR仓库并进行身份验证

现在,创建ECR仓库:

1
2
3
aws ecr create-repository \
  --repository-name "$REPO_NAME" \
  --region "$AWS_REGION"

验证到Amazon ECR:

1
2
3
4
aws ecr get-login-password --region "$AWS_REGION" \
  | docker login \
  --username AWS \
  --password-stdin "$ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com"

标记并推送Docker镜像

现在,标记Docker镜像:

1
2
docker tag $REPO_NAME:$TAG \
  $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$REPO_NAME:$TAG

将镜像推送到你创建的ECR仓库:

1
docker push $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$REPO_NAME:$TAG

就是这样!你的镜像现在在ECR中。

如何将Docker镜像部署到Lambda

既然你的镜像现在在ECR中,你可以创建一个Lambda函数。导航到Lambda控制台,然后单击“创建函数”。

选择“容器镜像”并继续搜索你创建的ECR仓库。

接下来,选择镜像:

其他配置保持默认,然后单击“创建”。

创建后导航到该函数。

测试部署

现在,让我们测试部署。为此,只需使用现有的Lambda“测试”选项卡。提供所有必需的详细信息,包括POST请求的负载。

就是这样。你已成功利用ECR和Lambda在AWS上部署了一个Docker容器。你可以更进一步,集成API Gateway并使该函数可从互联网访问。

清理工作

请记住删除你在AWS ECR仓库和Lambda上创建的服务,以避免额外费用。

结论

将Docker容器部署到AWS Lambda是一种高效的方式,可以快速让你的应用程序运行,而无需为管理服务器或平台而烦恼。

感谢阅读!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计