Упражнение. Написание кода приложения Java, использующего секреты

Завершено

Вы собираетесь написать код веб-приложения Java, используя платформу Spring Boot, которая подключается к базе данных.

В целях безопасности вам необходимо защитить доступ к базе данных в будущем. Но сначала создадим инфраструктуру приложений, а затем настроим приложение Java на ее использование.

Создание инфраструктуры приложений

В этом упражнении вы используете Azure CLI для создания следующих ресурсов:

  • Группа ресурсов Azure, содержащая все ресурсы для приложения.
  • Сервер базы данных PostgreSQL.
  • Кластер Azure Spring Apps и приложение Spring Boot, работающее в этом кластере.

Необходимо указать некоторые переменные среды в начале сценария, который должен быть уникальным в Azure.

Также необходимо предоставить локальный IP-адрес для доступа к базе данных с локального компьютера. Этот IP-адрес должен быть IPv4-адресом. Если вы не знаете локальный IP-адрес, перейдите на следующий веб-сайт: https://www.whatismyip.com/.

Установите указанные ниже переменные среды.

AZ_RESOURCE_GROUP=<YOUR_UNIQUE_RESOURCE_GROUP_NAME>
AZ_DATABASE_USERNAME=<YOUR_POSTGRESQL_USERNAME>
AZ_DATABASE_PASSWORD=<YOUR_POSTGRESQL_PASSWORD>
AZ_LOCAL_IP_ADDRESS=<YOUR_LOCAL_IP_ADDRESS>

После задания этих переменных среды можно выполнить следующую команду, чтобы создать ресурсы:

AZ_LOCATION=eastus
# Must be all lowercase
AZ_SPRING_CLOUD=spring-${AZ_RESOURCE_GROUP,,}

AZ_DATABASE_NAME=pgsql-${AZ_RESOURCE_GROUP}
AZ_DATABASE_USERNAME=${AZ_DATABASE_USERNAME}

az group create \
    --name $AZ_RESOURCE_GROUP \
    --location $AZ_LOCATION

Выполнение этой команды может занять несколько минут.

az postgres server create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_NAME \
    --location $AZ_LOCATION \
    --sku-name B_Gen5_1 \
    --storage-size 5120 \
    --admin-user $AZ_DATABASE_USERNAME \
    --admin-password $AZ_DATABASE_PASSWORD
az postgres server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_NAME-database-allow-local-ip \
    --server $AZ_DATABASE_NAME \
    --start-ip-address $AZ_LOCAL_IP_ADDRESS \
    --end-ip-address $AZ_LOCAL_IP_ADDRESS

az postgres server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_NAME-database-allow-azure-ip \
    --server $AZ_DATABASE_NAME \
    --start-ip-address 0.0.0.0 \
    --end-ip-address 0.0.0.0
az postgres db create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name demo \
    --server-name $AZ_DATABASE_NAME

Выполнение этой команды может занять несколько минут.

az extension add --name spring

az spring create \
   --name $AZ_SPRING_CLOUD \
   --resource-group $AZ_RESOURCE_GROUP \
   --location $AZ_LOCATION \
   --sku Basic

Выполнение этой команды может занять несколько минут.

az spring app create \
   --resource-group $AZ_RESOURCE_GROUP \
   --service $AZ_SPRING_CLOUD \
   --name application \
   --runtime-version Java_11 \
   --assign-endpoint true

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

Настройка приложения Java

Получите схему приложения из репозитория GitHub https://github.com/Azure-Samples/manage-secrets-in-java-applications с помощью команды git clone:

git clone https://github.com/Azure-Samples/manage-secrets-in-java-applications.git

Это приложение использует JPA Spring Data для доступа к базе данных. Вы можете просмотреть интерфейс репозитория CRUD:

package com.example.demo;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ItemRepository extends CrudRepository<Item, Integer> {
}

Данные, хранящиеся в базе данных, затем предоставляются в Интернет с помощью контроллера REST Spring MVC.

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ItemController {

    private final ItemRepository itemRepository;

    public ItemController(ItemRepository itemRepository) {
        this.itemRepository = itemRepository;
    }

    @GetMapping("/")
    String welcome() {
        return "Here are all the database items: " + itemRepository.findAll();
    }
}

Эти данные вставляются в базу данных во время запуска с помощью файла src/main/resources/data.sql:

insert into item (details) values ('This is a item from the database');

В этот файл можно добавить дополнительные строки, если требуется больше данных, или если вы хотите настроить его.

Чтобы получить доступ к базе данных, необходимо настроить src/main/resources/application.properties файл:

logging.level.org.springframework.jdbc.core=DEBUG

spring.datasource.url=jdbc:postgresql://${azureDatabaseName}.postgres.database.azure.com:5432/demo
spring.datasource.username=${azureDatabaseUsername}@${azureDatabaseName}
spring.datasource.password=${azureDatabasePassword}

spring.sql.init.mode=always

Этот файл конфигурации содержит три переменные, которые необходимо настроить:

  • ${azureDatabaseName} — имя базы данных PostgreSQL, которое было настроено ранее в переменной среды AZ_DATABASE_NAME. Введите echo $AZ_DATABASE_NAME, чтобы отобразить его.
  • ${azureDatabaseUsername} — имя пользователя базы данных, которое было настроено ранее в переменной среды AZ_DATABASE_USERNAME. Введите echo $AZ_DATABASE_USERNAME, чтобы отобразить его.
  • ${azureDatabasePassword} — пароль базы данных, который был настроен ранее в переменной среды AZ_DATABASE_PASSWORD. Введите echo $AZ_DATABASE_PASSWORD, чтобы отобразить его.

Как мы видели в предыдущем уроке, это плохая практика жесткого кода этих значений в исходном коде приложения. Чтобы протестировать приложение, можно временно записать их и запустить приложение:

./mvnw spring-boot:run

Чтобы прочитать содержимое базы данных, можно обратиться к контроллеру Spring MVC с помощью следующей команды или веб-браузера:

curl http://localhost:8080

Развертывание приложения Java в Azure

Чтобы развернуть приложение, сначала необходимо упаковать его в виде JAR-файла:

./mvnw clean package

Эта команда создает исполняемый JAR-файл в target каталоге, который развертывается с помощью Azure CLI:

az spring app deploy \
   --resource-group $AZ_RESOURCE_GROUP \
   --service $AZ_SPRING_CLOUD \
   --name application \
   --artifact-path target/*.jar

Если возникают сбои, вы можете просмотреть журналы приложений, введя следующую команду:

az spring app logs \
   --resource-group $AZ_RESOURCE_GROUP \
   --service $AZ_SPRING_CLOUD \
   --name application

Затем приложение будет доступно в облаке, и вы сможете получить доступ к его данным с помощью команды cURL:

curl https://$AZ_SPRING_CLOUD-application.azuremicroservices.io

# Expected output:
#
# Here are all the database items: [Secret{Id=1, details='This is a item from the database'}]
#

Поздравляем! Вы успешно создали приложение Java, которое подключается к базе данных! Теперь необходимо защитить учетные данные базы данных в следующих уроках.