Elastic Beanstalk允许在AWS云中部署和办理运用程序,而不用了解运转这些运用程序的基础设施。

经过Elastic Beanstalk,你能够运转一个网站、网络运用程序或供给HTTP恳求的网络API,但你也能够运转一个作业程序来运转长任务。Elastic Beanstalk支撑几个预装备的平台,包含Go.NETJava (仅适用于Java 8),但也支撑通用Docker 平台。

你只需用AWS CLIAWS EB CLI ,或用Elastic Beanstack console ,上传你的运用程序,Elastic Beanstalk会主动处理剩余的事情。

在这篇博文中,你将学习如安在Elastic Beanstalk上用根据Quarkus的运用程序启动单容器Docker 环境:

留意:这篇博客并没有描述从头开始创立运用程序。相反,它是根据Quarkus宠物诊所的REST API运用,该运用是我为开始运用Quarkus博文而创立的。源代码能够在Github上找到: https://github.com/kolorobot/quarkus-petclinic-api

  • TL;DR:创立包并上传到Elastic Beanstalk

    • 在Elastic Beanstalk控制台创立新的运用程序
    • 预先准备好运用程序包
    • 上传运用程序到Elastic Beanstalk
  • 一步一步来。为Elastic Beanstalk装备运用程序

    • 运转时装备
    • Dockerfile
    • 用Maven创立运用程序包

      • 为程序集准备文件
      • 装备程序集插件
      • 在本地测验程序包
  • 源代码
  • 参考文献
  • 也请拜见

TL;DR:创立包并上传到Elastic Beanstalk

在Elastic Beanstalk控制台创立新的运用程序

假如你还不是AWS客户,你需求创立一个AWS账户。注册后,你就能够拜访Elastic Beanstalk和其他你需求的AWS服务:

  • 运用此链接翻开Elastic Beanstalk控制台:https://us-west-2.console.aws.amazon.com/elasticbeanstalk/home?region=us-west-2#/gettingStarted?applicationName=Pet Clinic API
  • 关于Platform ,挑选Docker
  • 关于Application Code ,挑选Sample Application
  • 挑选Configure more options
    • 在列表中找到Database ,然后点击Modify
    • 关于Engine ,挑选postgres
    • 关于Engine version ,挑选11.6
    • 设置你挑选的usernamepassword
    • 关于Retention ,假如你不创立snaphost,就挑选Delete
    • 点击Save
  • 点击Create app

Elastic Beanstalk将为你创立具有一切必要资源(包含RDS)的示例运用程序。

一旦运用程序创立完结,你就能够看到该运用程序的链接:

留意:以上步骤是根据官方文档:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/GettingStarted.CreateApp.html

准备运用程序包

  • 克隆资源库
git clone https://github.com/kolorobot/quarkus-petclinic-api
  • 导航到运用程序目录并执行
./mvnw clean package assembly:single -Dquarkus.package.uber-jar=true

上述指令创立了具有以下内容的包

$ unzip -l target/quarkus-petclinic-api-1.0.1-eb.zip
Archive:  target/quarkus-petclinic-api-1.0.1-eb.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  03-15-2020 13:35   config/
     2059  03-15-2020 13:34   Dockerfile
      369  03-15-2020 13:34   config/application.properties
 38604205  03-15-2020 13:35   quarkus-petclinic-api-1.0.1-runner.jar
---------                     -------
 38606633                     4 files

上传运用程序到Elastic Beanstalk

  • 运用Elastic Beanstalk控制台上传软件包
    • 导航到console.aws.amazon.com/elasticbean…
    • 导航到运用程序仪表板
    • 点击Upload and Deploy
    • 挑选上一步创立的包,然后点击Deploy
    • 等候运用程序被部署

就这样了。鄙人一段中,你将学习怎么运用Maven准备软件包。

一步一步来:为Elastic Beanstalk装备运用程序

运转时装备

让咱们从Elastic Beanstalk环境的特定运用装备开始。

Quarkus供给了几个选项,能够在运转时掩盖特点。我决定运用将装备文件放在config/application.properties 文件中的办法。这个文件会被Quarkus主动读取,而且这个文件的一切特点都优先于默认值。

创立src/main/resources/application-eb.properties 文件,并将quarkus.http.port 设为5000 ,由于这是Elastic Beanstalk网络运用的默认端口。

接下来的特点与数据源装备有关,由于运用程序将衔接到RDS(PostgreSQL)。在Elastic Beanstalk上运转的运用程序能够经过RDS_* 环境特点获得RDS实例的衔接信息,该特点对运转中的容器可用。要运用它,请设置以下特点:

quarkus.datasource.url=jdbc:postgresql://${RDS_HOSTNAME}:${RDS_PORT}/${RDS_DB_NAME}
quarkus.datasource.username=${RDS_USERNAME}
quarkus.datasource.password=${RDS_PASSWORD}

阅读更多关于衔接你的运用程序到RDS的信息:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.managing.db.html

Dockerfile

Elastic Beanstalk运用Dockerfile 来构建和运转镜像。该文件有必要坐落运用程序目录的root 。我运用了原始的src/main/docker/Dockerfile.jvm ,并做了以下调整:

  • config/application.properties 复制到容器中
  • 暴露端口5000 ,而不是8080

完整的src/main/docker/Dockerfile.eb

FROM registry.access.redhat.com/ubi8/ubi-minimal:8.1
ARG JAVA_PACKAGE=java-11-openjdk-headless
ARG RUN_JAVA_VERSION=1.3.5
ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en'
# Install java and the run-java script
# Also set up permissions for user `1001`
RUN microdnf install openssl curl ca-certificates ${JAVA_PACKAGE} \
    && microdnf update \
    && microdnf clean all \
    && mkdir /deployments \
    && chown 1001 /deployments \
    && chmod "g+rwX" /deployments \
    && chown 1001:root /deployments \
    && curl https://repo1.maven.org/maven2/io/fabric8/run-java-sh/${RUN_JAVA_VERSION}/run-java-sh-${RUN_JAVA_VERSION}-sh.sh -o /deployments/run-java.sh \
    && chown 1001 /deployments/run-java.sh \
    && chmod 540 /deployments/run-java.sh \
    && echo "securerandom.source=file:/dev/urandom" >> /etc/alternatives/jre/lib/security/java.security
ENV JAVA_OPTIONS="-Djava.util.logging.manager=org.jboss.logmanager.LogManager"
COPY *-runner.jar /deployments/app.jar
COPY config /deployments/config
EXPOSE 5000
USER 1001
ENTRYPOINT [ "/deployments/run-java.sh" ]

用Maven创立运用程序包

到目前为止,已经创立了以下两个文件:

  • src/main/resources/application-eb.properties 含有Elastic Beanstalk环境的特定特点
  • src/main/docker/Dockerfile.eb 带有Elastic Beanstack环境的容器装备。

为了完结装备和装备包安装,咱们将运用Copy Rename Maven PluginMaven Assembly Plugin

准备好组装的文件

修正pom.xml ,并添加方针来复制和重命名将存储在终究运用程序包zip 文件中的文件:

<build>
    <plugin>
        <groupId>com.coderplus.maven.plugins</groupId>
        <artifactId>copy-rename-maven-plugin</artifactId>
        <version>1.0</version>
        <executions>
            <execution>
                <id>copy-file</id>
                <phase>package</phase>
                <goals>
                    <goal>copy</goal>
                </goals>
                <configuration>
                    <fileSets>
                        <fileSet>
                            <sourceFile>src/main/resources/application-eb.properties</sourceFile>
                            <destinationFile>target/eb/application.properties</destinationFile>
                        </fileSet>
                        <fileSet>
                            <sourceFile>src/main/docker/Dockerfile.eb</sourceFile>
                            <destinationFile>target/eb/Dockerfile</destinationFile>
                        </fileSet>
                    </fileSets>
                </configuration>
            </execution>
        </executions>
    </plugin>
</build>

copy-file 方针将在package 阶段运转,并将从前创立的文件复制到target/eb ,并调整其称号。

装备安装插件

Maven Assembly Plugin 将被用来创立运用程序包。将下面的装备添加到 pom.xml

<build>
    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.2.0</version>
        <configuration>
            <descriptors>
                <descriptor>src/assembly/eb.xml</descriptor>
            </descriptors>
        </configuration>
    </plugin>
</build>

现在,创立src/assembly/eb.xml 描述符,指示汇编插件创立一个包含Dockerfileconfig/application.properties 和 Quarkusuber-jarzip 。一切这三个文件都将坐落存档的root

<assembly>
    <id>eb</id>
    <formats>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <files>
        <file>
            <source>target/eb/Dockerfile</source>
            <outputDirectory></outputDirectory>
            <filtered>false</filtered>
        </file>
        <file>
            <source>target/eb/application.properties</source>
            <outputDirectory>config</outputDirectory>
            <filtered>false</filtered>
        </file>
        <file>
            <source>target/${project.build.finalName}-runner.jar</source>
            <outputDirectory></outputDirectory>
            <filtered>false</filtered>
        </file>
    </files>
</assembly>

这样就完结了装备,现在你能够经过运转创立包(assembly)。

有了上述一切的改变,咱们就能够创立包了:

./mvnw clean package assembly:single -Dquarkus.package.uber-jar=true

在本地测验该软件包

要在本地测验该包,请运转:

unzip target/quarkus-petclinic-api-1.0.1-eb.zip -d target/eb-dist && cd target/eb-dist
docker build -t quarkus/petclinic-api-jvm-eb .

在运转容器之前,启动数据库:

docker run -it --name petclinic-db -p 5432:5432 -e POSTGRES_DB=petclinic -e POSTGRES_USER=petclinic -e POSTGRES_PASSWORD=petclinic -d postgres:11.6-alpine

运转运用程序,经过RDS环境变量并链接到数据库容器:

docker run -i --rm -p 8080:5000 --link petclinic-db -e RDS_HOSTNAME=petclinic-db -e RDS_PORT=5432 -e RDS_DB_NAME=petclinic -e RDS_USERNAME=petclinic -e RDS_PASSWORD=petclinic quarkus/petclinic-api-jvm-eb

在浏览器中翻开http://localhost:8080 ,你应该看到主页。

源代码

这篇文章的源代码能够在Github上找到:https://github.com/kolorobot/quarkus-petclinic-api

参考资料

  • docs.aws.amazon.com/elasticbean…
  • docs.aws.amazon.com/elasticbean…
  • quarkus.io/guides/conf…

另见

  • 开始运用Quarkus
  • 运用Testcontainers和PostgreSQL进行Quarkus测验