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
Рекомендации
- https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/single-container-docker.html
- https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.managing.db.html
- https://quarkus.io/guides/config#package-and-run-the-application
Смотрите также
См. Оригинальную статью здесь: Разверните приложение Quarkus на AWS Elastic Beanstalk Мнения, высказанные участниками Java Code Geeks, являются их собственными. |