使用 AWS Lambda - v0.14+
Martin 可以在 AWS Lambda 中运行。如果您想从无服务器环境提供瓦片,同时从 PostgreSQL 数据库或 S3 中的 PMTiles 文件访问“附近“数据,而不向世界公开原始文件以防止下载滥用并提高性能,这非常有用。
Lambda 有两种部署模型:zip 文件和基于容器。使用 zip 文件部署时,有一个在线代码编辑器可编辑 yaml 配置。使用基于容器的部署时,我们可以在命令行或环境变量中传递配置。
一切都可以通过 AWS CloudShell 执行,或者您可以安装 AWS CLI 和 AWS SAM CLI,并配置身份验证。CloudShell 也在特定的 AWS 区域中运行。
容器部署
Lambda 镜像必须来自公共或私有 ECR 注册表。从 GHCR 拉取镜像并推送到 ECR。
$ docker pull ghcr.io/maplibre/martin:0.20.2 --platform linux/arm64
$ aws ecr create-repository --repository-name martin
[…]
"repositoryUri": "493749042871.dkr.ecr.us-east-2.amazonaws.com/martin",
# 读取包含您帐户号码的 repositoryUri
$ docker tag ghcr.io/maplibre/martin:0.20.2 493749042871.dkr.ecr.us-east-2.amazonaws.com/martin:latest
$ aws ecr get-login-password --region us-east-2 \
| docker login --username AWS --password-stdin 493749042871.dkr.ecr.us-east-2.amazonaws.com
$ docker push 493749042871.dkr.ecr.us-east-2.amazonaws.com/martin:latest
打开 Lambda 控制台并创建您的函数:
- 点击 “Create function”。
- 选择 “Container image”。
- 在 “Function name” 中输入名称。
- 注意:这是一个内部标识符,不会在函数 URL 中公开。
- 点击 “Browse images”,然后选择您的仓库和标签。
- 如果找不到,请查看您是否在同一区域?
- 展开 “Container image overrides”,在 CMD 下放置
.pmtiles文件的 URL。 - 将 “Architecture” 设置为
arm64以匹配我们拉取的平台。Lambda 的 ARM CPU 比 x86 更好。 - 点击 “Create function”。
- 找到 “Configuration” 选项卡,选择 “Function URL”,“Create function URL”。
- 将 “Auth type” 设置为
NONE- 不要启用
CORS。Martin 已经有CORS支持,因此它会创建不正确的重复标头。
- 不要启用
- 点击 “Function URL”。
- 要调试问题,请打开 “Monitor” 选项卡,“View CloudWatch logs”,找到最近的日志流。
Zip 部署
可以从 AWS 控制台部署整个代码库,但我们将使用无服务器应用程序模型。我们的函数将由一个 “Layer”(包含 Martin 二进制文件)组成,我们的函数本身将以 yaml 格式包含配置。
Layer
下载二进制文件并将其放置在您的暂存目录中。Layer 的 bin 目录将被添加到 PATH。
mkdir -p martin_layer/src/bin/
cd martin_layer
curl -OL https://github.com/maplibre/martin/releases/latest/download/martin-aarch64-unknown-linux-musl.tar.gz
tar -C src/bin/ -xzf martin-aarch64-unknown-linux-musl.tar.gz martin
每个基于 zip 的 Lambda 函数都运行一个名为 bootstrap 的文件。
cat <<EOF >src/bootstrap
#!/bin/sh
set -eu
exec martin --config \${_HANDLER}.yaml
EOF
编写 SAM 模板。
cat <<EOF >template.yaml
AWSTemplateFormatVersion: 2010-09-09
Transform: 'AWS::Serverless-2016-10-31'
Resources:
MartinLayer:
Type: 'AWS::Serverless::LayerVersion'
DeletionPolicy: Delete
Properties:
ContentUri: src
CompatibleRuntimes:
- provided.al2023
CompatibleArchitectures:
- arm64
Outputs:
LayerArn:
Value: !Ref MartinLayer
Export:
Name: !Sub "${AWS::StackName}-LayerArn"
EOF
运行 sam deploy --guided。
- Stack Name:为您的 CloudFormation 堆栈命名,例如
martin-layer。 - 其他所有选项按 Enter
- 设置保存到
samconfig.toml,因此您以后可以执行sam deploy来更新版本,或执行sam delete。
现在,如果您访问 Lambda 控制台并选择 “Layers”,您应该会看到您的 layer。
函数
- 选择 “Functions”,“Create function”。
- 在 “Function name” 中输入名称。
- 将 “Runtime” 设置为 “Amazon Linux 2023”。
- 将 “Architecture” 设置为 “arm64”。
- 在 “Advanced settings” 下,选择 “Enable function URL”,“Auth type” 为 “NONE”。
- 点击 “Create function”。
添加您的 layer:
- 点击 “add a layer”(顶部的绿色横幅,或最底部)。
- 选择 “Custom layers”,然后选择您的 layer 及其版本。
- 点击 “Add”。
在函数源代码中添加您的配置文件:
-
Code 选项卡,File,New File:
hello.handler.yaml。pmtiles: sources: demotiles: <url to a pmtiles file> -
点击 Deploy,等待成功横幅,然后访问您的函数 URL。
TODO
AWS Lambda 支持是初步的;有功能要添加到 Martin,配置要调整,文档要改进。欢迎您的帮助。
- Lambda 的默认超时为 3 秒,内存为 128 MB,这可能不是最优的。
- 记录如何连接到 RDS 上的 PostgreSQL 数据库。
- 设置 CloudFront CDN,这是一件大事,但解释动机和基础知识。
- 授予执行角色从 S3 存储桶读取对象的权限,并教 Martin 如何向 S3 发出经过身份验证的请求。
- 教 Martin 如何从 S3 存储桶提供所有 PMTiles 文件,而不必在启动时列出它们。
- 教 Martin 如何设置 Cache-Control 和 Etag 标头以获得更好的默认值。