问题描述
我正在努力让 Neos(基于 PHP 的 cms)在 AWS Lambda 的 docker 容器中运行。 我想我在某个地方有误解,希望任何人都可以提供帮助。
到目前为止我做了什么:
- 我调整了 Neos,以便将所有缓存文件写入 tmp 文件夹
- 我将 bref 和 extra-PHP-extensions 包添加到 composer.json
- 我创建了一个 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 中的表现会很棒。 我的设置是:
一旦此功能生效,我将免费为 Neos 社区发布所有信息以使其正常工作。
希望有人能帮忙...
谢谢!
解决方法
你能不能试试这个:
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)。