带有 Neos CMS 的 AWS Lambda 的 bref.sh php 容器

Posted

技术标签:

【中文标题】带有 Neos CMS 的 AWS Lambda 的 bref.sh php 容器【英文标题】:bref.sh php container for AWS Lambda with Neos CMS 【发布时间】:2021-07-09 23:38:03 【问题描述】:

我正在努力让 Neos(基于 php 的 cms)在 AWS Lambda 的 docker 容器中运行。 我想我在某个地方有误会,希望有人能提供帮助。

到目前为止我做了什么:

    我调整了 Neos,使所有缓存文件都写入 tmp 文件夹 我在 composer.json 中添加了 bref 和 extra-php-extensions 包 我创建了一个 docker 文件,非常简单,如 Mattheu Naploli 的博客文章所示:https://mnapoli.fr/aws-lambda-php-docker-containers/ 我创建了一个 cloudformation 模板来使用sam local start-api

Dockerfile:

FROM bref/php-74-fpm

COPY . /var/task

# Start Bref's runtime client
CMD _HANDLER=Web/index.php /opt/bootstrap

模板.yml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  neos-demo-lambda

  Sample SAM Template for neos-demo-lambda

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 3

Resources:
  Neos:
    Type: AWS::Serverless::Function
    Properties:
      Description: Show neos demo
      PackageType: Image
      ImageUri: neos7.demo.lambda.php74:latest
      #Handler: "Web/index.php /opt/bootstrap"
      #Handler: "Web/index.php"
      MemorySize: 1024
      Timeout: 360
      Environment:
        Variables:
          FLOW_CONTEXT: 'Production'
          FLOW_PATH_TEMPORARY_BASE: '/tmp/neos'
          FLOW_PATH_DATA_BASE: '/tmp/Data'
          BREF_AUTOLOAD_PATH: '/var/task/Packages/Libraries/autoload.php'
          AWS_S3_BUCKET_STORAGE: 'neos-lambda-demo-private'
          AWS_S3_BUCKET_TARGET: 'neos-lambda-demo-public'
          AWS_CLOUDFRONT_BASE_URI: ''
          AWS_REDIS_HOST: ''

      Events:
        htmlHttpApi:
          Type: HttpApi
          TimeoutInMillis: 28000

    Metadata:
      DockerTag: neos7.lambda.demo
      DockerContext: ./Web/index.php
      Dockerfile: Dockerfile

sam local start-api的回复:

entrypoint requires the handler name to be the first argument
time="2021-04-14T22:11:48.093" level=error msg="Init failed" InvokeID= error="Runtime exited with error: exit status 142"
time="2021-04-14T22:11:48.093" level=error msg="INIT DONE failed: Runtime.ExitError"
Invalid lambda response received: Lambda response must be valid json
2021-04-15 00:11:48 127.0.0.1 - - [15/Apr/2021 00:11:48] "GET / HTTP/1.1" 502 -

我不明白的是,我希望总是返回一个有效的 json,即使 php 提供了 5xx 错误。 我迷路了......即使情况并非如此,我该如何调试问题?

最后,我必须创建自己的 docker 映像,因为 Neos 太大而无法使用 bref 层,我需要相当多的 php 扩展。 如果我能理解当前的问题,我可以解决这个问题并为每个人提供一个工作容器。

我还有几个问题,在这种情况下,我是否有一个 Web 应用程序并使用容器,我是否必须使用 composer 安装 bref 包?这在博客文章中并不清楚。我还必须在 serverless/sam 中设置处理程序吗?如果是这样,这将是正确的字符串,因为 Web/index.php 是 Neos 中的路径?

一般来说,Neos 在 AWS 中会非常出色。 我的设置是:

    CloudFront 具有从 S3 和其他一切到 lambda 的静态文件的行为 Redis 存储来自 Neos 的缓存文件 ElasticSearch 用于网站搜索并提高大型网站的性能

一旦这个工作正常,我将免费发布所有信息供 Neos 社区使用。

希望有人能帮忙...

谢谢!

【问题讨论】:

【参考方案1】:

你可以试试这个:

FROM bref/php-74-fpm

# Include any extension you want, for example:
#COPY --from=bref/extra-gd-php-74:0.9.5 /opt /opt

ADD . $LAMBDA_TASK_ROOT

CMD [ "index.php" ]

自文章以来,格式已被简化(见https://gist.github.com/mnapoli/f911a50c7aab77690e6cdde157812265)。

【讨论】:

谢谢,我又进了一步!但是现在得到一个 fpm 错误:ALERT: [pool default] user has not been defined, ERROR: failed to post process the configuration, ERROR: FPM initialization failed Error while started PHP-FPM Fatal error: Exception: PHP-FPM failed to start

以上是关于带有 Neos CMS 的 AWS Lambda 的 bref.sh php 容器的主要内容,如果未能解决你的问题,请参考以下文章

带有 AWS lambda 的 Terraform

向 AWS Lambda 发送带有正文的请求

带有 Lambda 函数的 AWS EBS 与 EFS

带有putrecord的lambda函数的AWS firehose delievery流

通过带有响应的 AWS Lambda 上传和处理文件

带有 AWS Lambda 错误“找不到模块”的无服务器框架