Azure Cosmos DB for Apache Cassandra API で Spring Data を使用する

この記事では、Azure App Service on Linux で Java Web アプリを構築、構成、デプロイ、トラブルシューティング、およびスケーリングするプロセスを、順を追って説明します。

次のコンポーネントの使用方法を説明します。

前提条件

この記事の手順に従うには、次の前提条件が必要です。

重要

この記事の手順を完了するには、Spring Boot 2.5 以降のバージョンが必要です。

サンプル Java Web アプリ リポジトリを複製する

この演習では、Spring Todo アプリを使用します。これは、Spring Boot、Spring Data for Azure Cosmos DB、Azure Cosmos DB を使用して構築された Java アプリケーションです。

  1. Spring Todo アプリを複製し、.prep フォルダーの内容をコピーしてプロジェクトを初期化します。

    bash の場合:

    git clone --recurse-submodules https://github.com/Azure-Samples/e2e-java-experience-in-app-service-linux-part-2.git
    yes | cp -rf .prep/* .
    

    Windows の場合:

    git clone --recurse-submodules https://github.com/Azure-Samples/e2e-java-experience-in-app-service-linux-part-2.git
    cd e2e-java-experience-in-app-service-linux-part-2
    xcopy .prep /f /s /e /y
    
  2. ディレクトリを、複製したリポジトリの以下のフォルダーに変更します。

    cd initial\spring-todo-app
    

Azure CLI から Azure Cosmos DB を作成する

次の手順では、CLI を使用して Azure Cosmos DB データベースを作成します。

  1. Azure CLI にサインインし、サブスクリプション ID を設定します。

    az login
    
  2. 必要に応じて、サブスクリプション ID を設定します。

    az account set -s <your-subscription-id>
    
  3. Azure リソース グループを作成し、後で使用するためにそのリソース グループの名前をメモします。

    az group create \
        --name <your-azure-group-name> \
        --location <your-resource-group-region>
    
  4. Azure Cosmos DB を作成し、種類として GlobalDocumentDB を指定します。 Azure Cosmos DB の名前には、小文字のみを使用する必要があります。 必ず応答内の documentEndpoint フィールドをメモしてください。 この値は、後で必要になります。

    az cosmosdb create \
        --resource-group <your-resource-group-name> \
        --name <your-azure-COSMOS-DB-name-in-lower-case-letters> \
        --kind GlobalDocumentDB
    
  5. Azure Cosmos DB キーを取得し、後で使用するために primaryMasterKey 値を記録します。

    az cosmosdb keys list \
        --resource-group <your-azure-group-name> \
        --name <your-azure-COSMOSDB-name>
    

ローカルでアプリをビルドおよび実行する

次の手順では、開発用コンピューターでアプリケーションを実行します。

  1. 選択したコンソール内で、この記事で前に収集した Azure と Azure Cosmos DB の接続情報を使用して、次のコード セクションに示す環境変数を構成します。 REGION 変数のWEBAPP_NAMEと値に一意の名前を指定する必要があります。

    Linux (Bash) の場合:

    export COSMOS_URI=<put-your-COSMOS-DB-documentEndpoint-URI-here>
    export COSMOS_KEY=<put-your-COSMOS-DB-primaryMasterKey-here>
    export COSMOS_DATABASE=<put-your-COSMOS-DATABASE-name-here>
    export RESOURCEGROUP_NAME=<put-your-resource-group-name-here>
    export WEBAPP_NAME=<put-your-Webapp-name-here>
    export REGION=<put-your-REGION-here>
    export SUBSCRIPTION_ID=<put-your-SUBSCRIPTION_ID-here>
    

    Windows (コマンド プロンプト) の場合:

    set COSMOS_URI=<put-your-COSMOS-DB-documentEndpoint-URI-here>
    set COSMOS_KEY=<put-your-COSMOS-DB-primaryMasterKey-here>
    set COSMOS_DATABASE=<put-your-COSMOS-DATABASE-name-here>
    set RESOURCEGROUP_NAME=<put-your-resource-group-name-here>
    set WEBAPP_NAME=<put-your-Webapp-name-here>
    set REGION=<put-your-REGION-here>
    set SUBSCRIPTION_ID=<put-your-SUBSCRIPTION_ID-here>
    

    Note

    スクリプトを使ってこれらの変数をプロビジョニングしたい場合は、.prep ディレクトリに Bash 用のテンプレートがあるため、それをコピーして出発点として使用することができます。

  2. 次のコマンドを使用してディレクトリを変更します。

    cd initial/spring-todo-app
    
  3. 次のコマンドを使用して、Spring Todo アプリをローカルで実行します。

    mvn package spring-boot:run
    
  4. アプリケーションが起動したら、こちら (http://localhost:8080/) から Spring Todo アプリにアクセスしてデプロイを検証できます。

    Spring app running locally

App Service Linux にデプロイする

次の手順では、アプリケーションを Azure 上の Linux にデプロイします。

  1. リポジトリの初期/spring-todo-app ディレクトリにコピーした pom.xml ファイルを開きます。 次の pom.xml ファイルに示すように、Azure アプリ Service 用の Maven プラグインが含まれていることを確認します。 バージョンが 1.14.0設定されていない場合は、値を更新します。

    <plugins> 
    
        <!--*************************************************-->
        <!-- Deploy to Java SE in App Service Linux           -->
        <!--*************************************************-->
    
        <plugin>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-webapp-maven-plugin</artifactId>
            <version>1.14.0</version>
            <configuration>
                <schemaVersion>v2</schemaVersion>
                <subscriptionId>${SUBSCRIPTION_ID}</subscriptionId>
                <!-- Web App information -->
                <resourceGroup>${RESOURCEGROUP_NAME}</resourceGroup>
                <appName>${WEBAPP_NAME}</appName>
                <region>${REGION}</region>
                <pricingTier>P1v2</pricingTier>
                <!-- Java Runtime Stack for Web App on Linux-->
                <runtime>
                    <os>Linux</os>
                    <javaVersion>Java 8</javaVersion>
                    <webContainer>Java SE</webContainer>
                </runtime>
                <deployment>
                    <resources>
                        <resource>
                            <directory>${project.basedir}/target</directory>
                            <includes>
                                <include>*.jar</include>
                            </includes>
                        </resource>
                    </resources>
                </deployment>
                <appSettings>
                    <property>
                        <name>COSMOS_URI</name>
                        <value>${COSMOS_URI}</value>
                    </property>
                    <property>
                        <name>COSMOS_KEY</name>
                        <value>${COSMOS_KEY}</value>
                    </property>
                    <property>
                        <name>COSMOS_DATABASE</name>
                        <value>${COSMOS_DATABASE}</value>
                    </property>
                    <property>
                        <name>JAVA_OPTS</name>
                        <value>-Dserver.port=80</value>
                    </property>
                </appSettings>
    
            </configuration>
        </plugin>            
        ...
    </plugins>
    
  2. App Service Linux の Java SE にデプロイする

    mvn azure-webapp:deploy
    
    // Deploy
    bash-3.2$ mvn azure-webapp:deploy
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------< com.azure.spring.samples:spring-todo-app >--------
    [INFO] Building spring-todo-app 2.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- azure-webapp-maven-plugin:1.14.0:deploy (default-cli) @ spring-todo-app ---
    Auth type: AZURE_CLI
    Default subscription: Consoto Subscription(subscription-id-xxx)
    Username: user@contoso.com
    [INFO] Subscription: Consoto Subscription(subscription-id-xxx)
    [INFO] Creating app service plan...
    [INFO] Successfully created app service plan asp-spring-todo-app.
    [INFO] Creating web app spring-todo-app...
    [INFO] Successfully created Web App spring-todo-app.
    [INFO] Trying to deploy artifact to spring-todo-app...
    [INFO] Successfully deployed the artifact to https://spring-todo-app.azurewebsites.net
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  02:05 min
    [INFO] Finished at: 2021-05-28T09:43:19+08:00
    [INFO] ------------------------------------------------------------------------
    
  3. App Service Linux の Java SE で実行されている Web アプリを参照します。

    https://<WEBAPP_NAME>.azurewebsites.net
    

Spring app running in App Service on Linux

ログを表示して Azure の Spring Todo アプリをトラブルシューティングする

次の手順では、Azure でログ ファイルを開きます。

  1. Linux の Azure App Service にデプロイされた Java Web アプリのログを構成します。

    az webapp log config \
        --name ${WEBAPP_NAME} \
        --resource-group ${RESOURCEGROUP_NAME} \
        --web-server-logging filesystem
    
  2. ローカル マシンから Java Web アプリのリモート ログ ストリームを開きます。

    az webapp log tail \
        --name ${WEBAPP_NAME} \
        --resource-group ${RESOURCEGROUP_NAME}
    
    bash-3.2$ az webapp log tail --name ${WEBAPP_NAME}  --resource-group ${RESOURCEGROUP_NAME}
    2021-05-28T01:46:08.000655632Z   _____                               
    2021-05-28T01:46:08.000701432Z   /  _  \ __________ _________   ____  
    2021-05-28T01:46:08.000708133Z  /  /_\  \___   /  |  \_  __ \_/ __ \ 
    2021-05-28T01:46:08.000711733Z /    |    \/    /|  |  /|  | \/\  ___/ 
    2021-05-28T01:46:08.000714933Z \____|__  /_____ \____/ |__|    \___  >
    2021-05-28T01:46:08.000718233Z         \/      \/                  \/ 
    2021-05-28T01:46:08.000721333Z A P P   S E R V I C E   O N   L I N U X
    2021-05-28T01:46:08.000724233Z Documentation: http://aka.ms/webapp-linux
    ...
    ...
    2021-05-28T01:46:18.925044188Z   .   ____          _            __ _ _
    2021-05-28T01:46:18.925481392Z  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    2021-05-28T01:46:18.926004297Z ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
    2021-05-28T01:46:18.926587603Z  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
    2021-05-28T01:46:18.926599403Z   '  |____| .__|_| |_|_| |_\__, | / / / /
    2021-05-28T01:46:18.926841806Z  =========|_|==============|___/=/_/_/_/
    2021-05-28T01:46:18.931157849Z  :: Spring Boot ::                (v2.4.5)
    ...
    ...
    2021-05-28T01:46:29.842553633Z 2021-05-28 01:46:29.842  INFO 124 --- [           main] c.azure.spring.   samples.TodoApplication   : Started TodoApplication in 12.635 seconds (JVM running for 17.664)
    2021-05-28T01:46:30.477951594Z 2021-05-28 01:46:30.477  INFO 124 --- [p-nio-80-exec-1] o.a.c.c.C.   [Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
    2021-05-28T01:46:30.483316162Z 2021-05-28 01:46:30.483  INFO 124 --- [p-nio-80-exec-1] o.s.web.   servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
    2021-05-28T01:46:30.485411088Z 2021-05-28 01:46:30.484  INFO 124 --- [p-nio-80-exec-1] o.s.web.   servlet.DispatcherServlet        : Completed initialization in 0 ms
    2021-05-28T01:47:19.683003828Z 2021-05-28 01:47:19.682  INFO 124 --- [p-nio-80-exec-9] c.a.s.s.   controller.TodoListController    : GET request access '/api/todolist' path.
    2021-05-28T01:47:26.069984388Z 2021-05-28 01:47:26.069  INFO 124 --- [-nio-80-exec-10] c.a.s.s.   controller.TodoListController    : POST request access '/api/todolist' path with item: Milk
    2021-05-28T01:47:26.649080678Z 2021-05-28 01:47:26.648  INFO 124 --- [p-nio-80-exec-1] c.a.s.s.   controller.TodoListController    : GET request access '/api/todolist' path.
    

Spring Todo アプリをスケールアウトする

次の手順に従って、アプリケーションをスケーリングします。

  1. Azure CLI を使用して Java Web アプリをスケールアウトします。

    az appservice plan update \
        --number-of-workers 2 \
        --name ${WEBAPP_PLAN_NAME} \
        --resource-group ${RESOURCEGROUP_NAME}
    

次のステップ

関連項目

Azure での Spring Boot アプリケーションの使用の詳細については、次の記事を参照してください。

Java での Azure の使用の詳細については、「Java 開発者向けの Azure」および「Azure DevOps と Java の操作」を参照してください。

Spring Framework は Java 開発者のエンタープライズ レベルのアプリケーション作成を支援するオープンソース ソリューションです。 このプラットフォームで構築される特に知られたプロジェクトの 1 つが Spring Boot です。これによって、スタンドアロンの Java アプリケーションの作成方法が簡略化されます。 Spring Boot を使い始めた開発者を支援するために、https://github.com/spring-guides/ では、サンプルの Spring Boot パッケージがいくつか用意されています。 基本的な Spring Boot プロジェクトの一覧から選択するだけでなく、Spring Initializr は、開発者がカスタム Spring Boot アプリケーションの作成を開始できるように支援します。