チュートリアル:Azure App Service on Linux と Azure Cosmos DB を使用して Java Spring Boot Web アプリを構築する

Note

Spring アプリケーションの場合は、Azure Spring Apps を使用することをお勧めします。 ただし、Azure App Service は引き続き宛先として使用できます。 アドバイスについては、Java ワークロード宛先ガイダンスに関する記事を参照してください。

このチュートリアルでは、Azure で Java Web アプリを構築、構成、デプロイ、およびスケーリングするプロセスを、順を追って説明します。 完了すると、Azure App Service on Linux で実行中の Azure Cosmos DB にデータを格納する Spring Boot アプリケーションが完成します。

Azure Cosmos DB にデータを格納する Spring Boot アプリケーション

このチュートリアルでは、次の作業を行う方法について説明します。

  • Azure Cosmos DB のデータベースを作成します。
  • サンプル アプリをデータベースに接続し、ローカルでテストする
  • サンプル アプリを Azure にデプロイする
  • App Service から診断ログをストリーム配信する
  • 他のインスタンスを追加してサンプル アプリをスケールアウトする

Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。

前提条件

サンプルの TODO アプリを複製してリポジトリを準備する

このチュートリアルでは、Spring Data for Azure Cosmos DB を基盤とする Spring REST API を呼び出す Web UI を備えた、サンプルの TODO リスト アプリを使用します。 このアプリのコードは、GitHub で入手できます。 Spring と Azure Cosmos DB を使用した Java アプリの記述について詳しくは、Azure Cosmos DB for NoSQL を備える Spring Boot Starter のチュートリアルと、Spring Data for Azure Cosmos DB のクイック スタートを参照してください。

お使いのターミナルで次のコマンドを実行して、サンプル リポジトリを複製し、サンプル アプリの環境をセットアップします。

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
yes | cp -rf .prep/* .

Azure Cosmos DB を作成する

以下の手順に従って、お使いのサブスクリプション内に Azure Cosmos DB データベースを作成します。 TODO リスト アプリは、このデータベースに接続し、実行時にデータを格納します。アプリケーションの状態は、アプリケーションを実行する場所に関わらず永続化されます。

  1. Azure CLI にログインして、ログイン資格情報に接続されるサブスクリプションが複数ある場合は、必要に応じてサブスクリプションを設定します。

    az login
    az account set -s <your-subscription-id>
    
  2. Azure リソース グループを作成して、そのリソース グループの名前をメモします。

    az group create -n <your-azure-group-name> \
        -l <your-resource-group-region>
    
  3. 種類が GlobalDocumentDB の Azure Cosmos DB を作成します。 Azure Cosmos DB インスタンスの名前には、小文字のみを使用する必要があります。 コマンドからの応答内の documentEndpoint フィールドをメモします。

    az cosmosdb create --kind GlobalDocumentDB \
        -g <your-azure-group-name> \
        -n <your-azure-COSMOS-DB-name-in-lower-case-letters>
    
  4. アプリに接続するための Azure Cosmos DB キーを取得します。 primaryMasterKeydocumentEndpoint は、次の手順で必要になるため、近くに保管しておきます。

    az cosmosdb keys list -g <your-azure-group-name> -n <your-azure-COSMOSDB-name>
    

TODO アプリのプロパティを構成する

お使いのコンピューターでターミナルを開きます。 クローンされたリポジトリ内にサンプル スクリプト ファイルをコピーし、先ほど作成した Azure Cosmos DB データベースのためにカスタマイズできるようにします。

cd initial/spring-todo-app
cp set-env-variables-template.sh .scripts/set-env-variables.sh

お好きなエディターで .scripts/set-env-variables.sh を編集して、Azure Cosmos DB の接続情報を指定します。 App Service Linux 構成の場合は、前と同じリージョン (your-resource-group-region) と、Azure Cosmos DB データベースの作成時に使用したリソース グループ (your-azure-group-name) を使います。 どの Azure デプロイ内の Web アプリ名も複製できないために一意である WEBAPP_NAME を選択します。

export COSMOSDB_URI=<put-your-COSMOS-DB-documentEndpoint-URI-here>
export COSMOSDB_KEY=<put-your-COSMOS-DB-primaryMasterKey-here>
export COSMOSDB_DBNAME=<put-your-COSMOS-DB-name-here>

# App Service Linux Configuration
export RESOURCEGROUP_NAME=<put-your-resource-group-name-here>
export WEBAPP_NAME=<put-your-Webapp-name-here>
export REGION=<put-your-REGION-here>

その後、スクリプトを実行します。

source .scripts/set-env-variables.sh

これらの環境変数は、TODO リスト アプリの application.properties で使用されます。 プロパティ ファイル内のフィールドによって、Spring Data 用の既定のリポジトリ構成が設定されます。

azure.cosmosdb.uri=${COSMOSDB_URI}
azure.cosmosdb.key=${COSMOSDB_KEY}
azure.cosmosdb.database=${COSMOSDB_DBNAME}
@Repository
public interface TodoItemRepository extends DocumentDbRepository<TodoItem, String> {
}

その後、サンプル アプリでは com.microsoft.azure.spring.data.cosmosdb.core.mapping.Document からインポートされた @Document 注釈を使用して、Azure Cosmos DB によって格納され、管理されるエンティティ型を設定します。

@Document
public class TodoItem {
    private String id;
    private String description;
    private String owner;
    private boolean finished;

サンプル アプリを実行する

Maven を使用してサンプルを実行します。

mvn package spring-boot:run

出力は次のようになります。

bash-3.2$ mvn package spring-boot:run
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building spring-todo-app 2.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 


[INFO] SimpleUrlHandlerMapping - Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
[INFO] SimpleUrlHandlerMapping - Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
[INFO] WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html]
2018-10-28 15:04:32.101  INFO 7673 --- [           main] c.m.azure.documentdb.DocumentClient      : Initializing DocumentClient with serviceEndpoint [https://sample-cosmos-db-westus.documents.azure.com:443/], ConnectionPolicy [ConnectionPolicy [requestTimeout=60, mediaRequestTimeout=300, connectionMode=Gateway, mediaReadMode=Buffered, maxPoolSize=800, idleConnectionTimeout=60, userAgentSuffix=;spring-data/2.0.6;098063be661ab767976bd5a2ec350e978faba99348207e8627375e8033277cb2, retryOptions=com.microsoft.azure.documentdb.RetryOptions@6b9fb84d, enableEndpointDiscovery=true, preferredLocations=null]], ConsistencyLevel [null]
[INFO] AnnotationMBeanExporter - Registering beans for JMX exposure on startup
[INFO] TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path ''
[INFO] TodoApplication - Started TodoApplication in 45.573 seconds (JVM running for 76.534)

アプリが開始されたら、リンク http://localhost:8080/ を使用して Spring TODO アプリにローカルでアクセスできます。

Spring TODO アプリにローカルでアクセスする

TODO アプリケーションを開始したというメッセージではなく、例外が表示される場合は、前の手順の bash スクリプトによって環境変数が正しくエクスポートされたかを確認し、値が、作成した Azure Cosmos DB データベースに対して正しいことを確認してください。

Azure デプロイを構成する

initial/spring-boot-todo ディレクトリ内の pom.xml ファイルを開き、次に示す Azure Web App Plugin for Maven の構成を追加します。

<plugins> 

    <!--*************************************************-->
    <!-- Deploy to Java SE in App Service Linux           -->
    <!--*************************************************-->
       
    <plugin>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-webapp-maven-plugin</artifactId>
        <version>2.5.0</version>
        <configuration>
            <schemaVersion>v2</schemaVersion>

            <!-- 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>COSMOSDB_URI</name>
                    <value>${COSMOSDB_URI}</value>
                </property> 
                <property>
                    <name>COSMOSDB_KEY</name>
                    <value>${COSMOSDB_KEY}</value>
                </property>
                <property>
                    <name>COSMOSDB_DBNAME</name>
                    <value>${COSMOSDB_DBNAME}</value>
                </property>
                <property>
                    <name>JAVA_OPTS</name>
                    <value>-Dserver.port=80</value>
                </property>
            </appSettings>

        </configuration>
    </plugin>           
    ...
</plugins>

App Service on Linux にデプロイする

mvn azure-webapp:deploy の Maven 目標を使用して、TODO アプリを Azure App Service on Linux にデプロイします。


# Deploy
bash-3.2$ mvn azure-webapp:deploy
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building spring-todo-app 2.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- azure-webapp-maven-plugin:2.5.0:deploy (default-cli) @ spring-todo-app ---
Auth Type: AZURE_CLI
Default subscription: xxxxxxxxx
Username: xxxxxxxxx
[INFO] Subscription: xxxxxxxxx
[INFO] Creating App Service Plan 'ServicePlanb6ba8178-5bbb-49e7'...
[INFO] Successfully created App Service Plan.
[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:19 min
[INFO] Finished at: 2019-11-06T15:32:03-07:00
[INFO] Final Memory: 50M/574M
[INFO] ------------------------------------------------------------------------

出力には、デプロイされたアプリケーションへの URL が含まれています (この例では https://spring-todo-app.azurewebsites.net)。 この URL を Web ブラウザーにコピーするか、ターミナル ウィンドウで次のコマンドを実行すると、アプリを読み込むことができます。

explorer https://spring-todo-app.azurewebsites.net

アドレス バーにリモート URL が表示されて、実行されているアプリが表示されるはずです。

リモート URL で実行中の Spring Boot アプリケーション

診断ログをストリーミングする

App Service のアプリケーション コード内から生成されたコンソール ログにアクセスするには、Cloud Shell で次のコマンドを実行して、診断ログを有効にします。

az webapp log config --resource-group <resource-group-name> --name <app-name> --docker-container-logging filesystem --level Verbose

--level で有効な値は、ErrorWarningInfo、および Verbose です。 後続の各レベルには、前のレベルが含まれます。 たとえば、Error にはエラー メッセージのみが含まれ、Verbose にはすべてのメッセージが含まれます。

診断ログがオンになったら、次のコマンドを実行して、ログのストリームを確認します。

az webapp log tail --resource-group <resource-group-name> --name <app-name>

コンソール ログがすぐに表示されない場合は、30 秒以内にもう一度確認します。

Note

https://<app-name>.scm.azurewebsites.net/api/logs/docker で、ブラウザーからログ ファイルを検査することもできます。

任意のタイミングでログのストリーミングを停止するには、Ctrl+C と入力します。

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

別のワーカーを追加することで、アプリケーションをスケールアウトします。

az appservice plan update --number-of-workers 2 \
   --name ${WEBAPP_PLAN_NAME} \
   --resource-group <your-azure-group-name>

リソースをクリーンアップする

これらのリソースが別のチュートリアルで不要である場合 (「次のステップ」を参照)、Cloud Shell で次のコマンドを実行して削除することができます。

az group delete --name <your-azure-group-name> --yes

次のステップ

Java 開発者向けの AzureSpring BootSpring Data for Azure Cosmos DBAzure Cosmos DB および App Service Linux

App Service on Linux での Java アプリの実行の詳細について開発者ガイドで確認してください。

カスタム ドメインと証明書を使用してアプリをセキュリティで保護する方法について説明します。