dayspring-tech / lambda-bundle
通过 AWS Lambda 运行 symfony 代码
v0.5.0
2023-08-14 22:36 UTC
Requires
- php: >=7.4
- ext-json: *
- bref/bref: ^1.7
- sensio/framework-extra-bundle: ^5.0.1
- symfony/dotenv: ^4.4|^5.0
- symfony/framework-bundle: ^4.4|^5.0
- symfony/yaml: ^4.4|^5.0
Requires (Dev)
- phpunit/phpunit: ^8.5.14
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 将执行它。这是您的自定义运行时。
- Lambda 运行时 API 公开了三个 API。您的自定义运行时应调用
/next
API 请求下一个事件。 - 您的自定义运行时应执行代码来处理事件。对于 LambdaBundle,这将是调用通过 Lambda 函数的命令参数指定的
LambdaHandlerServiceInterface
上的handle()
函数。 - 如果成功,您的自定义运行时将调用
/response
API 并 POST 函数的响应。 - 在出现错误时,您的自定义运行时将调用
/error
API 并提供错误的详细信息。
另请参阅
- https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html
- https://docs.aws.amazon.com/lambda/latest/dg/runtimes-api.html
提供的处理器
以下处理器作为示例或 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 中的任务