แบบฝึกหัด - กําหนดรหัสแอปพลิเคชัน 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

รับแอ็พพลิเคชัน skeleton จากที่เก็บข้อมูล 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

แอปพลิเคชันนี้ใช้ 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 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();
    }
}

ข้อมูลนี้ถูกแทรกลงในฐานข้อมูลในเวลาเริ่มต้น โดยใช้ไฟล์ 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 Controller โดยใช้คําสั่งต่อไปนี้ หรือใช้เว็บเบราว์เซอร์:

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 ที่เชื่อมต่อกับฐานข้อมูลเรียบร้อยแล้ว! ในตอนนี้ คุณจําเป็นต้องรักษาความปลอดภัยข้อมูลประจําตัวของฐานข้อมูลในหน่วยถัดไป