Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

使用 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 控制台并创建您的函数:

  1. 点击 “Create function”。
  2. 选择 “Container image”。
  3. 在 “Function name” 中输入名称。
    • 注意:这是一个内部标识符,不会在函数 URL 中公开。
  4. 点击 “Browse images”,然后选择您的仓库和标签。
    • 如果找不到,请查看您是否在同一区域?
  5. 展开 “Container image overrides”,在 CMD 下放置 .pmtiles 文件的 URL。
  6. 将 “Architecture” 设置为 arm64 以匹配我们拉取的平台。Lambda 的 ARM CPU 比 x86 更好。
  7. 点击 “Create function”。
  8. 找到 “Configuration” 选项卡,选择 “Function URL”,“Create function URL”。
  9. 将 “Auth type” 设置为 NONE
    • 不要启用 CORS。Martin 已经有 CORS 支持,因此它会创建不正确的重复标头。
  10. 点击 “Function URL”。
  11. 要调试问题,请打开 “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。

  1. Stack Name:为您的 CloudFormation 堆栈命名,例如 martin-layer。
  2. 其他所有选项按 Enter
  3. 设置保存到 samconfig.toml,因此您以后可以执行 sam deploy 来更新版本,或执行 sam delete。

现在,如果您访问 Lambda 控制台并选择 “Layers”,您应该会看到您的 layer。

函数

  1. 选择 “Functions”,“Create function”。
  2. 在 “Function name” 中输入名称。
  3. 将 “Runtime” 设置为 “Amazon Linux 2023”。
  4. 将 “Architecture” 设置为 “arm64”。
  5. 在 “Advanced settings” 下,选择 “Enable function URL”,“Auth type” 为 “NONE”。
  6. 点击 “Create function”。

添加您的 layer:

  1. 点击 “add a layer”(顶部的绿色横幅,或最底部)。
  2. 选择 “Custom layers”,然后选择您的 layer 及其版本。
  3. 点击 “Add”。

在函数源代码中添加您的配置文件:

  1. Code 选项卡,File,New File:hello.handler.yaml。

    pmtiles:
      sources:
        demotiles: <url to a pmtiles file>
    
  2. 点击 Deploy,等待成功横幅,然后访问您的函数 URL。

TODO

AWS Lambda 支持是初步的;有功能要添加到 Martin,配置要调整,文档要改进。欢迎您的帮助。

  • Lambda 的默认超时为 3 秒,内存为 128 MB,这可能不是最优的。
  • 记录如何连接到 RDS 上的 PostgreSQL 数据库。
  • 设置 CloudFront CDN,这是一件大事,但解释动机和基础知识。
  • 授予执行角色从 S3 存储桶读取对象的权限,并教 Martin 如何向 S3 发出经过身份验证的请求。
  • 教 Martin 如何从 S3 存储桶提供所有 PMTiles 文件,而不必在启动时列出它们。
  • 教 Martin 如何设置 Cache-Control 和 Etag 标头以获得更好的默认值。