将Laravel应用程序部署到AWS Elastic Beanstalk上的教程

365 阅读13分钟

在这篇文章中, 我们将通过设置Elastic Beanstalk环境, 创建一个新的Laravel应用程序, 将应用程序部署到你的Elastic Beanstalk环境, 并为它设置一个数据库的过程。

前提条件

要遵循本指南, 你应该具备以下条件:

  • PHP, MySQL, 和Apache安装在你的电脑上。Xampp自带这些,所以如果你还没有,你可以安装Xampp
  • 安装了Laravel
  • 安装了Composer

步骤1 - 创建要部署的Laravel应用程序

让我们用composer创建一个新的Laravel应用程序。

composer create-project --prefer-dist laravel/laravel appName

('appName'应该改成你想给你的应用起的名字)

接下来, 导航到应用程序的目录:

cd appName

新的Laravel应用程序总是带有一些模板代码, 一个骨架的应用程序,你可以在此基础上建立。由于本教程的重点是部署, 我们不会对这个应用程序做任何修改.要快速浏览它,请运行php artisan serve并在浏览器中导航到http://localhost:8000

我们将以压缩文件的形式把我们的应用程序上传到AWS,所以请导航到你的项目目录,把其中的所有文件和文件夹压缩成一个压缩文件。你不需要包括你的供应商文件夹,因为它可能相当重,而且设置时不需要。

第2步--创建一个Elastic Beanstalk环境

为了使用Elastic Beanstalk(和其他AWS服务),你需要首先创建一个AWS账户

Sign up for AWS 注册AWS

注册后,你会被重定向到AWS控制台,那里列出了所有AWS服务。从选项列表中选择Elastic Beanstalk。

List of AWS services AWS服务列表

接下来,点击创建应用程序按钮。

Create Application 创建应用程序

你会被转到一个表格,你将在上面提供你的应用程序的细节。应用程序的名称可以是你想要的任何东西。

Form for Application 应用程序的表格

标签可以帮助你对应用程序进行分类,如果你在Elastic Beanstalk上有大量的应用程序,这尤其有帮助。它们通常会提供关于你要部署的应用程序的有用信息,比如它是用于开发还是生产。你可以添加多达50个标签。

平台的下拉列表中,选择PHP。

应用代码部分,选择上传你的代码

源代码来源下,选择本地文件并点击选择文件

第3步 - 部署你的应用程序

一旦Zip文件被成功上传,点击页面底部的创建应用程序按钮来部署你的应用程序。

Upload Zip file 上传Zip文件

设置将需要几分钟的时间来完成。

一旦完成,你将被重定向到一个仪表板,上面有关于你的应用程序的一些细节。要运行你部署的应用程序,点击仪表板左上方的URL。它看起来应该是这样的:

Test2-env.eba-znpzdznf.us-east-2.elasticbeanstalk.com

Application Dashboard 应用程序仪表板

当页面加载时,你应该得到一个403错误,说你没有访问服务器的权限。

403 Forbidden Error 403禁止错误

这是因为, 默认情况下, Elastic Beanstalk会在项目的根目录下搜索你的应用程序的起点。由于Laravel将这个文件(index.php)保存在你根目录下的公共文件夹内,我们需要将Elastic Beanstalk指向正确的目录。为了确认index.php确实在公共文件夹内,在你部署的应用程序的URL中添加/public 。现在在你的浏览器上运行的URL应该是这样的:

Test2-env.eba-znpzdznf.us-east-2.elasticbeanstalk.com/public

Running application from public folder 从公共文件夹中运行应用程序

我们可以让应用程序从根目录中加载。在左边的导航窗格中,点击配置。在软件类别的左边,点击编辑按钮。向下滚动到文档根目录,在文本框中输入"/public",然后点击应用。现在,如果你运行根目录的URL,你应该看到你部署的应用程序。

第4步 - 在你的环境中添加RDS数据库实例

要添加一个数据库到你的应用程序,导航到你的应用程序仪表板的左窗格,点击配置,向下滚动到数据库,并点击编辑按钮:

Create an RDS Database Instance 创建一个RDS数据库实例

你会被带到一个页面,要求你提供关于你试图创建的数据库的一些信息。默认情况下,引擎实例类可用性的值应该分别为mysqldb.t2.microLow(一个AZ)。你可以让这些值保持原样。访问数据库需要一个用户名和密码。你可以使用你喜欢的任何细节。在保留项下,有两个选项。创建快照选项将在你终止环境时保存你的数据库的快照,你将为此产生一些费用。选择删除以避免被收费。最后,单击 "应用 " 以继续进行设置。

Set up a new database 设置一个新的数据库

这将需要几分钟的时间来设置。要查看数据库,去左边的导航窗格,点击配置。在配置页面,向下滚动到数据库,点击终端链接。

The RDS Database RDS数据库

现在我们已经建立了我们的数据库,我们需要把它连接到我们的应用程序。我们将通过从Elastic Beanstalk添加环境变量到我们应用程序的源代码中来实现。

在你的Laravel项目的根目录下, 找到你的config文件夹, 导航到它并打开名为database.php的文件.这是Laravel搜索它将使用的数据库细节的地方。向下滚动到mysql部分,用Elastic Beanstalk的数据库细节来更新它。

当你在Elastic Beanstalk中创建一个数据库实例时,它会创建这些凭证,并自动将它们保存在以下变量中:

RDS_HOSTNAME: Your database endpoint (e.g., aa1i0kb7mgpszyv.ctvm5tbj0wtl.us-east-2.rds.amazonaws.com:3306) RDS_PORT: 3306 RDS_DB_NAME: ebdb RDS_USERNAME: Whatever you supplied when creating the database. RDS_PASSWORD: Whatever you supplied when creating the database.

在你的database.php文件中加入上述变量后,它应该是这样的:

...
    'connections' => [

        'sqlite' => [
            'driver' => 'sqlite',
            'database' => env('DB_DATABASE', database_path('database.sqlite')),
            'prefix' => '',
        ],

        'mysql' => [
            'driver' => 'mysql',
            'host' => env('RDS_HOSTNAME', '127.0.0.1'),
            'port' => env('RDS_PORT', '3306'),
            'database' => env('RDS_DB_NAME', 'forge'),
            'username' => env('RDS_USERNAME', 'forge'),
            'password' => env('RDS_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
...

我们的应用程序和我们的数据库现在已经连接了。

第5步 - 更新你的应用程序

现在我们已经对代码做了一些修改,现在是解决如何在Elastic Beanstalk上更新我们的应用程序的最佳时机。在开发过程中,你经常想用最新的源代码替换你在Elastic Beanstalk上的东西,这样你就可以测试你所做的更新。 要更新你的应用程序,像上次一样压缩最新的源代码,然后前往你的应用程序仪表板。在左边的导航窗格中,点击环境,从列表中选择你的应用程序的环境。接下来,点击页面中间的上传和部署按钮。 点击选择文件,上传最新源代码的压缩文件。在版本标签下,你可以添加一个版本以帮助你保持跟踪(例如,版本2)。 最后,点击部署以更新你的应用程序。

Upload and deploy your application 上传和部署你的应用程序

一旦完成,刷新页面以加载带有你的数据库细节的更新版本。

自动部署

每当你做一个改变时,手动将你的代码推送到生产中,会变得单调和耗时。对于大多数公司来说,每一秒都很重要,而这种(效率极低的)手工方法会增加运营成本。值得庆幸的是,通过持续部署,代码的变化可以自动推送到生产中,使发布软件的过程更快、更有效,为公司节省大量的时间和金钱。

有几种方法可以实现持续部署,下面我将向你展示其中的一种。

以下是你需要的工具:

AWS CodeCommit将提供存储我们Laravel代码的仓库。

AWS CodePipelineprovides管道, 通过这个管道, 你的Laravel代码的变化被自动推送到生产中(从CodeCommit的存储库到Elastic Beanstalk) 。

换句话说, AWS CodePipeline会自动检测你的AWS CodeCommit仓库的变化,并更新你在Elastic Beanstalk的实时应用程序。

我们可以将上面创建的Elastic Beanstalk环境连接到我们的管道,这样我们的代码的后续变化就可以部署到那里。

第1步 - 在AWS CodeCommit上托管我们的代码

首先,让我们在AWS CodeCommit上托管要连接到我们管道的代码(Github和Amazon S3也可以与AWS CodePipeline一起使用)。打开AWS CodeCommit的仪表板

点击Create Repository。仓库的名字可以是你想要的任何东西。我将我的命名为LaravelRepo。点击创建

接下来, 让我们把我们的代码添加到新的资源库中.点击SSH标签(确保你是以IAM用户身份登录的).Click on the SSH tab点击SSH标签

从选项中选择你的操作系统,然后按照说明克隆你刚刚创建的版本库。 不同操作系统的说明彼此相似,很容易理解。我使用的是Windows系统,所以我将在下面概述Windows的过程。 如果你还没有SSH密钥,你需要按照步骤1到3进行。

我们要在我们的系统和AWS CodeCommit之间建立一个SSH连接。这将允许我们从前者推送代码到后者。

启动Git Bash,运行以下命令:

ssh-keygen

你会被提示输入你想保存密钥的文件名(任何名字都可以)。这个文件将为你创建。

你将需要创建一个新的密码(或口令)。注意,由于密码的敏感性,当你在键盘上输入时,它不会在终端中显示出来。

在你的驱动器/Users/user-name/.ssh/目录下会创建两个文件,文件名是你之前提供的:一个私钥文件和公钥文件,扩展名为.pub

在文本编辑器中打开.pub文件并复制其内容。

接下来,打开你的IAM仪表盘,导航到左边的窗格,点击用户

你会看到一个你已经创建的用户列表。从列表中选择你的IAM用户。Select your IAM user from the list从列表中选择你的IAM用户

选择安全证书标签,并点击上传SSH公钥按钮。Select the Security Credentials tab选择安全证书标签

Upload SSH public key 上传SSH公钥

将你之前复制的密钥粘贴到文本框中,然后点击上传

现在我们需要在我们的系统上创建一个配置文件,以帮助我们连接到AWS CodeCommit。我们将在这个文件中加入我们的SSH密钥ID,所以一定要把它复制到你目前所在的页面。

在你的测试编辑器中打开~/.ssh/config ,并添加类似这样的行:

Host git-codecommit.*.amazonaws.com
  User APKAEIBAERJR2EXAMPLE
  IdentityFile ~/.ssh/laravel_codecommit

用你复制的SSH密钥ID替换上面的User的值,并将laravel_codecommit改为存放你的私钥的文件名。

将文件命名为config,并保存为没有扩展名的文件。在Windows系统中, 你可以在点击保存之前用双引号包裹文件名来保存一个没有扩展名的文件.

你可以通过运行以下命令来测试你刚刚创建的配置:

ssh git-codecommit.us-east-2.amazonaws.com

当提示确认连接时,只需回答

推送本地代码到远程仓库

现在, 我们的Laravel代码是在我们的本地环境中, 所以我们需要添加我们的CodeCommit仓库的URL到我们的代码和推送.

要获得你的CodeCommit仓库的URL, 打开你的CodeCommit仪表板,从显示的列表中选择Laravel仓库.在Clone URL下, 选择SSH选项.Under Clone URL, select the SSH option在Clone URL下, 选择SSH选项

现在你有了SSH URL, 你可以通过在你的代码文件所在的目录下打开Git Bash来把它添加到你的本地repo。接下来,运行git remote add origin 并粘贴你刚刚复制的 SSH URL。该命令应该是这样的。

git remote add origin ssh://git-codecommit.us-east-2.amazonaws.com/v1/repos/LaravelRepo

接下来,将项目文件添加到仓库中:

git add .

提交:

git commit -m “initial commit

最后,推送:

git push origin master

第2步 - 创建你的管道

如前所述,CodePipeline将连接我们的CodeCommit资源库和我们的Elastic Beanstalk(部署)环境。

打开CodePipeline控制台

点击创建管线Create Pipeline创建管线

如果你是第一次使用CodePipeline,你会看到一个介绍性的页面。单击 "开始"。

管道设置下, 给你的新管道取个名字.我的名字是LaravelPipeline.Pipeline SettingsPipeline设置

如果你没有一个现有的服务角色, 你可以选择创建一个新的角色.给新的服务角色一个名字,并勾选允许CodePipeline创建一个新的服务角色的框。

要继续你的设置,点击下一步

添加源代码页面是我们将AWS CodePipeline指向我们之前创建的源代码库的地方。Add SourceAdd Source

点击源提供者的下拉列表,选择AWS Code Commit。

Repository name下, 选择你为Laravel项目创建的仓库的名称.

分支名称下, 选择master.

Amazon CloudWatch Events是推荐的选项,可以帮助你检测源代码的变化并启动你的管道,所以你可以不选择这个选项。

输出工件格式是CodePipeline输出你的项目进行部署的格式。你可以保持默认选择的选项,就像现在这样。

点击 "下一步",进入下一阶段。

其他两个步骤是可选的。你只需要选一个。我们可以跳过构建步骤,继续设置部署过程。点击跳过构建阶段Skip build stage跳过构建阶段

在部署阶段页面,从部署提供者下拉菜单中选择AWS Elastic Beanstalk。Add deploy stage添加部署阶段

区域下,为你的AWS服务选择适当的选项。

接下来,选择你之前创建的AWS Elastic Beanstalk应用程序的名称。

最后,选择你为AWS Elastic Beanstalk应用程序创建的环境名称。

点击 "下一步"按钮继续。

在审查页面,浏览一下细节,确保它们都是正确的。如果你想改变什么,你可以点击上一步。如果没有,点击创建管道,最终完成这一过程。Review page审查页面

在这一点上,你的管道会通过你创建的阶段,你的应用程序最终会被部署。Success成功

指向你刚刚部署的网站的URL可以在你的AWS Elastic Beanstalk仪表盘上找到。

导航到左边的窗格,点击环境。选择你添加到管道中的环境。这个URL应该是这样的。

Test3-env.eba-znpzdznf.us-east-2.elasticbeanstalk.com

第3步 - 更新你的代码

生产中的网站经常需要更新。要更新你的Laravel应用, 你可以对你的本地代码进行修改,并将其推送到生产中。

git add .
git commit -m “update”
git push origin master

在管道运行成功后, 重新加载网站的URL以查看变化.

总结

你已经走到了本教程的最后!我们成功地创建了一个Laravel应用程序,把它部署到Elastic Beanstalk,为它创建了一个数据库,并更新了它。我们还学会了如何使用AWS CodeCommit和AWS CodePipeline来设置持续部署。 要了解更多关于Laravel的信息,请查看其文档