練習 - 撰寫使用祕密的 Java 應用程式碼

已完成

您將使用 Spring Boot 來撰寫 Java Web 應用程式的程式碼,以連線至資料庫。

基於安全性考量,您將需要在未來保護該資料庫存取。 但請先建立應用程式基礎結構,再設定要使用的 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 應用程式

使用 git clone 命令,從 https://github.com/Azure-Samples/manage-secrets-in-java-applicationsGitHub 存放庫取得應用程式基本架構:

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

此應用程式會使用 Spring Data JPA 來存取資料庫。 您可以檢視 CRUD 存放庫介面:

package com.example.demo;

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

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

接著,使用 Spring MVC REST 控制器向 Web 公開資料庫中所儲存的資料:

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} 是稍早已在 AZ_DATABASE_NAME 環境變數中設定的 PostgreSQL 資料庫名稱。 輸入 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 應用程式! 現在您需要在下一個單元中保護資料庫認證。