演習 - シークレットを使用する Java アプリケーションをコーディングする

完了

データベースに接続する Java Web アプリケーションは、Spring Boot を使用してコーディングします。

セキュリティ上の理由から、今後そのデータベース アクセスをセキュリティで保護する必要があります。 しかし、まずアプリケーション インフラストラクチャを作成してから、使用する Java アプリケーションを構成しましょう。

アプリケーション インフラストラクチャを作成する

この演習では、Azure CLI を使用して以下のリソースを作成します。

  • アプリケーション用のすべてのリソースを含める Azure リソース グループ。
  • PostgreSQL データベース サーバー。
  • Azure Spring Apps クラスター、およびこのクラスター内で実行される Spring Boot アプリケーション。

スクリプトの先頭でいくつかの環境変数を指定する必要があります。これは Azure 全体で一意である必要があります。

また、ローカル コンピューターからデータベースにアクセスするには、ローカル IP アドレスを指定する必要があります。 この IP アドレスは IPv4 アドレスである必要があります。 ローカル IP アドレスがわからない場合は、この Web サイト (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-applications GitHub リポジトリからアプリケーション スケルトンを取得します。

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

この構成ファイルには、構成する必要がある次の 3 つの変数があります。

  • ${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

次のコマンドを使用するか、Web ブラウザーを使って、Spring MVC コントローラーにアクセスすることで、データベースの内容を読み取ることができます。

curl http://localhost:8080

Azure に Java アプリケーションを展開する

アプリケーションをデプロイするには、以下のようにまずそれを 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 アプリケーションの作成に成功しました。 続いて次のユニットで、データベースの資格情報をセキュリティで保護する必要があります。