使用 AWS、Bref 和 PHP 创建无服务器网站
先决条件
首先我想说明,我假设您已经熟悉AWS和以下主题。如果您还不熟悉,我建议您至少先了解这些主题的基础知识,然后再尝试跟随我的讲解。
介绍
在 AWS 上搭建无服务器网站已成为一种普遍现象。这并不令人意外,因为与使用虚拟服务器的传统网站托管方案相比,无服务器网站托管具有诸多优势,例如:更好的可扩展性、更低的成本和更低的延迟。
大多数无服务器网站都依赖于静态网页技术,例如 JavaScript。这使得最简单的无服务器网站解决方案得以实现,如下图所示。
我们试图解决的问题是,这种简单的架构不支持像 ASP.NET、JSP 或 PHP 这样的动态Web 技术,而这些技术至今仍被用于构建令人惊叹的网站,例如 Etsy、Facebook 和 Slack 等网站。
动态网站可以利用 AWS 实现无服务器托管。这只需要几个额外的步骤和一些额外的服务。让我们一起来看看一个可行的解决方案。
简而言之
在 PHP 领域,有一个名为Bref的出色项目,我们可以用它来简化配置。借助 Bref,我们可以将 PHP 网站运行在 Lambda 上,而无需依赖 EC2 等服务。
引用他们的文件内容:
Bref 是一个开源项目,它为 AWS Lambda 带来了对 PHP 及其框架的全面支持。
用法
最简单的实现方法是将我们的网站打包成容器镜像,最终部署到 Lambda 函数。为了让 Lambda 函数引用该镜像,我们需要先将镜像上传到 ECR。幸运的是,AWS 让与 ECR 的交互变得极其简单。让我们一步步来了解具体步骤。
-
创建 Dockerfile
# reference bref as the base image FROM bref/php-74-fpm # install composer RUN curl -s https://getcomposer.org/installer | php # require bref RUN php composer.phar require bref/bref # copy contents into expected directory COPY . /var/task # set handler to our index CMD _HANDLER=index.php /opt/bootstraphttps://docs.docker.com/engine/reference/builder/
https://github.com/wheeleruniverse/cgc-aws-ml-recommendation-engine/blob/master/php-api/Dockerfile -
向 ECR 进行身份验证
aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com"https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/get-login-password.html
https://docs.docker.com/engine/reference/commandline/login/ -
构建 Docker 镜像
docker build -t ${AWS_ECR_REPOSITORY} . -
给你的 Docker 镜像打标签
docker tag "${AWS_ECR_REPOSITORY}:latest" "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${AWS_ECR_REPOSITORY}:latest" -
推送您的 Docker 镜像
docker push "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${AWS_ECR_REPOSITORY}:latest"
在 ECR 控制台中查找这些根据您的帐户定制的推送命令。
建筑学
现在我们的容器镜像已位于 ECR 中,我们可以创建一个引用它的 Lambda 函数。
完成上述步骤后,我们需要使用 API 网关为我们的函数提供一个端点。
然后我们可以将该端点作为 CloudFront 源来提供我们的网站服务。
最后,我们可以通过将静态内容上传到 S3 并使用单独的源来提供该内容,从而优化此架构。
CI/CD
众所周知,网站会定期更新,因此我想简要介绍一下持续集成和持续部署。我会实现一个流程,当代码变更推送到 Git 仓库时,在 ECR 和 Lambda 中构建并更新容器镜像。这对于保持环境与 Git 仓库同步至关重要,同时避免手动部署。手动部署容易出错,而且完全可以避免。当脚本中的源代码发生变更时,只需重复上述步骤即可轻松创建镜像并更新 ECR。按照这些步骤,再加上类似下面的操作,我们就可以自动更新 Lambda 函数。
aws lambda update-function-code \
--function-name ${AWS_LAMBDA_FUNCTION} \
--image-uri "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${AWS_ECR_REPOSITORY}:latest" \
--region ${AWS_REGION}
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html
如果你是 CI/CD 新手,那么我推荐你参考这些优秀的入门资源。
结论
我们首先讨论了使用无服务器技术托管动态网站的问题。然后我们讨论了 Bref 和 Docker,它们都有助于托管无服务器版本的 PHP。接着,我们详细了解了所需的架构。我们将容器镜像推送到 ECR,并将 PHP 代码部署为 Lambda 函数。之后,我们创建了一个 API 网关端点,用于通过 HTTP 调用 Lambda 函数。最后,我们将静态内容上传到 S3,并将两个源都置于 CloudFront 分发之后。总而言之,我想重申,动态网站可以享受到无服务器技术的优势,我坚信这绝对值得付出努力。
请查看我开发的这个实时无服务器 PHP 网站,它就是一个生动的例子。
如果您喜欢这篇文章,或许您可以请我喝杯咖啡,或者在领英上与我联系。
文章来源:https://dev.to/aws-builders/creating-serverless-websites-with-aws-bref-and-php-203j



