Posts tagged ‘Azure’
Java on Azure Day 2023 開催のお知らせ
皆様この度、日本マイクロソフト株式会社主催の Java 技術カンファレンス「Java on Azure Day 2023」の開催が決まりました。
- 日時:2023 年 4月 26 日 10時〜18時
- 場所:日本マイクロソフト株式会社 品川本社オフィス 31F セミナールーム
- 登録サイト:https://msevents.microsoft.com/event?id=3692399073
COVID-19 以降、様々なテクノロジー・カンファレンスがオンライン化され、Java on Azure Day も過去2回はオンラインで開催しました。しかし今回は、完全なオフラインの対面イベントとして開催します。(現時点でオンライン配信の予定はございません)
2年前は当たり前だった対面形式のイベントを思い出し、対面だからこそ得られる体験、そして直接お会いして交流する喜びをもう一度取り戻したいと考えています。
- 対面形式で行う生セッション (オンラインとは違う生セッションの緊張感)
- エキスパートと直接会話、相談、問い合わせ、フィードバックができる
- 新しい人と人との出会いや繋がり、新しいネットワーク作り
現時点では、まだセッションのリストは公開していませんが、徐々にセッションの内容も決まってきています。もうすぐでセッション・リストを公開する予定ですが、豪華なスピーカーの皆様に、各技術の最新動向や詳細についてご登壇いただく予定でございます。純粋な Java の最新技術から、Java on Azure に関する最新動向、さらにはマイクロソフトのパートナー企業の動向まで、たった1日で様々な技術を学べます。
全セッション終了後に、参加者の皆様にご参加いただく事が可能なネットワーク・パーティも用意しています。この2年間ネットワーク経由でしか会えなかった方々と直接お会いできるチャンスの他、初めて対面イベントに参加される方も新しい人脈を作ることのできる貴重な機会です。
ぜひ、この久しぶりに開催するオフラインの対面イベントにお越しください。
どうぞ宜しくお願いします。
寺田
Azure Spring Cloud の環境構築方法のご紹介
本ブログエントリは、Microsoft Azure Advent Calendar の 20日目の内容です。
昨日は @mstakaha1113 さんによる 「AzureでIoT系のサービスをサラッと(?)使ってみよう」でした。
明日は @hoisjp さんです。
Pivotal と Microsoft は 2019/10/8 オースティンで開催された SpringOne Platform 2019 で Azure Spring Cloud というサービスを発表しました。
(SpringOne 2019 における Azure Spring Cloud の発表内容)
Azure Spring Cloud の特徴
Azure Spring Cloud は Microsoft と Pivotal が共同開発した Spring Cloud アプリケーションの開発・運用に特化した環境で、これを利用した場合、アプリケーションの運用・管理コストを大幅に軽減してくれます。
実際の実行環境は Azure Kubernets Service (AKS) ですが、Kubernetes 環境を全く意識することなく、本来必要となる複雑な管理操作を完全に隠蔽しています。実際 Kubernetes コマンドを直接実行する事はできません。その為、おそらく多くの方が Kubernetes 上で動作している事に気づかないかもしれません。
筆者は Kubernetes による Java アプリケーションの開発・運用も経験をしていますが、Kubernetes 上での開発・運用に比べて、特にインフラ面の管理コストが大幅に削減できると考えています。
通常 Kubernetes 上で Java アプリケーションを動作させるためには、コンテナを強く意識したビルド・プロセス、リリース・プロセスが必要です (コンテナのビルド、コンテナレジストリへの Push、YAML の生成、k8s への適用など)。
# Build the Source Code $ mvn clean package # Build the Container Image $ docker build -t $DOCKER_IMAGE:$VERSION . -f Dockerfile $ docker tag $DOCKER_IMAGE:$VERSION $DOCKER_REPOSITORY/$DOCKER_IMAGE:$VERSION # Push the image to Container Registry $ docker push $DOCKER_REPOSITORY/$DOCKER_IMAGE:$VERSION # Create and Modify the Deployment YAML file # Apply to the Kubernetes kubectl apply --record -f deployment.yaml
上記以外にも、Kuberenes 自身のメンテナンスやパッチ適用、クラスタ自身の運用管理を行わなければなりません。
しかし、Azure Spring Cloud を利用すると Pivotal Build Service という機能を完全統合しているため、アプリケーション開発者は、ソースコードの開発により集中できるようになります。具体的には開発者はソースコードの開発に集中し、コンテナのビルドや YAML ファイルの生成は不要で、コマンドを2、3回実行するだけで簡単にアプリケーションをデプロイできるようになります。デプロイに関しても最初から Blue-Green デプロイの機能を持つため、最新のビルドは Staging 環境にデプロイし、動作確認したのち、本番環境と切り替えるといった操作も容易に実現できます。
さらに、既存の Azure の Managed Service (現時点では Cosmos DB, MySQL, Redis) とのサービス・バインディングの機能も持つ為、JDBC などの接続情報を容易に作成することもできとても便利です。
上記以外にも多くの機能を持つ Azure Spring Cloud ですが、筆者は比較的小規模〜中規模のマイクロサービス提供をしたい場合、今後有用な選択肢になると考えています。
実際の操作イメージを掴む為、下記のデモ動画をご覧ください。
下記動画のデモ内容
- デモアプリケーションのご紹介 (PetStore)
- Azure DataBase for MySQL の動作確認
- Visual Studio Code を利用した Spring Boot アプリの実装のご紹介
- ソースコードのビルド
- Azure Spring Cloud アプリの作成
- Azure Spring Cloud アプリから Managed MySQL へのバインド
- CPU, Memory, インスタンスなどのスケール機能のご紹介
- Spring Boot アプリケーションを Azure Spring Cloud アプリへデプロイ
- Log Analytics による、アプリケーション・ログの確認
- アプリケーションの動作確認
- 分散トレーシング機能のご紹介 (Application Insights を利用)
- ブルー・グリーン・デプロイ機能の検証
ソースコード修正→ビルド→ステージング環境へのデプロイ
- ステージング・アプリと本番アプリの切り替え
- GitHub Actions を利用した CI/CD の構築
(GUI で Azure Spring Cloud と MySQL を接続する環境構築方法)
※ ご注意:本デモ動画は筆者のプレゼン時に操作時の待ち時間を短縮するため、操作待ちの箇所をカット(編集)しています。実際には、本デモ動画よりも所用時間が長くなることをご理解ください。
NeXTSTEP :Azure Spring Cloud 構築の事前準備 (CLI 版)
以降のエントリーでは、上記 GUI (動画ビデオ) で環境構築した内容と、ほぼ同等の内容を CLI (コマンドライン)だけで構築する方法について紹介します。
CLI で環境構築する場合は別途、Log Analytics や Application Insights の連携などを自ら行う必要がある為、まずはこれらを作成するところから始めます。
1. Azure へのログインと Spring Cloud 用エクステンションの追加
まず、Azure CLI を利用するために az login コマンドでログインをしましょう。そして次に、Azure Spring Cloud を操作するために、az extension コマンドでエクステンションを追加してください。
$ az login $ az extension add --name spring-cloud
2. 環境変数の設定
次に、各種リソースの名前などを可変で変更しやすくするため、さらに入力ミスを極力減らす目的で、下記の環境変数を設定してください。
$ export RESOURCE_GROUP=Spring-Cloud-Services $ export SPRING_CLOUD_SVC_NAME=spring-cloud-services-jp $ export LOCATION=southeastasia $ export APP_INSIGHTS_NAME=spring-clouds-appinsights $ export MYSQL_NAME=mysql4springcloud $ export MYSQL_USERNAME=terada $ export MYSQL_PASSWORD=whelp90-OCRs $ export MYSQL_DB_NAME=petstoredb $ export SPRING_CLOUD_APP_NAME=petstore-app $ export SPRING_CLOUD_APP_NEW_VERSION_NAME=petstore-app-new-version
上記の環境変数名のそれぞれの意味を下記に記載します。適宜ご自身の環境に応じて上記の環境変数の値は変更してください。
環境変数名 | 説明 |
RESOURCE_GROUP | リソースグループ名 |
SPRING_CLOUD_SVC_NAME | Azure Spring Cloud のサービス名 |
LOCATION | リソースを配置するリージョンの場所 |
APP_INSIGHTS_NAME | Application Insights の名前 |
MYSQL_NAME | MySQL の名前 |
MYSQL_USERNAME | MySQL のログイン・ユーザ名 |
MYSQL_PAAWORD | MySQL のユーザ・パスワード |
MYSQL_DB_NAME | MySQL のデータベース名 |
SPRING_CLOUD_APP_NAME | Azure Spring Cloud のデプロイするアプリケーション名 |
CLOUD_APP_NEW_VERSION_NAME | Azure Spring Cloud のステージング環境に配備するアプリケーション名 |
3. Azure リソースグループの作成
それでは早速、Azure Spring Cloud をインストールするリソース・グループを作成します。下記のコマンドを実行してください。
$ az group create \ --location $LOCATION \ --name $RESOURCE_GROUP
4. Application Insights のインストール
リソース・グループを作成した後、Application Insights をインストールしてください。Application Insights をインストールする事で、Azure Spring Cloud から分散トレーシング機能を利用できるようになります。
$ az resource create \ --resource-group $RESOURCE_GROUP \ --resource-type "Microsoft.Insights/components" \ --name $APP_INSIGHTS_NAME \ --location $LOCATION \ --properties '{"Application_Type":"web"}'
上記コマンドを実行した結果が、JSON 形式で出力されます。出力結果の中に、下記のような InstrumentationKey が表示されます。
後の設定で利用するため、この値をコピーして保存しておいてください。
"InstrumentationKey": "d25f6639-****-****-****-f1b******b41",
5. Log Analytics Workspace のインストール
次に、Log Analytics Workspace をインストールします。下記の defaultValue の値をご自身の環境にあわせて修正して deploy_logworkspacetemplate.json というファイル名で保存してください。
{ "$schema": "https://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "workspaceName": { "type": "String", "defaultValue": "workspace-name(適宜名前を修正してください)", "metadata": { "description": "Specifies the name of the workspace." } }, "location": { "type": "String", "allowedValues": [ "eastus", "southeastasia", "westus" ], "defaultValue": "southeastasia", "metadata": { "description": "Specifies the location in which to create the workspace." } }, "sku": { "type": "String", "allowedValues": [ "Standalone", "PerNode", "PerGB2018" ], "defaultValue": "PerGB2018", "metadata": { "description": "Specifies the service tier of the workspace: Standalone, PerNode, Per-GB" } } }, "resources": [ { "type": "Microsoft.OperationalInsights/workspaces", "name": "[parameters('workspaceName')]", "apiVersion": "2015-11-01-preview", "location": "[parameters('location')]", "properties": { "sku": { "Name": "[parameters('sku')]" }, "features": { "searchVersion": 1 } } } ] }
上記の JSON を deploy_logworkspacetemplate.json ファイルに保存したのち、下記のコマンドを実行し Log Analytics の Workspace を作成してください。
$ az group deployment create \ --resource-group $RESOURCE_GROUP \ --name spring-cloud-log-analytics-workspace \ --template-file deploy_logworkspacetemplate.json
6. Azure Database for MySQL のインストールと検証用 DB の作成
最後の準備事項として、下記のコマンドを実行して Azure Database for MySQL をインストールします。
※ ご注意:今回の MySQL の作成方法は検証目的で作成しています。本番環境用ではないためご注意ください。
$ az mysql server create \ -l $LOCATION \ -g $RESOURCE_GROUP \ -n $MYSQL_NAME \ -u $MYSQL_USERNAME \ -p $MYSQL_PASSWORD \ --sku-name GP_Gen5_2
MySQL を作成した直後は Firewall の設定により全てのクライアントからのリクエストを受け付けられなくなっています。そこで Firewall の設定を行い MySQL に接続できるようにします。ここでは、Azure 内の IP アドレス (0.0.0.0) からだけ MySQL に接続をできるようにしています。
※ ご注意:本来は個別に接続可能な IP アドレスを設定してください。
$ az mysql server firewall-rule create \ -g $RESOURCE_GROUP \ -s $MYSQL_NAME \ -n allowfrominternal \ --start-ip-address 0.0.0.0 \ --end-ip-address 0.0.0.0
上記の設定で、Azure 内のネットワークからは MySQL に接続できるようになります。たとえばコマンドの実行環境が Cloud Shell などを利用している場合、これで接続ができるようになるかと想定します。
一方、MySQL への接続が外部のネットワークからの場合、0.0.0.0 の部分を変更し個別に接続可能な IP アドレスを指定してください。管理ポータルを利用すると簡単にクライアントの IP アドレスを入手し登録する事もできます。MySQL の「Connection Security」より「Add ClientIP」というボタンを押下するとご自身の IP アドレスが自動的に取得できます。「Save」ボタンを押下してご自身のパソコンなどからアクセスできるように設定してください。
Firewall 設定が完了すると、mysql コマンドを利用して MySQL に接続ができるようになります。下記のコマンドでは日本語入力に対応する設定や、データベースの作成、さらにはテーブル作成やデータをインサートを行なっています。 ( catalog.sql は後述する git clone で入手できます)
$ mysql -u $MYSQL_USERNAME@$MYSQL_NAME \ -h $MYSQL_NAME.mysql.database.azure.com -p mysql> show databases; mysql> show variables like "char%"; mysql> set character_set_database=utf8mb4; mysql> set character_set_server=utf8mb4; mysql> create database petstoredb default character set utf8mb4; mysql> use petstoredb; mysql> source ./catalog.sql mysql> select * from item;
CLI 版:Azure Spring Cloud の環境構築
7. Azure Spring Cloud の構築
上記の準備を完了することで、Azure Spring Cloud を便利に利用できるための環境が整いました。そこで、ここから実際に Azure Spring Cloud のサービスを作っていきます。リソース・グループ内に Azure Spring Cloud のサービスを作成してください。
$ az spring-cloud create \ -n $SPRING_CLOUD_SVC_NAME \ -g $RESOURCE_GROUP
8.Azure Spring Cloud と Log Analytics の連携
Azure Spring Cloud のサービスを作成したのち、Log Analytics WorkSpace と連携するための設定を行ってください。
大変残念ながら、この連携の設定は現時点で Azure 管理ポータルからしかできません。
管理ポータルから Azure Spring Cloud を選択し、「Monitoring」→「Diagnostics settings」を選択してください。
次に「+ Add diagnostic setting」を押下し「Name」に適切な名前を入力してください。
次に「Send to Log Analytics」にチェックし「Subscription」と「Log Analytics workspace」から、準備段階で作成したワークスペース名を選択してください。log, metrics の全項目にチェックし「Save」ボタンを押下してください。
以上で、デプロイしたアプリケーションのログなどが Log Analytics 経由で参照できるようになります。
9. Azure Spring Cloud 上に新規アプリの作成
Azure Spring Cloud のサービスを作成したので、次にサービス内に Spring Boot/Spring Cloud のマイクロサービス・アプリケーションをデプロイします。
$ az spring-cloud app create \ -n $SPRING_CLOUD_APP_NAME \ -s $SPRING_CLOUD_SVC_NAME \ -g $RESOURCE_GROUP
10. MySQL へのバインドを作成
次に、Azure Spring Cloud から MySQL を利用できるようにバインド設定を行います。GUI からバインドを作成する際は、GUI からサブスクリプションを選択しその中に含まれる MySQL を選択することで容易にバインド情報を作成できますが、CLI からバインドを行うためにはまず MySQL の ID を取得しなければなりません。そこで、MySQL の ID を取得するために、下記のコマンドを実行して取得してください。ここで、「“id”: “/subscriptions/***」 ではじまる行の内 「/databases/petstoredb」 より前の部分を MySQL の リソース ID (–resource-id) として利用します。
$ az mysql db show \ --name $MYSQL_DB_NAME \ -g $RESOURCE_GROUP \ --server-name $MYSQL_NAME { "charset": "utf8mb4", "collation": "utf8mb4_general_ci", "id": "/subscriptions/********-****-****-****-************/resourceGroups/Spring-Cloud-Env/providers/Microsoft.DBforMySQL/servers/mysql4springcloud/databases/petstoredb", "name": "petstoredb", "resourceGroup": "Spring-Cloud-Env", "type": "Microsoft.DBforMySQL/servers/databases" }
取得した リソース ID を指定して MySQL のバインドを作成してください。
$ az spring-cloud app binding mysql add \ --app $SPRING_CLOUD_APP_NAME \ --resource-id "/subscriptions/********-****-****-****-************/resourceGroups/Spring-Cloud-Env/providers/Microsoft.DBforMySQL/servers/mysql4springcloud" \ --database-name $MYSQL_DB_NAME \ --name "mysql-binding" \ -s $SPRING_CLOUD_SVC_NAME \ -g $RESOURCE_GROUP \ --username $MYSQL_USERNAME@$MYSQL_NAME \ --key $MYSQL_PASSWORD
バインドが完了すると Azure Portal 上では下記のような内容を確認できます。
11. サンプル・ソースコードの入手
次に、GitHub よりサンプルのソースコードやデータ、設定ファイルなどを入手してください。
$ git clone https://github.com/yoshioterada/Azure-Spring-Cloud-with-MySQL-Sample
ディレクトリ構成は下記のようになっています。
├── catalog.sql (MySQL に挿入するデータ) ├── deploy_logworkspacetemplate.json (Log Analytics Workspace を作成するためのJSON) ├── mvnw ├── mvnw.cmd ├── pom.xml └── src ├── main │ ├── java │ │ └── com │ │ └── yoshio3 │ │ └── demo │ │ ├── CatItemRepository.java (Repository クラス) │ │ ├── DemoApplication.java (Main クラス) │ │ ├── Item.java (JPA Entity クラス) │ │ └── PetItemController.java (REST API 実装クラス) │ └── resources │ ├── AI-Agent.xml │ ├── application.properties │ ├── log4j2.xml │ ├── static │ │ ├── css │ │ │ ├── new-design.css (新デザイン) │ │ │ └── old-design.css (旧デザイン) │ │ └── images │ └── templates │ └── index.html ( Web ページ ThymeLeaf ) └── test └── java └── com └── yoshio3 └── demo └── DemoApplicationTests.java
12. ソースコードのビルドとアプリのデプロイ
入手したソースコードを mvn コマンドでビルドしてください。ビルドが完了すると target ディレクトリ配下に demo-0.0.1-SNAPSHOT.jar ができます。
$ mvn clean package -DskipTests $ ls target/ classes demo-0.0.1-SNAPSHOT.jar demo-0.0.1-SNAPSHOT.jar.original generated-sources generated-test-sources maven-archiver maven-status test-classes
ビルドの成果物である demo-0.0.1-SNAPSHOT.jar を Azure Spring Cloud のアプリに対してデプロイします。
この時、事前準備で作成した Application Insights の InstrumentationKey を環境変数 (–env “azure.application-insights.instrumentation-key=) に設定します。これにより Java で実装した Application Insights を動作できます。デプロイには少し時間がかかりますので、しばらくお待ちください。
$ az spring-cloud app deploy \ -n $SPRING_CLOUD_APP_NAME \ -s $SPRING_CLOUD_SVC_NAME \ -g $RESOURCE_GROUP \ --instance-count 2 --memory 2 \ --runtime-version Java_8 \ --env "azure.application-insights.instrumentation-key=********-****-****-****-************" \ --jar-path ./target/demo-0.0.1-SNAPSHOT.jar --version 1
13. 外部から接続可能な Public URL を作成
デプロイ時に Public URL の公開オプションを指定せずにデプロイすると下記のように 「Test Endpoint」しか作成されません。
GUI からは「Assign domain」のボタンを押下するだけで容易に Public URL を付加する事ができますが、CLI では下記のコマンドを実行することで Public からアクセス可能な URL を作成できます。
$ az spring-cloud app update \ -n $SPRING_CLOUD_APP_NAME \ -s $SPRING_CLOUD_SVC_NAME \ -g $RESOURCE_GROUP \ --is-public true
作成された URL を確認するために、下記のコマンドを実行してください。”url” の行に URL が表示されます。
$ az spring-cloud app show \ -n $SPRING_CLOUD_APP_NAME \ -s $SPRING_CLOUD_SVC_NAME \ -g $RESOURCE_GROUP ........ (中略) "url": "https://spring-cloud-services-******-********-***.azuremicroservices.io" }, "resourceGroup": "Spring-Cloud-Env", "type": "Microsoft.AppPlatform/Spring/apps" }
14. 動作確認
上記の URL に対して curl コマンド、もしくは Web ブラウザを利用してアクセスしてみてください。
$ curl https://spring-cloud-services-******-********-***.azuremicroservices.io/cats
15. 新バージョンをステージングへデプロイ
上記で一通りアプリケーションのデプロイはできるようになりましたが、さらにアプリケーションを更新して、Blue-Green デプロイの機能も試してみましょう。
アプリケーションの一部を更新して新バージョンを作成します。
ここではわかりやすくするため、デザインを変更してみましょう。index.html を開き、CSS を “old-design.css” から “new-design.css” に修正して、さらに <H1>Hello Java<H1> の行も追加します。
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> <head> <title>Springboot</title> <meta charset="utf-8" /> <link th:href="@{/css/new-design.css}" rel="stylesheet" type="text/css"></link> </head> <body> <H1>Hello Java</H1>
編集が終わったのち、新しいバージョンを作るために再度 mvn コマンドでソースコードをビルドします。
$ mvn clean package -DskipTests
今回は、アプリケーションを Staging 環境にデプロイするため、下記のコマンドを実行します。–name で新規バージョンにつける名前を指定します。
(ご注意:上記で実行した az spring-cloud app deploy コマンドとは違います)
$ az spring-cloud app deployment create \ -s $SPRING_CLOUD_SVC_NAME \ -g $RESOURCE_GROUP \ --name $SPRING_CLOUD_APP_NEW_VERSION_NAME \ --version 2 \ --app $SPRING_CLOUD_APP_NAME \ --jar-path target/demo-0.0.1-SNAPSHOT.jar
16. 本番とステージングのアプリの入れ替え
上記で、Staging 環境に新しいバージョンがデプロイされましたが、新バージョンを本番環境に適用するためには、旧バージョンから新バージョンにリクエストの振り先を変える必要があります。そこで、振り先を新バージョンに変更するために下記のコマンドを実行してください。
$ az spring-cloud app set-deployment \ --deployment $SPRING_CLOUD_APP_NEW_VERSION_NAME \ --name $SPRING_CLOUD_APP_NAME \ -s $SPRING_CLOUD_SVC_NAME \ -g $RESOURCE_GROUP
このようにして簡単にバージョンの切り替えも可能です。
17. GitHub Actions による CI/CD
さらに、下記にのような GitHub Actions のワークフローを作成(.github/workflows/main.yaml)することで、GitHub に対してソースコードを Push する度に、ソースコードのビルドからデプロイまでを自動化することもできます。
このワークフローを作成する上で注意したポイントは、Staging にすでにアプリケーションがデプロイされている場合、上書きできずエラーになるため、一旦既存のデプロイ済みのアプリケーションを削除して追加しています。また、ソースコードリビジョンとデプロイ名を一致させるために、環境変数に Git のリビジョン番号などを代入し、それを名前に付加するようにしています。
name: Build and deploy on Azure Spring Cloud on: [push] jobs: build-and-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: Set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Get Year Month Day run: echo ::set-env name=DATE::$(date '+%Y%m%d-%H%M%S') - name: Get the Git Revision Number run: echo ::set-env name=GIT_SHORT_VERSION::$(git rev-parse --short HEAD) - name: Build with Maven run: mvn package -DskipTests -Pcloud - name: Login to Azure Spring Cloud uses: azure/actions/login@v1 with: creds: ${{ secrets.AZURE_CREDENTIALS }} - name: Install Azure Spring Cloud extension run: az extension add -y --source https://azureclitemp.blob.core.windows.net/spring-cloud/spring_cloud-0.1.0-py2.py3-none-any.whl - name: Get Un Active Service Name run: echo ::set-env name=UNACTIVE_SERVICE::$(az spring-cloud app deployment list -g Spring-Cloud-Services -s spring-cloud-services-jp --app petstore-app -o json | jq -c '.[]| [.name, .properties.active]' | grep false | awk -F'["]' '{print $2}') - name: Delete UnActive Service run: az spring-cloud app deployment delete -n ${{env.UNACTIVE_SERVICE}} -g Spring-Cloud-Services -s spring-cloud-services-jp --app petstore-app - name: Deploy to Azure Spring Cloud run: az spring-cloud app deployment create -g Spring-Cloud-Services -s spring-cloud-services-jp --name green-${{env.DATE}}-${{env.GIT_SHORT_VERSION}} --version ${{env.DATE}}-${{env.GIT_SHORT_VERSION}} --app petstore-app --jar-path target/demo-0.0.1-SNAPSHOT.jar
以上、で GUI でデモした内容とほぼ同等の内容を CLI だけで実施しましたが、自動化設定を行う際には本内容が必要になる場合もあるかと想定します。本エントリを少しでもお役に立てていただければ誠に幸いです。
その他の参考情報
Azure Spring Cloud は 2019 年 10 月に発表されたばかりのサービスで、現時点ではまだ Preview 版になります。しかしながら現状でも便利な機能が含まれるため、ぜひ多くの皆様にお試しいただければ誠に幸いです。また、本紙の都合上取り上げなかった機能に関しても下記のようなドキュメントから参照していただく事ができます。
Azure Spring Cloud
Azure Spring Cloud のドキュメント
その他 Spring on Azure に関する情報
Azure Spring Cloud のご紹介
また、Microsoft MVP である@setoazusaさんも、12/19 に「Azure Spring CloudでBlue-Green Deploy」というエントリーを投稿してくださっているようです。こちらも合わせてご覧ください。
さいごに
Azure Spring Cloud の正式リリース(GA) は来年 2020 年の Q2 あたりを予定しています。ご興味のある方はぜひ、お早めにお試しいただきぜひ使用感に関してフィードバックをいただければ誠に幸いです。
より多くのフィードバックをいただき改善していくことでさらに良くなってまいりますので、ぜひ多くの皆様お試しください。
ご協力のほどどうぞよろしくお願いします。
JAPAN CONTAINERDAYS v18.12 での発表について
先日 JAPAN CONTAINERDAYS v18.12 に参加し 「40 Topic of Kubernetes in 40 Minutes」 という内容で 40 個の Kubernetes に関するトピックを 40 分でご紹介する内容を発表させていただきました。
1-16 のトピックについては当日はデモをしながら説明をしたのですが、参加してくださった方のお一人が具体的に私がどのようなデモをしたのかをまとめてくださっていました。(誠にありがとうございます。)
Topic 1-16 のまとめ記事はコチラ。
Container Days × kubernetes(k8s) × 「40 topic of kubernetes in 40 minutes」メモ
今回の私の発表内容には賛否両論があるかと思いますが、この内容は、2018 年 12 月の現時点で、私が私のお客様に対してお伝えする、Kubernetes(k8s) を本番環境に対して適用する際の注意ポイントをまとめた内容です。
まず、私の立ち位置を簡単にご紹介しますと、私は k8s の製品営業でも k8s の担当エンジニアでもございません。k8s の良さを理解しつつ、正しい所で正しく使っていただきたいと思っているエンジニアです。もし、提供するサービスが k8s にあっていなければ、違う方法を選択したほうが良いですよと私のお客様には言っています。そして、それによって扱うエンジニアが幸せになり、企業もより良いサービスを素早く提供していただきたいと考えています。
余談ですが、実話としてあるお客様から以前こんなご相談を受けました。
相談者:「寺田さん、御社では無い方からこのような事を言われまして」
某営業さん:「このシステムを将来的にコンテナ化し k8s を導入しないと駄目だ!将来がなくなる」
相談者:「えっ?えっ?」
相談者:「寺田さん、本当なんですか?」
寺田:「どのようなシステムなんですか?」
相談者:「こんなシステムで、今はこのような開発人員構成です」
寺田:「それなら、無理にしなくていいです」
最初に話を伺った際に、マジかこの営業?お客様を地獄の底に連れて行きたいのか?と思ったくらいでした。
k8s は確かに素晴らしいので、上手く使いこなせばとても大きな効果を得られます。しかし、扱い方を間違えると効果が得られないばかりでなく、余計管理コストは高くつき大変な思いをすることにもなるでしょう。
今回のイベント会場の懇親会会場でも別の方から、下記のようなご質問をいただきました。
「エンドのお客様がコンテナ化や k8s 化に期待しており、会社としてやらなければならないのだが、上司から今までと作り方もやり方は変えられない。」
寺田:「いえ、それコンテナ化してもメリット無いですよ!」
このようなやりとりは、今の日本に少なからずあると思うのです。k8s を導入したらそれだけで幸せになれると思っているのでしょうか?
まず、その場合に私が最初にお伺いするのは下記のような内容です。
「サービスは今後どのように成長して行きますか?」
「もっというならば、新機能の追加は今後数多くありますか?」
「作ったサービスの改良やバージョンアップは頻繁にありますか?」
共に YES ならば k8s を検討し始めても良いですし、そうでなければ違う道を模索して良いと思います。
実は、このセッションは私の、k8s を扱うまでの三部作シリーズの3本目のコンテンツになります。
1. 今後の開発ビジョン
2. Java on Kuberenetes on Azure
3. 40 Topic of Kuberenetes in 40 Minutes
1 に関しては、Kubernetesは銀の弾丸ではない――エンジニアが生き残るために必要な技術とは【デブサミ2018 関西】に発表内容がまとめられていますので、こちらをご参考にいただければと思います。k8s を扱うその前に、心構えであるとかバックグラウンドを説明したのがこちらです。
ポイントは、「どのような時に、そして何のために k8s を使うのか?」を考える事がとても重要だと言う事です。
実際に k8s を扱うにしても、出来る事は数多くあります、その際、この機能は必要?別のほうが簡単じゃない?管理が楽になるんじゃ無い?と思うならば、率先して違う手段も考えるのも良いと思います。いや、それでも k8s のここが便利だから使って、いち早くサービスを提供・展開したいと思って初めて、k8s を扱う土俵に立てるのだと思います。
こうした背景を踏まえて、三部作の3つ目として作成したのが今回のコンテンツでした。特に 26-33 の項目は、おそらく今まで誰も表立って触れてこなかった内容だと思いますので、あえてこの場を借りて発表しました。
時間の関係上、セッション中でも詳しい点をお伝えできなかった所もあるので、ここで真意も含めて共有したいと思いますが、長くなるので別エントリに分けます。
本エントリの続きはこちら
● 第2弾:Kubernetes を本番環境に適用するための Tips
最近の Microsoft の Java 事情とインタビュー記事の日本語化
はじめに:最近の Microsoft における Java について
この記事の本題に入る前に、マイクロソフトの Java 活動にとって、とても嬉しい情報を共有いたします。私が入社したのは約2年半前になります。その際私以外にグローバルで Java on Azure に関する啓蒙活動をしている方は一人 (Brian Benz) しかいませんでした。そして私の入社から2年半を経て、この直近数ヶ月の間に 3 人もの Java 関連の方々がマイクロソフトに入社してきてくださいました。その内二人は元オラクルで、一人は、TomEE を提供する Tomitribe から入ってきてくださいました。
Bruno Borges (Developer Advocate)
Jonathan Giles (Developer Advocate)
Theresa Nguyen (Sr. Product Marketing Manager)
この中で、Bruno Borges は去年の JavaOne San Francisco で基調講演にも登壇したブラジル人で、オラクル時代から Java のコミュニティとの関係が強く、様々なカンファレンスなどで登壇しています。一時期ブラジルにいる頃 Java EE エバンジェリストをしていたこともあったように記憶しています。そして彼はマイクロソフトで Java の Developer Advocate チームを率いるという話を聞いています。
また、Jonathan は私同様 Sun Microsystems 出身で、彼はエンジニアリングチームに所属し、JavaOne のコンテンツ選定委員 (CFP で応募されたコンテンツを選定する側) を務めたり、JavaOne の優秀なスピーカーにだけ与えられる称号 Java Rock Star の称号も持っています。さらに昨年 Duke’s Choice Award なども受賞している、ガチの Java エンジニアです。
最後に、Java 専門のプロダクトマネージャとして最近入社されたのは、TomEE (Tomcat をベースとした Java EE コンテナ) を提供する Tomitribeで Vice President を務めていた方が入社してきてくださいました。
いずれの方も、グローバルでは Java 開発者コミュニティーから認知度の高い、Java コミュニティに精通する方ばかりです。Jonathan はJava SDK の API 実装においても Java らしい実装のレビューなどに多大な貢献が期待されますし、Bruno にはグローバルの Java コミュニティに対して、幅広くコンタクトしてくれると思いますので、ますます Java on Azure の拡大に期待が持てる、そんなハイアリングとなりました。前述した Brian と共に、この 4 名と一緒に Java on Azure の啓蒙活動を続けていく事をとても楽しみにしています。
下記のエントリの内容は、先日上記の Jonathan Giles からインタビューを受けましたので、インタビュー内容 (オリジナルの英語) を日本語化した内容を記載します。
Jonathan Giles からのインタビューの日本語訳
今日から Azure で Java を利用、または開発している方々とのインタビューシリーズを開始しています。 すでに他にも何名ものインタビューを企画しているため、これをシリーズ化したいと考えています。私からインタビューを受けたい方は、私にご連絡ください。
最初のインタビューは、Java チャンピオンであり、JUG リーダーでもある寺田 佳央さんです。彼は日本マイクロソフトで働く Java エバンジェリストで、私と彼は Sun Microsystems と Oracle で共に働いていたので、以前から彼の事を知っていました。 寺田さんは Java に長くそして深く関わっていますので、彼とのインタビューを喜んでいます。どうぞ読者の皆様もお楽しみください。
こんにちは寺田さん – みなさんに自己紹介をしていただけないでしょうか?
このような素晴らしい機会を与えていただきありがとうございます。 私は 2015年7月から日本 マイクロソフト でJava Evangelist として働いています。また Japan Java Users Group の幹事メンバーの一人でもあります。
マイクロソフトに入社する前は、日本 Sun Microsystems で GlassFish エバンジェリストとして働いていました。 Oracle による Sun の買収後、日本 Oracle で Java/Java EE のエバンジェリストとして5年間働いていました。 日本 Oracle での私の仕事は、JavaOne Tokyo、Java Day Day Tokyo、Java ユーザーズ・グループのイベントなど、日本の多くの Java 関連のイベントで、企画、運営・管理、登壇などをしていました。そして、マイクロソフト入社後 2016 年 7 月、私は Java チャンピオンになりました。
あなたはしばらくの間マイクロソフトで勤めているんですね。私はちょうど 12 月にマイクロソフトに入社したばかりなので、私よりもとても長いですね。私たちは二人とも比較的にた経歴を持っています。私もSun Microsystems と Oracle で勤めていましたが、私は開発のエンジニアリング・チームに所属していました。
私はあなたにマイクロソフトにおける Java の印象について聞きたいです。そして Java に関して時間がたつにつれてマイクロソフトがどのように変わったのか教えていただけないでしょうか?
マイクロソフト入社前、私の経歴が Unix と Java に携わる事が多かったため、マイクロソフトで働くことを全く想像していませんでした。しかし、現在マイクロソフトはクラウドプラットフォームの企業になっています。そこで .NET や Windows、Office 製品だけでなく、Unix やその他のプログラミング言語も強く推進しています。 すでに Azure のシステムの 30% 以上が Linux 上で稼働しており、これらのシステムでは多くの顧客が Azure 上で Java を使用しています 。 たとえば、 Pivotal Cloud Foundry、Service Farbric、OpenShift、Kubernetes などがあります。Java 開発者が Azure でサービスを実行するための選択肢はたくさんあります 。
日本を拠点とするマイクロソフトのJavaエバンジェリストとしての日々どのような事をされているのですか?
最近は、Java のエバンジェリストとして、お客様のために多くの HackFest を開催しています。HackFest ではお客様が実際にビジネスをされている上でかかえる課題について直接改善してまいります。 お客様と NDA を締結した上で、お客様のソースコードにアクセスし、改善のためのアドバイスや直接ソースコードを編集する事もあります。いままでの経験を活かして、Azure におけるシステム運用方法や、アーキテクチャ設計に関するアドバイスなどを行います。
たとえば、最近ハックフェストを実施したとあるお客様では、オンプレミスで運用されている既存の Java Web アプリケーションを Azure 上のコンテナに移行したいと考えていらっしゃいました。当初、お客様は Kubernetes についてよくご存知ではなかったのですが、 HackFest を通じて Azure Container Service (AKS) の構築方法や、操作方法について情報を提供し、結果として、わずか5日間で既存のシステムを AKS に移行することができました。2日間で Lift & Shift し、残りの 3 日間で、ソースコードに手を加え、例えば Serverless の Azure Functions 等も試され、アプリケーションのモダナイズを行いました。HackFest では開発の視点だけでなく、運用的な観点からも助言しています。 その結果、そのお客様はこの HackFest の成果に非常に満足されていました。
この HackFest は、Azure をご利用される世界中の Java 開発者も利用できます。 読者のみなさまの中で Azure 上で Java を利用し、それを有効活用したい、そのために私のような Java エバンジェリストと緊密に会話したい場合は、私に連絡するか、各国に存在するエバンジェリストに HackFest についてお問い合わせください(※ 実際には HackFest を実施するためには利用可能なテクノロジー領域に条件があります)。 また私自身、マイクロソフトのグローバル組織に所属していますので、HackFest への参加のご要望をいただいた場合、国を問わず、北米、ヨーロッパ、ブラジルなど世界中のさまざまな場所に参加できるかもしれません。
Azure は Java(または Kotlin、Scala などの JVM 上の言語)を基盤とする開発者や組織に適していますか?
はい、Azure は Java 開発者にとって適しています。多くのサービスで Java SDK が用意され、開発は頻繁に行われています。 また一部のサービスでは SDK が存在しないものもありますが、Azure では多くのサービスが RESTful インターフェイスを提供しているため、任意のプログラミング言語からこれらのサービスにアクセスできるようになっています。たとえば、Office 365 をご利用されている場合は、REST 呼び出しで Office 365 を操作することも可能です。
おそらく、マイクロソフトであなたはいくつかのクールなデモやチュートリアルを時間をかけて作成してきたと思います。読者が興味をもちそうなプロジェクトや GitHub のレポジトリについてご紹介いただけないでしょうか?
すべてのデモやプロジェクトを公開しているわけではありませんが、私は GitHub リポジトリに多くのデモとサンプルをアップロードしています。
最新のデモには、多くの面白い最新技術を含んでいます(スライドはこちら)。 1回のデモに含めた Azure の技術要素として下記を含んでいます。
- Bot Framework (詳細: Microsoft Bot Service)
- LUIS (詳細:Language Understanding (LUIS) )
- Microsoft Translator (詳細: Microsoft Translator)
- Azure Functions for Java (詳細: Azure Functions for Java)
- Kubernetes (AKS) on Azure
Azure の Bot Framework を利用して Slack からメッセージの送受信を行うチャット・ボットを作成しています。このチャット・ボットの処理の実装には、Serverless の「Azure Functions for Java」を利用しています。Slack から k8s の「アカウントサービスのポッド数を増やしてください」という質問を投げかけると、Azure Functions は LUIS を呼び出して、文を解析しどの意図(入力内容を判定)が最も適切かを判断します。その結果、Kubernetes 上で稼働するアカウントサービスのポッド数を増やします。
仮に「顧客サービスのポッド数を減らしてください」と入力すると、Kubernetes の「顧客サービス」は減少します。 このように、私はチャットボットから Azure のKubernetes を操作できるようにしています。
さらに Microsoft Translator のデモも行なっています。上記のチャット・ボットではテキストでの入力を行いましたが、このデモでは音声入力を行います。 たとえば、Microsoft Translator に対して「アカウントサービスのポッド数を増やしてください」または「顧客サービスのポッド数を減らしてください」と言葉で語りかけると、Azure 上の Kubernetes のポッド数が増減します。
上記のすべてを Java で実装し、Java 開発者が利用できる多くの Azure サービスを利用しています。
エバンジェリスト(または私のようなクラウド・デベロッパー・アドボケイト)は、開発者や利用者などとの対外的な会話と、社内開発チームとの会話のバランスをとることが重要です。 私はすべてのデベロッパー・アドボケイトがこの範囲で異なる優先順位を持っていると思います。私自身は、ドキュメント、APIの改善など、開発者の経験を向上させることに重点を置いています。あなたは、この範囲においてどこに優先順位を置いて仕事をなさっていますか?
私は開発者やお客様と直接会話をするのが好きです。もちろん、私は API を変更したりドキュメントを改善する必要がある場所を見つけることが多いので、必要に応じてやっています。ただ、まだ多くのお客様が CI/CD、マイクロサービス、Cognitive Services、Azure Functions、Microsoft Translator、IoT、PowerBI などの利点についてご存知ないので、これらの技術を Java 開発者の皆様やお客様にその利点や利用方法や実装方法について紹介していきたいです。
昨今 Azure は非常に多くのサービスを提供し、その多くは本当に素晴らしいサービスです。 あなたが今より詳細に調査していることは特にありますか、全体的にあなたの好きなサービスは何ですか?
これはとても難しい質問です。なぜなら、マイクロソフトの技術と世界的な技術トレンドは以前と比べとても速く変化しているためです。 ちょうど今私が上で紹介したデモンストレーションは、現時点で私が好きな、そしてお勧めの技術から構成しています しかし、上記に取り上げた Kubernetes だけでなく、Pivotal Cloud Foundry とOpenshift も非常に面白いです。
特に、お客様が巨大なデータセンターを所有されている場合は、 Azure Stack の利用をご検討いただくことをお勧めします。Pivotal Cloud Foundry も Azure Stack 上で動作します。運用における管理コストを削減したい場合、Azure Stack は選択肢の 1 つになります。
マイクロソフトは歴史的に Java の非サポートで知られていますが、最近はマイクロソフトが真にオープンソースに舵をきり大きな進歩を遂げたと思います。Java エンジニアと会話をしてAzure を紹介するとき、参加者の皆様の印象は如何でしょうか?
約2年半前、私は日本マイクロソフトに加わりました。当時すでに一部の開発者やエンジニアの中で、マイクロソフトの変化に気づいている方がいらっしゃいました。 しかしこの2年間で、私はマイクロソフトの印象がさらに変化していると感じています。私はお客様やコミュニティのメンバーとコミュニケーションをとるとき、ほとんどの人から肯定的なフィードバックをいただいています。
特に、AI 技術の観点でマイクロソフトについて多くの肯定的なフィードバックをいただいています。 build 2016 のカンファレンスで AI プロトタイプを発表したSatya Nadella の発表を見たとき、私は本当に感銘を受け、私の周りのすべてのJava開発者にビデオを共有しました。このビデオは、我々が将来を想像すると、エンジニアが世界を変える方法を示しました。本当に素晴らしい内容でした!Cognitive Services のすべてを Java アプリケーションから利用できることも重要です。
初めて他のエンジニアに Cognitive Services のデモンストレーションを行った際、多くの開発者が私もこれを試したいと言いました。 私はこの技術が世界を変えることができると思っていましたが、この技術が会社の将来をも変えることができると私は考えました。
インタビューのお時間をとっていただきありがとうございました。最後に、他にコミュニティの皆様にメッセージがあれば頂けないでしょうか?
私は過去2年間、マイクロソフトで働いており、多くのツール、テクノロジ、サービスが Java 開発者にとって利用できることを理解してきました。たとえばプログラマの皆様にとっては、Visual Studio Team Services(VSTS)はソースコード管理や運用を行うために、ぜひご利用いただきたいサービスです。CI/CD におけるビルドとデプロイのパイプラインを使用することができます。もちろん開発チームに応じて Jenkins のような他の CI/CDツール をご利用されたい場合もあるでしょう、この場合にも、VSTSからそれらのツールにアクセスできるようになっています。
またコンテナ技術をご利用されたい場合は、Web App for Container, Azure Container Service(AKS)、Azure Container Instance(ACI)、 Pivotal Cloud Foundry、OpenShift などのご利用のニーズに応じてコンテナ環境を構築できます。さらに、IoT、BigData、NoSQLなどをご利用したい場合は、マイクロソフトは、それらのサービスを提供しています。
私は、エンジニアが想像することができれば、エンジニアが世界を変えることができると信じています!そして私は、そのような素晴らしい Java の開発者の皆様とともに時間を過ごしたいと思います。 私は Java が大好きです!
Azure Functions for Java Preview Release
この度、San Francisco で開催された JavaOne 2017 で、Microsoft は Azure Functions の Java 版を Preview 版として公開しました。本エントリーでは、ちょとだけ試してみましたので、その内容をご紹介します。
Mac OS/X の環境で Azure Functions を動作させるためには下記の環境が必要です。環境が整っていない場合、インストール・実行が正しくできない場合があります。必要な環境にご注意ください。
- OS X 10.12 or latest
- Java SE Development Kit 8 Downloads
- Azure CLI
- Apache Maven, version 3.0 or above.
- .NET Core, latest version.
- Node.js, version 8.6 or higher.
Azure Functions のローカル実行環境のインストール
Local Execution Environment Install
$ sudo npm i -g azure-functions-core-tools@core --unsafe-perm Password: > azure-functions-core-tools@2.0.1-beta.18 uninstall /Users/tyoshio2002/.nodebrew/node/v8.6.0/lib/node_modules/azure-functions-core-tools > node lib/uninstall.js deleting /Users/tyoshio2002/.azurefunctions/bin /Users/tyoshio2002/.nodebrew/node/v8.6.0/bin/func -> /Users/tyoshio2002/.nodebrew/node/v8.6.0/lib/node_modules/azure-functions-core-tools/lib/main.js /Users/tyoshio2002/.nodebrew/node/v8.6.0/bin/azfun -> /Users/tyoshio2002/.nodebrew/node/v8.6.0/lib/node_modules/azure-functions-core-tools/lib/main.js /Users/tyoshio2002/.nodebrew/node/v8.6.0/bin/azurefunctions -> /Users/tyoshio2002/.nodebrew/node/v8.6.0/lib/node_modules/azure-functions-core-tools/lib/main.js > azure-functions-core-tools@2.0.1-beta.18 postinstall /Users/tyoshio2002/.nodebrew/node/v8.6.0/lib/node_modules/azure-functions-core-tools > node lib/install.js + azure-functions-core-tools@2.0.1-beta.18 updated 1 package in 112.93s
次に、Maven コマンドで Azure Functions のプロジェクトを作成します。
$ mvn archetype:generate -DgroupId=com.yoshio3 -DinteractiveMode=false -DartifactId=AzureFunctionTest Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Maven Stub Project (No POM) 1 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] >>> maven-archetype-plugin:2.4:generate (default-cli) > generate-sources @ standalone-pom >>> [INFO] [INFO] <<< maven-archetype-plugin:2.4:generate (default-cli) < generate-sources @ standalone-pom <<< [INFO] [INFO] [INFO] --- maven-archetype-plugin:2.4:generate (default-cli) @ standalone-pom --- [INFO] Generating project in Batch mode [INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0) [INFO] ---------------------------------------------------------------------------- [INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0 [INFO] ---------------------------------------------------------------------------- [INFO] Parameter: basedir, Value: /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test2 [INFO] Parameter: package, Value: com.yoshio3 [INFO] Parameter: groupId, Value: com.yoshio3 [INFO] Parameter: artifactId, Value: AzureFunctionTest [INFO] Parameter: packageName, Value: com.yoshio3 [INFO] Parameter: version, Value: 1.0-SNAPSHOT [INFO] project created from Old (1.x) Archetype in dir: /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test2/AzureFunctionTest [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 6.258 s [INFO] Finished at: 2017-10-28T13:24:07+09:00 [INFO] Final Memory: 15M/223M [INFO] ------------------------------------------------------------------------
プロンプト無しで Maven プロジェクトを作成したい場合の実行例:
mvn archetype:generate -DinteractiveMode=false -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DgroupId=com.yoshio3 -DartifactId=Java-Azure-Functions -Dversion=1.0-SNAPSHOT -Dpackage=com.yoshio3 -DappName=Java-Azure-Functions -DappRegion=westus2
デフォルトで Hello World のコードが生成されます。
package yoshio3.com; import com.microsoft.azure.serverless.functions.annotation.*; import com.microsoft.azure.serverless.functions.ExecutionContext; import java.util.logging.Level; /** * Hello function with HTTP Trigger. */ public class Function { @FunctionName("hello") public String hello(@HttpTrigger(name = "req", methods = {"get", "post"}, authLevel = AuthorizationLevel.ANONYMOUS) String req, ExecutionContext context) { return String.format("Hello, %s!", req); }
このサンプル・コードをビルドします。
$ mvn clean package Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Azure Java Functions 1.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ azure-functions-test --- [INFO] Deleting /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target [INFO] [INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ azure-functions-test --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/src/main/resources [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ azure-functions-test --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/classes [INFO] [INFO] --- maven-resources-plugin:3.0.2:testResources (default-testResources) @ azure-functions-test --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/src/test/resources [INFO] [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ azure-functions-test --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/test-classes [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ azure-functions-test --- [INFO] Surefire report directory: /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 Running yoshio3.com.FunctionTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.117 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ azure-functions-test --- [INFO] Building jar: /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions-test-1.0-SNAPSHOT.jar [INFO] [INFO] --- azure-functions-maven-plugin:0.1.4:package (package-functions) @ azure-functions-test --- AI: INFO 06-10-2017 12:00, 1: Configuration file has been successfully found as resource AI: INFO 06-10-2017 12:00, 1: Configuration file has been successfully found as resource [INFO] [INFO] Step 1 of 6: Searching for Azure Function entry points [INFO] Reflections took 101 ms to scan 1 urls, producing 1 keys and 2 values [INFO] 2 Azure Function entry point(s) found. [INFO] [INFO] Step 2 of 6: Generating Azure Function configurations [INFO] Generation done. [INFO] [INFO] Step 3 of 6: Validating generated configurations [INFO] Validation done. [INFO] [INFO] Step 4 of 6: Saving empty host.json [INFO] Successfully saved to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java/host.json [INFO] [INFO] Step 5 of 6: Saving configurations to function.json [INFO] Starting processing function: Timer [INFO] Successfully saved to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java/Timer/function.json [INFO] Starting processing function: hello [INFO] Successfully saved to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java/hello/function.json [INFO] [INFO] Step 6 of 6: Copying JARs to staging directory /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 1 resource to /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java [INFO] Copied successfully. [INFO] Successfully built Azure Functions. [INFO] [INFO] --- maven-resources-plugin:3.0.2:copy-resources (copy-resources) @ azure-functions-test --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 2 resources [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 33.243 s [INFO] Finished at: 2017-10-06T12:01:07-07:00 [INFO] Final Memory: 39M/564M [INFO] ------------------------------------------------------------------------
ローカルで実行します。
$ mvn azure-functions:run Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Azure Java Functions 1.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- azure-functions-maven-plugin:0.1.4:run (default-cli) @ azure-functions-test --- AI: INFO 06-10-2017 09:13, 1: Configuration file has been successfully found as resource AI: INFO 06-10-2017 09:14, 1: Configuration file has been successfully found as resource [INFO] Azure Functions stage directory found at: /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java [INFO] Azure Functions Core Tools found. [INFO] Starting running Azure Functions... %%%%%% %%%%%% @ %%%%%% @ @@ %%%%%% @@ @@@ %%%%%%%%%%% @@@ @@ %%%%%%%%%% @@ @@ %%%% @@ @@ %%% @@ @@ %% @@ %% % [2017/10/06 16:14:30] Reading host configuration file '/Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java/host.json' [2017/10/06 16:14:31] Host configuration file read: [2017/10/06 16:14:31] { [2017/10/06 16:14:31] } [2017/10/06 16:14:31] info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0] Start Process: /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/bin/java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 "/Users/tyoshio2002/.azurefunctions/bin/workers/Java/azure-functions-java-worker.jar" --host 127.0.0.1 --port 56034 --workerId c26685f3-cbd5-4bff-bbea-d3e9e00d08ed --requestId 4270cbeb-361f-422a-872a-c0ec946199c5 [2017/10/06 16:14:32] Generating 1 job function(s) info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0] Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 [2017/10/06 16:14:32] Starting Host (HostId=yoshionomacbookpro-1392184404, Version=2.0.11308.0, ProcessId=65522, Debug=False, Attempt=0) Listening on http://localhost:7071/ Hit CTRL-C to exit... Http Functions: hello: http://localhost:7071/api/hello info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0] Listening for transport dt_socket at address: 5005 info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0] Microsoft Azure Functions Java Runtime [build 1.1-SNAPSHOT] [2017/10/06 16:14:32] Found the following functions: [2017/10/06 16:14:32] Host.Functions.hello [2017/10/06 16:14:32] [2017/10/06 16:14:32] Job host started info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0] [INFO] {com.microsoft.azure.webjobs.script.handler.MessageHandler.handle}: message generated by "class com.microsoft.azure.webjobs.script.rpc.messages.StartStream$Builder" info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0] Worker initialized info: Worker.Java.c26685f3-cbd5-4bff-bbea-d3e9e00d08ed[0] 94978bb8-3f21-47c7-961d-5d9caecc0136 - "/Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java/azure-functions-test-1.0-SNAPSHOT.jar"::"yoshio3.com.Function.hello" loaded [2017/10/06 16:16:27] Function started (Id=a529fffb-fd7b-43d4-bd53-3283808f68ce) [2017/10/06 16:16:27] Executing 'Functions.hello' (Reason='This function was programmatically called via the host APIs.', Id=a529fffb-fd7b-43d4-bd53-3283808f68ce) [2017/10/06 16:16:27] Function "94978bb8-3f21-47c7-961d-5d9caecc0136" executed [2017/10/06 16:16:27] Function completed (Success, Id=a529fffb-fd7b-43d4-bd53-3283808f68ce, Duration=444ms) [2017/10/06 16:16:27] Executed 'Functions.hello' (Succeeded, Id=a529fffb-fd7b-43d4-bd53-3283808f68ce)
起動が完了したら、curl コマンドなどでアクセスしてみてください。
$ curl http://localhost:7071/api/hello -d "Java World" Hello, Java World!
上記は、簡単な Hello World ですが他のトリガーを利用する場合は、下記のように local.settings.json ファイルに、AzureWebJobsStorage のアクセスキーを入力する必要があります。どうご注意ください。
local.settings.json { "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=fileup;AccountKey=*******;EndpointSuffix=core.windows.net", "AzureWebJobsDashboard": "" } }
たとえば、タイマーをトリガーに何らかの処理をしたい場合、下記のようなコードを書きます。
@FunctionName("Timer") public String functionHandler(@TimerTrigger(name = "timerInfo", schedule = "*/30 * * * * *") String timerInfo, final ExecutionContext executionContext) { executionContext.getLogger().log(Level.INFO, "Timer trigger input: {0}", timerInfo); return "From timer: \"" + timerInfo + "\""; }
ローカルで検証が終わったので、Microsoft Azure へデプロイします。
$ mvn azure-functions:deploy Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Azure Java Functions 1.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- azure-functions-maven-plugin:0.1.4:deploy (default-cli) @ azure-functions-test --- AI: INFO 06-10-2017 12:31, 1: Configuration file has been successfully found as resource AI: INFO 06-10-2017 12:31, 1: Configuration file has been successfully found as resource [INFO] Starting deploying to Function App function-test-java... [INFO] Authenticate with Azure CLI 2.0 [INFO] --> POST https://login.microsoftonline.com/********-****-****-****-**********/oauth2/token [INFO] 1178-byte body: client_id=04b07795******* [INFO] --> END POST [INFO] <-- 200 OK https://login.microsoftonline.com/72f988bf-86f1-41af-91ab-2d7cd011db47/oauth2/token (833 ms, 2907-byte body) [INFO] Cache-Control: no-cache, no-store [INFO] Content-Length: 2907 [INFO] Content-Type: application/json; charset=utf-8 [INFO] Date: Fri, 06 Oct 2017 19:31:31 GMT [INFO] Expires: -1 [INFO] P3P: CP="DSP CUR OTPi IND OTRi ONL FIN" [INFO] Pragma: no-cache [INFO] Server: Microsoft-IIS/8.5 [INFO] Set-Cookie: esctx=AQABAAAAAAABlDrqfEFlSaui6xnRjX5E6ugjSSC5bAEQSJ1V_VvTv2HB9o-5-******;; domain=.login.microsoftonline.com; path=/; secure; HttpOnly, x-ms-gateway-slice=004; path=/; secure; HttpOnly, stsservicecookie=ests; path=/; secure; HttpOnly [INFO] Strict-Transport-Security: max-age=31536000; includeSubDomains [INFO] X-Content-Type-Options: nosniff [INFO] x-ms-request-id: 4813f784-046f-414e-8d9e-29a4e43e3c00 [INFO] X-Powered-By: ASP.NET [INFO] 2907-byte body: {"token_type":"Bearer","scope":"user_impersonation","expires_in":"3599","ext_expires_in":"0","expires_on":"1507321891","not_before":"1507317991","resource":"https://management.core.windows.net/","access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IkhIQnlLVS0wRHFBcU1aaDZaRlBkMlZXYU90ZyIsImtpZCI6IkhIQnlLVS********* [INFO] <-- END HTTP [INFO] Target Function App does not exist. Creating a new Function App ... [INFO] Successfully created Function App function-test-java [INFO] [INFO] Step 1 of 4: Creating ZIP package... [INFO] Successfully saved ZIP package at /Users/tyoshio2002/NetBeansProjects/Azure-Function-Test1/azure-functions-test/target/azure-functions/function-test-java.zip [INFO] [INFO] Step 2 of 4: Uploading ZIP package to Azure Storage... [INFO] Successfully uploaded ZIP package to https://d0a43c4e4c4a435d9f25.blob.core.windows.net/java-functions-deployment-packages/function-test-java.20171006123210784.zip [INFO] [INFO] Step 3 of 4: Deploying Function App with package... [INFO] Azure Resource Manager read/write per hour limit reached. Will retry in: 5 seconds [INFO] Successfully deployed Function App with package. [INFO] [INFO] Step 4 of 4: Deleting deployment package from Azure Storage... [INFO] Successfully deleted deployment package function-test-java.20171006123210784.zip [INFO] Successfully deployed Function App at https://function-test-java.azurewebsites.net [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 02:01 min [INFO] Finished at: 2017-10-06T12:33:00-07:00 [INFO] Final Memory: 42M/488M [INFO] ------------------------------------------------------------------------
デプロイが完了したのち、Azure の Portal 画面を確認して正しくデプロイされている事、そしてアクセスするための URL を確認します。
Azure にデプロイした URL へアクセスしてみます。
$ curl https://function-test-java.azurewebsites.net/api/hello -d "Java World" Hello, Java World!
ローカルで実行したのと同様に、正しく実行する事ができました。
より詳細な情報は、Azure Functions Java developer guide
に記載されています。
ぜひ、みなさまお試しください!!
Microsoft Azure IoT Hub with Java
Microsoft Azure の IoT Hub が Java でも利用できるということで試しました。Microsoft Azure の IoT Hub に関する詳細な説明はこちらをご参照ください。
Azure IoT Hub とは
IoT Hub と Event Hubs の比較
私がはまったのは1点で、「Device ID」をどうやって作るかという点でしたが、そこも下記にくわしく手順を記載します。
1. 最初に、Microsoft Azure の管理ポータルにアクセスし、新規から IoT Hub を作成します。
Microsoft Azure の管理ポータルへアクセス
「参照 >」から「IoT Hub プレビュー」を選択します。
「新規」ボタンを押下すると、下記の画面が表示されますので「Name」に名前を入力し、利用する規模に応じて価格やプランを選択してください。
次に、リソース・グループ名を新規に作成し、ロケーションとして「東アジア」を選択し最後に「作成」ボタンを押下してください。
2. Windows 環境で DeviceExplorer をインストール
Azure IoT SDKsのサイトにアクセスし、DeviceExplorer のインストーラを入手してください。Windows 環境用に用意されている「SetupDeviceExplorer.msi」をダウンロードします (このリンクから入手できる版は 2015-11-30 版です、最新版はAzure IoT SDKsから入手してください)。
ファイルを入手後、入手したファイル(インストーラ)をクリックしてインストーラを起動してください。
次に、インストール場所や利用者を指定し「Next >」ボタンを押下します。
確認画面が表示されますので、「Next>」ボタンを押下します。
ユーザアカウント制御の確認画面が表示されますので、「はい(Y)」を押下してインストールをはじめてください。
インストールが完了すると下記の画面が表示されますので「Close」ボタンを押下してください。
インストールが完了すると Windows 10 の場合、メニューから「最新追加されたもの」の欄から実行できることを確認できます。
3. Device Explorer から Device ID と接続用文字列を作成
メニューから DeviceExplorer を起動してください。起動すると下記の画面が表示されます。
ここで、DeviceExplorer から Microsoft Azure の IoT Hub に接続し操作できるように、Azure 上で接続用の情報を確認し取得します。Microsoft Azure の管理ポータルに接続し、作成した IoT Hub のサービスを参照してください。
IoT Hub サービスを参照すると「Settings」というボタンがあるので押下します。
「Settings」ボタンを押下すると「Shared access policies」のリンクがあるので選択してください。
「Shared access policies」の POLICY から「iothubowner」を選択してください。
選択すると「Connection string—primary key」の欄があります。記載内容をクリップ・ボードへコピーできるようにコピー・ボタンが右端に用意されていますので、これをクリックしてコピーしてください。
クリップ・ボードへ文字列がコピーされると「コピー済み」と表示されます。
文字列をコピーしたのち、Device Explorer に戻り、文字列を貼り付けてください。
文字列をコピーしたのち、「Update」ボタンを押下してください。正しく設定が更新されると「Settings updated successfully」という画面が表示されます。
続いて、Device Explorer のタブから「Management」を選択し「Create」ボタンを押下してください。
ボタンを押すと、下記の画面が表示されますので、「Device ID」欄にデバイス固有の名前を入力し「Create」ボタンを押下してください。(Primary Key,Secondary Keyは自動的にキーの文字列が入力されています。)
ボタンを押下すると下記の画面が表示されますので「Done」ボタンを押下してください。
デバイス ID を作成すると一覧に1行が追加されます。ここで、追加された行をマウスで右クリックしてください。すると、選択メニューが表示されますので、「Copy connection string for selected device」を選択して接続用の文字列をコピーしてください。
コピーして作成された、接続用の文字列の例は下記のような文字列です。この文字列は後からのプログラム内で記述する必要があります。そこで、この文字列を一時的にテキストファイルなどに保管しておいてください。
HostName=HOSTNAME.azure-devices.net;DeviceId=DEVICE-ID;SharedAccessKey=Wf0o****************************************
※ 補足:Device Explorer の詳しい使い方は下記に記載されていますので、こちらもご確認ください。
How to use Device Explorer for IoT Hub devices
4. Microsoft Azure IoT Hub サンプルコードの作成
それでは、プログラムを組むための環境設定や準備が整いましたので、実際にプログラムを書いてみましょう。本サンプル・アプリケーションは、基本的にこちらに記載されている内容を実際に動作させた物です。
※ 本記事の目的は、IoT Hub の設定方法を説明するのがメインのため、コードの詳細にまでは触れず、MS 社員のどなたかが作成したコードをそのまま記載しています。しかし、この一連の設定ができると色々と面白いことができるので、まずは基本的な手順を理解してください。
Maven の pom ファイルは下記のようになります。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.yoshio3</groupId> <artifactId>Azure-IoT-Hub</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven-compiler-plugin-version>2.3.2</maven-compiler-plugin-version> </properties> <dependencies> <dependency> <groupId>com.microsoft.azure.iothub-java-client</groupId> <artifactId>iothub-java-client</artifactId> <version>1.0.0-preview.7</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.4.2</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> <configuration> <finalName>${project.artifactId}-${project.version}</finalName> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.6</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>com.yoshio3.Main</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> </project>
Java のサンプル・ソースコードはこちらになります。
package com.yoshio3; import com.microsoft.azure.iothub.DeviceClient; import com.microsoft.azure.iothub.IotHubClientProtocol; import com.microsoft.azure.iothub.Message; import com.microsoft.azure.iothub.IotHubStatusCode; import com.microsoft.azure.iothub.IotHubEventCallback; import com.microsoft.azure.iothub.IotHubMessageResult; import java.io.IOException; import java.net.URISyntaxException; import java.util.Scanner; public class Main { protected static class EventCallback implements IotHubEventCallback { @Override public void execute(IotHubStatusCode status, Object context) { Integer i = (Integer) context; System.out.println("IoT Hub responded to message " + i.toString() + " with status " + status.name()); } } protected static class MessageCallback implements com.microsoft.azure.iothub.MessageCallback { @Override public IotHubMessageResult execute(Message msg, Object context) { System.out.println( "Received message with content: " + new String(msg.getBytes(), Message.DEFAULT_IOTHUB_MESSAGE_CHARSET)); return IotHubMessageResult.COMPLETE; } } public static void main(String... args) throws IOException, URISyntaxException { //Device Explorer で作成してコピーした接続用の文字列をここに記載 String connString = "HostName=HOSTNAME.azure-devices.net;DeviceId=DEVICE-ID;SharedAccessKey=Wf0o****************************************"; IotHubClientProtocol protocol = IotHubClientProtocol.AMQPS; DeviceClient client = new DeviceClient(connString, protocol); MessageCallback messageCallback = new MessageCallback(); client.setMessageCallback(messageCallback, null); client.open(); for (int i = 0; i < 10; ++i) { String msgStr = "Event Message " + Integer.toString(i); try { Message msg = new Message(msgStr); msg.setProperty("messageCount", Integer.toString(i)); System.out.println(msgStr); EventCallback eventCallback = new EventCallback(); client.sendEventAsync(msg, eventCallback, i); } catch (Exception e) { e.printStackTrace(); } } System.out.println("Press any key to exit..."); Scanner scanner = new Scanner(System.in); scanner.nextLine(); client.close(); } }
念のため、Maven プロジェクトは Git Hub にもあげておきます。上記をベースに、Microsoft Azure IoT Hub Java Client 1.0.0-preview.7 API を参照しながらプログラムを作ってみてください。
5. デバイスでプログラム実行
プログラムをビルド後、下記のコマンドを IoT デバイス上で実行してください。
# java -jar Azure-IoT-Hub-1.0-SNAPSHOT.jar
実行すると、下記のようなメッセージが表示されます。
$ java -jar Azure-IoT-Hub-1.0-SNAPSHOT.jar Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 12 15, 2015 5:27:38 午後 org.apache.qpid.proton.engine.impl.ssl.SslEngineFacadeFactory getClass 警告: unable to load org.bouncycastle.openssl.PEMReader 12 15, 2015 5:27:38 午後 org.apache.qpid.proton.engine.impl.ssl.SslEngineFacadeFactory getClass 警告: unable to load org.bouncycastle.openssl.PasswordFinder 12 15, 2015 5:27:38 午後 org.apache.qpid.proton.engine.impl.ssl.SslEngineFacadeFactory 警告: unable to load bouncycastle provider Event Message 0 Event Message 1 Event Message 2 Event Message 3 Event Message 4 Event Message 5 Event Message 6 Event Message 7 Event Message 8 Event Message 9 Press any key to exit… IoT Hub responded to message 5 with status OK_EMPTY IoT Hub responded to message 4 with status OK_EMPTY IoT Hub responded to message 7 with status OK_EMPTY IoT Hub responded to message 2 with status OK_EMPTY IoT Hub responded to message 3 with status OK_EMPTY IoT Hub responded to message 6 with status OK_EMPTY IoT Hub responded to message 1 with status OK_EMPTY IoT Hub responded to message 9 with status OK_EMPTY IoT Hub responded to message 0 with status OK_EMPTY IoT Hub responded to message 8 with status OK_EMPTY |
参考:
Microsoft Azure IoT device SDK for Java
IoT Kit ハンズオン トレーニング 初めの一歩モノの接続からデータ分析まで by @embedded_george
最後に、今回は実戦的なアプリまでは作成しませんでしたが、上記をベースに Raspberry Pi や LEGO Mindstorms 上にプログラムを配置し、Azure 上にデータを配信したり、Azure から各種デバイスを操作したりできるようになりますね。
Let’s enjoy IoT with Java on Azure !!