Ćwiczenie — kod aplikacji Java korzystającej z wpisów tajnych

Ukończone

Kodujesz aplikację internetową Java przy użyciu platformy Spring Boot, która łączy się z bazą danych.

Ze względów bezpieczeństwa należy zabezpieczyć ten dostęp do bazy danych w przyszłości. Najpierw utwórzmy infrastrukturę aplikacji, a następnie skonfigurujemy aplikację Java do użycia.

Tworzenie infrastruktury aplikacji

W tym ćwiczeniu użyjesz interfejsu wiersza polecenia platformy Azure do utworzenia następujących zasobów:

  • Grupa zasobów platformy Azure zawierająca wszystkie zasoby aplikacji.
  • Serwer bazy danych PostgreSQL.
  • Klaster usługi Azure Spring Apps i aplikacja Spring Boot działająca w tym klastrze.

Musisz podać pewne zmienne środowiskowe na początku skryptu, które powinny być unikatowe na platformie Azure.

Musisz również podać lokalny adres IP, aby uzyskać dostęp do bazy danych z komputera lokalnego. Ten adres IP powinien być adresem IPv4. Jeśli nie znasz lokalnego adresu IP, możesz przejść do następującej witryny internetowej: https://www.whatismyip.com/

Ustaw następujące zmienne środowiskowe:

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>

Po ustawieniu tych zmiennych środowiskowych możesz uruchomić następujące polecenie, aby utworzyć zasoby:

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

Wykonanie tego polecenia może potrwać kilka minut.

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

Wykonanie tego polecenia może potrwać kilka minut.

az extension add --name spring

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

Wykonanie tego polecenia może potrwać kilka minut.

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

Uruchomienie tych skryptów zajmuje trochę czasu, dzięki czemu można pozwolić im działać w tle i rozpocząć kodowanie aplikacji w międzyczasie.

Konfigurowanie aplikacji Java

Pobierz szkielet aplikacji z https://github.com/Azure-Samples/manage-secrets-in-java-applications repozytorium GitHub przy użyciu git clone polecenia :

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

Ta aplikacja używa narzędzia Spring Data JPA do uzyskiwania dostępu do bazy danych. Możesz zapoznać się z interfejsem CRUD Repository:

package com.example.demo;

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

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

Dane przechowywane w bazie danych są następnie uwidaczniane w Sieci Web przy użyciu kontrolera 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();
    }
}

Te dane są wstawiane do bazy danych podczas uruchamiania src/main/resources/data.sql przy użyciu pliku :

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

Możesz dodać więcej wierszy do tego pliku, jeśli chcesz uzyskać więcej danych lub jeśli chcesz go dostosować.

Aby uzyskać dostęp do bazy danych, należy skonfigurować src/main/resources/application.properties plik:

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

Ten plik konfiguracji zawiera trzy zmienne, które należy skonfigurować:

  • ${azureDatabaseName} to nazwa bazy danych PostgreSQL, która została skonfigurowana wcześniej w zmiennej środowiskowej AZ_DATABASE_NAME . Wpisz echo $AZ_DATABASE_NAME , aby go wyświetlić.
  • ${azureDatabaseUsername} to nazwa nazwy użytkownika bazy danych, która została skonfigurowana wcześniej w zmiennej środowiskowej AZ_DATABASE_USERNAME . Wpisz echo $AZ_DATABASE_USERNAME , aby go wyświetlić.
  • ${azureDatabasePassword} to nazwa hasła bazy danych, która została skonfigurowana wcześniej w zmiennej środowiskowej AZ_DATABASE_PASSWORD . Wpisz echo $AZ_DATABASE_PASSWORD , aby go wyświetlić.

Jak widzieliśmy w poprzedniej lekcji, dobrym rozwiązaniem jest hard-code tych wartości w kodzie źródłowym aplikacji. Jednak aby przetestować aplikację, możesz je tymczasowo napisać i uruchomić aplikację:

./mvnw spring-boot:run

Zawartość bazy danych można odczytać, korzystając z następującego polecenia lub korzystając z przeglądarki internetowej, korzystając z kontrolera Spring MVC:

curl http://localhost:8080

Wdrażanie aplikacji Java na platformie Azure

Aby wdrożyć aplikację, należy najpierw spakować ją jako plik Jar:

./mvnw clean package

To polecenie tworzy wykonywalny plik Jar w target katalogu, który jest wdrażany przy użyciu interfejsu wiersza polecenia platformy Azure:

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

Jeśli wystąpią błędy, możesz przejrzeć dzienniki aplikacji, wpisując następujące polecenie:

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

Aplikacja będzie następnie dostępna w chmurze i będzie można uzyskać dostęp do jej danych za pomocą polecenia 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'}]
#

Gratulacje! Pomyślnie utworzono aplikację Java, która łączy się z bazą danych. Teraz należy zabezpieczyć poświadczenia bazy danych w następnych lekcjach.