将 Spring Boot 应用程序部署到 Elastic Beanstalk

目标:

  1. 使用 Spring CLI ,我们将创建一个新的 Spring Boot 应用程序,以部署到 Elastic Beanstalk。

    • 我们将编辑生成的 Spring Boot 应用程序,以便它将:
      • 创建一个名为 aws-eb-demo.jar 的 jar。
      • 听 5000 端口。
      • 包含名为 index.html 的单个网页。
  2. 使用 Elastic Beanstalk CLI ,我们将:

    • 初始化项目以部署到 Elastic Beanstalk。
    • 创建新的部署环境并一步部署 Spring Boot 应用程序。
    • 编辑应用程序并将其重新部署到同一环境中。
  3. 我们将编辑 Spring Boot 应用程序以添加监视,管理和日志记录功能。

  4. 我们将 Spring Boot 应用程序重新部署到其目标环境。

先决条件:

第 1 部分:创建 Java 应用程序

让我们使用 Spring CLI 创建一个新的 Java 应用程序。Spring CLI 提供了一种方便的方法来快速入门使用 Spring Boot 和 Spring Framework 的云就绪应用程序。

脚步

  1. 使用 Spring CLI 和 cd 创建一个 Spring Boot Web 应用程序到该文件夹​​中。

    $ spring init -d=web -name=aws-eb-demo aws-eb-demo
    $ cd aws-eb-demo
    
  2. 使用源代码控制初始化项目,然后提交初始修订。这将允许我们在进行更改时跟踪更改,并在必要时恢复到先前工作状态。在开始更改应用程序之前,这始终是一种很好的做法。

    对于这个例子,我们将使用 Git:

    $ git init
    $ git add .
    $ git commit -m "initial commit"
    
  3. 为方便部署,请编辑 pom.xml 并在 <project> / <build> 部分下添加 <finalName> 设置:

    <build>
        <finalName>${project.artifactId}</finalName>
        ...
    </build>
    

    <finalName> 设置将使构建的工件具有名称 aws-eb-demo.jar 而不具有版本。这可确保每次应用程序迭代到新版本时都不必更改部署脚本。

  4. 通过将以下属性添加到 src/main/resources/application.properties,将应用程序配置为侦听端口 5000

    server.port=5000
    

    默认情况下,Spring Boot Web 应用程序通过端口 8080 侦听请求。但是,面向 Elastic Beanstalk 应用程序的 AWS 负载均衡器期望它们在端口 5000 上进行侦听。如果没有此设置,我们将在尝试通过 Web 访问我们的应用程序时收到错误 502 Bad Gateway

  5. 通过在 src/main/resources/static/index.html 创建一个文件,为你的应用程序提供一个静态主页,其中包含以下示例内容:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>AWS EB Demo</title>
    </head>
    <body>
        <h1>Hello from Elastic Beanstock</h1>
    </body>
    </html>
    
  6. 在本地测试 Web 应用程序。

    $ mvn spring-boot:run
    

    打开浏览器至 http://localhost:5000 并验证主页是否已提供。

    完成测试后,在运行终端中键入 Ctrl+C 以关闭应用程序。

  7. 打包 Web 应用程序。

    $ mvn package -DskipTests
    

    应用程序 jar 将在 target/aws-eb-demo.jar 创建。

  8. 将你的更改提交给源代码管理。

    $ git add .
    $ git commit -m "prepared for initial deployment"
    

第 2 部分:将 Java 应用程序部署到 Elastic Beanstalk

通过我们的应用程序测试并准备首次部署,我们现在可以使用 Elastic Beanstalk CLI 初始化我们的部署配置,创建部署环境并将其推送到云。

脚步

  1. 使用 Elastic Beanstock CLI 初始化你的应用程序以进行部署。

    $ eb init
    

    一个。当提示选择默认区域时,接受默认值。

    湾当系统提示选择要使用的应用程序时,接受默认值以创建新应用程序。

    C。当提示输入应用程序名称时,接受默认值或输入 aws-eb-demo

    d。当系统提示选择平台时,请选择 Java

    即当系统提示选择平台版本时,请选择 Java 8

    F。当提示使用 AWS CodeCommit 进行部署时,请接受默认值(n)。

    I。当系统提示你为实例设置 SSH 时,请选择 y。这将允许你使用 Elastic Beanstalk CLI 进入将部署应用程序实例的虚拟机。

    学家当提示选择密钥对时,选择默认值(Create new KeyPair)。或者,你可以选择现有的密钥对。

    K。当提示键入密钥对名称时,接受默认值或键入名称。

    湖当提示输入密码短语时,请留空或输入你将记住的密码。再次键入相同的密码并按 Enter 键。

  2. 通过打开 .elasticbeanstock/config.yml 并将以下设置添加到文件的底部来编辑新创建的 Elastic Beanstock 部署清单:

    deploy:
      artifact: 'target/aws-eb-demo.jar'
    
  3. 使用 Elastic Beanstock CLI 将你的应用程序部署到新环境。

    $ eb create
    

    一个。当提示输入环境名称时,接受默认值(aws-eb-demo-dev)。

    湾当提示“输入 DNS CNAME 前缀”时,接受默认值(aws-eb-demo-dev)。

    C。当提示选择负载均衡器类型时,接受默认值(classic)。

    Elastic Beanstalk 最多可能需要 5 分钟才能完成部署。同时,Elastic Beanstalk 正在为你做以下事情:

    • 创建部署环境
    • 创建负载均衡器
    • 准备一个安全组
    • 设置自动缩放
    • 启动一个或多个 EC2 实例
    • 启动应用程序

    在完成这项工作的同时,输入 Ctrl+C 是安全的。

  4. 在等待时,你可以使用 Elastic Beanstalk CLI 检查应用程序的部署状态。

    $ eb status
    
  5. Health:字段显示 GreenStatus:字段显示 Ready 时,你可以使用 CNAME 字段中显示的地址浏览应用程序。

    例如,如果你选择区域 us-west-2 : (US West (Oregon),那么你的应用程序将部署在以下 URL:

    http://aws-eb-demo-dev.us-west-2.elasticbeanstalk.com

    如果应用程序的状态为 Ready,但 Health:字段不是 Green,请参阅应用程序日志以诊断问题:

    $ eb logs
    

第 3 部分:修改 Spring Boot 应用程序以包含生产就绪功能

为了使我们的应用程序真正做好生产准备,我们需要管理,监控,日志记录和安全性。幸运的是,Spring Boot 具有开箱即用的这些功能。它们只需要作为依赖项添加到我们的项目中。

有关 Spring Boot 提供的生产就绪功能的详细信息,请参阅 Spring Boot Reference Guide,第 V 部分, Spring Boot Actuator:生产就绪功能

脚步

  1. 打开文件 pom.xml(在我们项目的根目录中找到),并在 <project> / <dependencies> 部分下添加以下依赖项:

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-hateoas</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    

    一个。spring-boot-starter-actuator 依赖包括生产就绪的管理和监控功能,称为 actuators。这些功能包括现成的 REST 端点,允许管理员快速访问有关应用程序的运行时信息,例如运行状况信息,环境属性,配置设置,日志文件等。

    spring-boot-starter-hateoas 依赖关系允许 Spring Boot 使用指向每个执行器端点的 HAL 样式链接在单个方便端点下列出所有执行器。

    C。spring-boot-starter-security 依赖为我们的应用程序提供了保护执行器端点的功能,因此它们只能由具有 ACTUATOR 角色的经过身份验证的用户访问。

  2. 在编辑 pom.xml 的同时,向 spring-boot-maven-plugin 添加自定义执行,以便它包含有关打包的应用程序工件的构建的信息。

    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <executions>
            <execution>
                <goals>
                    <goal>build-info</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    
  3. 自定义 Spring Boot 配置,以便所有执行器都列在/management 的路径下。此外,配置将能够查看执行器端点的管理员的用户名和密码。最后,配置应用程序日志记录,以便除了控制台之外还将日志记录语句写入文件。

    打开 src/main/resources/application.properties 并添加以下设置:

    management.context-path=/management
    
    security.user.name=admin
    security.user.password=password1
    
    logging.file=logs/application.log
    server.tomcat.accesslog.enabled=true
    
  4. 编辑 .gitignore 并在文件顶部添加以下行,以便源控件忽略本地测试日志。

    logs/
    
  5. 在本地测试 Web 应用程序。

    $ mvn spring-boot:run
    

    一个。在浏览器中,打开 http://localhost:5000/management 并验证是否提供了提供可用 Spring Boot 执行器链接的 JSON 对象。

    湾打开 http://localhost:5000/management/info 并验证是否显示构建信息。

    湾打开 http://localhost:5000/management/health 并验证应用程序状态是 UP。如果未作为具有 ACTUATOR 角色的用户进行身份验证,则 status 字段应该是显示的唯一健康字段。

    C。打开 http://localhost:5000/management/logfile 并验证它是否需要身份验证。输入管理员(admin:password1)的凭据并验证它是否授予你访问权限。

    d。再次打开 http://localhost:5000/management/health 并验证是否显示其他健康详细信息。当作为具有 ACTUATOR 角色的用户进行身份验证时,运行状况端点将显示有关应用程序正在使用的资源的其他运行状况详细信息。

    即尝试一些其他执行器端点。你可能对 envmetricsauditeventsmappings 感兴趣。

    完成测试后,在运行终端中键入 Ctrl+C 以关闭应用程序。

  6. 执行干净重建并重新打包 Web 应用程序。

    $ mvn clean package -DskipTests
    

    和以前一样,应用程序 jar 将在 target/aws-eb-demo.jar 创建。

  7. 将你的更改提交给源代码管理。

    $ git add .
    $ git commit -m "added management and monitoring features"
    

第 4 部分:部署修改后的应用程序

重新部署通常比初始部署快得多,因为环境已经准备好了。CLI 只需要将新 jar 上传到环境的 EC2 实例并重新启动应用程序。

脚步

  1. 使用 Elastic Beanstalk CLI,重新部署新 jar。

    $ eb deploy
    

    上传完成后,你可以安全地输入 Ctrl+C

  2. 验证应用程序是否已成功部署。

    $ eb status
    
  3. 在浏览器中,转到 http://aws-eb-demo-dev.us-west-2.elasticbeanstalk.com/management 并验证一切都是在本地测试时的效果。