Øvelse – Kode et Java-program, der bruger hemmeligheder

Fuldført

Du skal kode et Java-webprogram ved hjælp af Spring Boot, der opretter forbindelse til en database.

Af sikkerhedsmæssige årsager skal du sikre denne databaseadgang i fremtiden. Men lad os først oprette programinfrastrukturen og derefter konfigurere Java-programmet til brug.

Opret programinfrastrukturen

I denne øvelse skal du bruge Azure CLI til at oprette følgende ressourcer:

  • En Azure-ressourcegruppe, der indeholder alle ressourcerne til dit program.
  • En PostgreSQL-databaseserver.
  • En Azure Spring Apps-klynge og et Spring Boot-program, der kører i denne klynge.

Du skal angive nogle miljøvariabler i starten af scriptet, der skal være entydige på tværs af Azure.

Du skal også angive din lokale IP-adresse for at få adgang til databasen fra din lokale computer. Denne IP-adresse skal være en IPv4-adresse. Hvis du ikke kender din lokale IP-adresse, kan du gå til følgende websted: https://www.whatismyip.com/

Angiv følgende miljøvariabler:

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>

Når disse miljøvariabler er angivet, kan du køre følgende kommando for at oprette ressourcerne:

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

Denne kommando kan tage flere minutter at fuldføre.

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

Denne kommando kan tage flere minutter at fuldføre.

az extension add --name spring

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

Denne kommando kan tage flere minutter at fuldføre.

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

Det tager lidt tid at køre disse scripts, så du kan lade dem køre i baggrunden og begynde at kode programmet i mellemtiden.

Konfigurer Java-programmet

Hent programskeletet fra gitHub-lageret https://github.com/Azure-Samples/manage-secrets-in-java-applications ved hjælp af kommandoen git clone:

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

Dette program bruger JPA for forårsdata til at få adgang til databasen. Du kan se grænsefladen til CRUD-lageret:

package com.example.demo;

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

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

Data, der gemmes i databasen, vises derefter på internettet ved hjælp af en Spring MVC REST Controller:

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();
    }
}

Disse data indsættes i databasen på starttidspunktet ved hjælp af filen src/main/resources/data.sql:

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

Du kan føje flere linjer til denne fil, hvis du vil have flere data, eller hvis du vil tilpasse den.

Hvis du vil have adgang til databasen, skal du konfigurere src/main/resources/application.properties-filen:

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

Denne konfigurationsfil har tre variabler, der skal konfigureres:

  • ${azureDatabaseName} er navnet på den PostgreSQL-database, der blev konfigureret tidligere i miljøvariablen AZ_DATABASE_NAME. Skriv echo $AZ_DATABASE_NAME for at se den.
  • ${azureDatabaseUsername} er navnet på det databasebrugernavn, der blev konfigureret tidligere i miljøvariablen AZ_DATABASE_USERNAME. Skriv echo $AZ_DATABASE_USERNAME for at se den.
  • ${azureDatabasePassword} er navnet på den adgangskode til databasen, der blev konfigureret tidligere i miljøvariablen AZ_DATABASE_PASSWORD. Skriv echo $AZ_DATABASE_PASSWORD for at se den.

Som vi så i det forrige undermodul, er det en dårlig praksis at hard-code disse værdier i programkildekoden. Men hvis du vil teste programmet, kan du skrive dem midlertidigt og køre programmet:

./mvnw spring-boot:run

Du kan læse databaseindholdet ved at få adgang til Spring MVC Controller ved hjælp af følgende kommando eller ved hjælp af en webbrowser:

curl http://localhost:8080

Udrul Java-programmet på Azure

Hvis du vil installere programmet, skal du først pakke det som en Jar-fil:

./mvnw clean package

Denne kommando opretter en eksekverbar Jar-fil i mappen target, som du installerer ved hjælp af Kommandolinjegrænsefladen i Azure:

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

Hvis der opstår fejl, kan du se programlogfilerne ved at skrive følgende kommando:

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

Programmet vil derefter være tilgængeligt i cloudmiljøet, og du kan få adgang til dets data ved hjælp af en cURL-kommando:

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'}]
#

Tillykke! Du har oprettet et Java-program, der opretter forbindelse til en database! Nu skal du sikre legitimationsoplysningerne for databasen i de næste enheder.