Статьи

Разверните приложение Quarkus на AWS Elastic Beanstalk

Elastic Beanstalk позволяет развертывать приложения и управлять ими в облаке AWS без необходимости изучать инфраструктуру, в которой работают эти приложения.

С Elastic Beanstalk вы можете запускать веб-сайт, веб-приложение или веб-API, который обслуживает HTTP-запросы, но вы также можете запускать рабочие приложения для выполнения длинных задач. Elastic Beanstalk поддерживает несколько предварительно сконфигурированных платформ, включая Go , .NET или Java (только Java 8), но также и общую платформу Docker .

Вы просто загружаете свое приложение с помощью AWS CLI , AWS EB CLI или с Elastic Beanstack console , а Elastic Beanstalk автоматически обрабатывает все остальное.

В этой записи блога вы узнаете, как запустить среду контейнеров Docker с приложением на основе Quarkus на Elastic Beanstalk.

Примечание: этот блог не описывает создание приложения с нуля. Вместо этого оно основано на приложении API REST Quarkus Pet Clinic, которое я создал для начала работы с сообщением в блоге Quarkus . Исходный код можно найти на Github: https://github.com/kolorobot/quarkus-petclinic-api

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
    • Установите username и password на ваш выбор
    • Для Retention выберите « Delete если вы не хотите создавать моментальный снимок.
    • Нажмите Save .
  • Нажмите Create app

Elastic Beanstalk создаст образец приложения для вас со всеми необходимыми ресурсами (включая RDS).

Ссылка на приложение будет видна вам после создания приложения.

Примечание. Приведенные выше действия основаны на официальной документации: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/GettingStarted.CreateApp.html.

Preapare пакет приложений

  • Клонировать хранилище
1
git clone https://github.com/kolorobot/quarkus-petclinic-api
  • Перейдите в каталог приложения и выполните:
1
./mvnw clean package assembly:single -Dquarkus.package.uber-jar=true

Приведенная выше команда создает пакет со следующим содержимым:

01
02
03
04
05
06
07
08
09
10
11
$ 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
    • Перейдите на страницу https://console.aws.amazon.com/elasticbeanstalk.
    • Перейдите на панель инструментов приложения.
    • Нажмите 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). Информация о соединении экземпляра RDS доступна приложению, работающему на Elastic Beanstalk, через RDS_* среды RDS_* , доступные для работающего контейнера. Для использования этого установите следующие свойства:

1
2
3
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 :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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 Plugin Maven Assembly Plugin .

Подготовьте файлы для сборки

Измените pom.xml и добавьте цель, чтобы скопировать и переименовать файлы, которые будут сохранены в окончательном zip файле пакета приложения:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<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 с target/eb именами.

Настроить сборку плагина

Maven Assembly Plugin будет использоваться для создания пакета приложения. Добавьте приведенную ниже конфигурацию в pom.xml :

01
02
03
04
05
06
07
08
09
10
11
<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 который инструктирует подключаемый модуль сборки создать zip Dockerfile , содержащий Dockerfile , config/application.properties и Quarkus uber-jar . Все три файла будут находиться в root архива:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<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>

На этом настройка завершена. Теперь вы можете создать пакет (сборку), выполнив:

Со всеми вышеуказанными изменениями мы можем создать пакет:

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

Протестируйте пакет локально

Чтобы проверить пакет локально, выполните:

1
2
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 .

Перед запуском контейнера запустите базу данных:

1
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 и связавшись с контейнером базы данных:

1
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

Рекомендации

Смотрите также

См. Оригинальную статью здесь: Разверните приложение Quarkus на AWS Elastic Beanstalk

Мнения, высказанные участниками Java Code Geeks, являются их собственными.