dayspring-tech/lambda-bundle

通过 AWS Lambda 运行 symfony 代码

安装量: 16,643

依赖关系: 0

建议者: 0

安全: 0

星星: 0

观察者: 3

分支: 0

开放问题: 0

类型:symfony-bundle

v0.5.0 2023-08-14 22:36 UTC

This package is auto-updated.

Last update: 2024-09-14 04:38:08 UTC


README

此包提供了使用 Lambda 运行 Symfony 代码的工具。您的应用程序将作为 自定义 Lambda 运行时 运行。

这是基于 bref 的 控制台示例引导脚本,并消除了只能使用控制台命令的需求。它还会在 Lambda 工作者的整个生命周期中只引导一次 Symfony 内核。

bref 提供了一个 Lambda 运行时 API 客户端实现。这处理与 Lambda 运行时 API 的通信。

使用此包

1. 将此包添加到您的 Symfony 项目中。

  • 通过运行 composer require dayspring-tech/lambda-bundle 将此包添加到您的项目中。
  • 将项目打包到 Docker 镜像中。
  • Bootstrap/service.php 添加到您的镜像中作为 /var/run/bootstrap,并使其可执行。这是您自定义 Lambda 运行时的基础。
    # this is really what does the magic
    COPY symfony/vendor/dayspring-tech/lambda-bundle/Bootstrap/service.php /var/runtime/bootstrap
    RUN chmod a+x /var/runtime/bootstrap
    

2. 创建一个实现 LambdaHandlerServiceInterface 的类

  • 创建一个实现 LambdaHandlerServiceInterface 的类,并将其与 Symfony 的依赖注入容器注册。应将其标记为公共,以便可以通过名称获取它。
  • 实现 handle() 函数
    • 自定义运行时会调用 handle() 函数,为每个 Lambda 事件传递事件对象作为 $event 参数。
    • Lambda 上下文信息将通过 $context 参数提供。
    • 自定义运行时将提供一个 OutputInterface 对象,您可以使用它提供任何应从 Lambda 函数返回的输出。

3. 注册 Lambda 函数

  • 在 AWS 中使用您的 Docker 镜像创建 Lambda 函数。将 Lambda 命令设置为服务名称。

关于自定义 Lambda 运行时和 Lambda 运行时 API 的背景

如果您的 Docker 镜像中存在 /var/run/bootstrap 文件,Lambda 将执行它。这是您的自定义运行时。

  1. Lambda 运行时 API 公开了三个 API。您的自定义运行时应调用 /next API 请求下一个事件。
  2. 您的自定义运行时应执行代码来处理事件。对于 LambdaBundle,这将是调用通过 Lambda 函数的命令参数指定的 LambdaHandlerServiceInterface 上的 handle() 函数。
  3. 如果成功,您的自定义运行时将调用 /response API 并 POST 函数的响应。
  4. 在出现错误时,您的自定义运行时将调用 /error API 并提供错误的详细信息。

另请参阅

提供的处理器

以下处理器作为示例或 LambdaHandlerServiceInterface 的常见实现提供

EchoLambdaHandlerService

此处理器将事件 body 值回显到 Lambda 的输出。对于测试您的容器和 Lambda 配置很有用。

{
    "body": "hello world"
}

ServiceFunctionHandlerService

此处理器可以处理 lambda 事件并调用通过 Symfony 的依赖注入容器可用的任何服务的任何公共函数。

它期望 lambda 事件以以下格式

{
    "serviceName": "AppBundle\\Service\\EchoService",
    "function": "echo", 
    "args": [
        "hello"
    ]
}
  • serviceName:与 Container::get() 有效的任何服务标识符。这很可能是服务类名。
  • function:函数名
  • args:函数的参数数组

SqsServiceFunctionHandlerService

此处理器与 ServiceFunctionHandlerService 执行相同的功能,但针对通过 SQS 发送的消息

它期望通过 SQS 而不是直接发送到 Lambda 来发送有效负载。

其他实现可能性

  • API 网关 - 配置 Lambda 与 API 网关的集成,并使用 Symfony 处理 API 请求
  • SNS - 将 Lambda 订阅到 SNS 主题,并处理 SNS 的消息
  • 自定义事件 - 将 Lambda 配置为 Step Functions 中的任务