ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

2017 年振り返り

今年も、しばやんさんが作った 2019 年の人気記事ランキング生成 を使わせてもらい、1年を振り返ってみます。

  1. ASP.NET でクライアントの IP アドレスを取得する
  2. ASP.NET Web API で multipart / form-data を使ってファイルをアップロードする
  3. HttpClient を使って同期で通信する
  4. ASP.NET MVC の Ajax 通信で例外を処理する
  5. ASP.NET MVC で JSON の一部として PartialView を返す方法
  6. プロキシ環境下で Web API を呼び出す
  7. Entity Framework Core 1.0 で SQLite を使ってみる
  8. ASP.NET Web API で返す JSON のプロパティを指定する
  9. Swagger 2.0 に対応した ASP.NET Web API のドキュメントを作成する
  10. Azure 上に Jenkins を使って CI 環境を構築する

ASP.NET 関連の記事が、多く読まれているようです。Azure の記事が少ないというか、今年に書いた記事がないですね・・・
続いて、2017 年に書いた記事だけを集計しました。

  1. Azure Container Service で Kubernetes を試してみた
  2. Azure Container Service の Kubernetes に YAML ファイルを使ってデプロイする
  3. Azure Container Service (AKS) を試してみた
  4. Azure Container Service の Kubernetes に ASP.NET Core アプリケーションをデプロイする
  5. Azure Container Service の Kubernetes にデプロイした Pod のデータを永続化する

仕事で Kubernetes を使っていることもあり、Azure Container Service の記事を書くことが多かったです。来年は、App Services for Container や Cosmos DB あたりを中心にもっと広く記事を書いていきたいです。

今年の出来事としては、1月に Microsoft MVP for Azure を受賞できたことが大きかったです。昨年転職して仕事が変わり、新しい技術やこれまで経験のなかった分野にチャレンジできました。前職からの仲間とも交流を続けながらも、MVP や新しい仕事で多くの方々と出会う機会に恵まれ、充実した1年だったと思います。

ただ、後半以降は仕事が忙しくなってしまい、コミュニティ活動というか個人の活動にあまり時間を取れませんでした。来年は、このあたりのバランスを改善していきたいです。

本年もお世話になりました。よい年をお迎えください。

Azure Container Service(AKS)にデプロイした Grafana で Azure のメトリクスを監視する

この記事は、Azure Advent Calendar 2017 の 10 日目 の記事です。
qiita.com
OSS のモニタリングツールである Grafana を使って、Azure のメトリクスを監視してみました。元ネタは、こちらのブログですが、Grafana を Azure Marketplace ではなく、Azure Container Service(AKS)にデプロイしました。

f:id:TonyTonyKun:20171210105722p:plain

Azure Container Service(AKS)を作成する

最近、Azure Portal からも AKS が作れるようになりました。公式ドキュメントの手順に従って、作成します。
docs.microsoft.com
AKS の作成が完了したら、Azure Cloud Shell を使って、AKS に接続するための資格情報を取得します。

$ az aks get-credentials --resource-group gooner1210 --name gooner1210
Merged "gooner1210" as current context in /home/hara/.kube/config

$ kubectl get nodes
NAME                       STATUS    ROLES     AGE       VERSION
aks-agentpool-63390745-0   Ready     agent     10m       v1.7.7
aks-agentpool-63390745-1   Ready     agent     10m       v1.7.7
aks-agentpool-63390745-2   Ready     agent     10m       v1.7.7

Grafanaをデプロイする

Helm のリポジトリで公開されている Grafana の Charts を使って、AKS にデプロイします。
まず、Helm をセットアップします。

$ helm init
HELM_HOME has been configured at /home/hara/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
Happy Helming!

Azure のメトリクスを取得するためには、Grafana のプラグインをインストールする必要があります。
grafana.com
Grafana のプラグインは、helm install コマンドのパラメータで指定できるので、次のようなコマンドでインストールできます。

$ helm install --name gf \
--set server.installPlugins=grafana-azure-monitor-datasource,\
server.adminPassword=admin,\
server.service.type=LoadBalancer,\
server.persistentVolume.storageClass=default \
stable/grafana

プラグイン以外のパラメータは、お好みで指定してください。

Parameter Value Description
server.installPlugins grafana-azure-monitor-datasource プラグイン名
server.adminPassword admin 管理者アカウント(admin)のパスワード
server.service.type LoadBalancer ダッシュボードを外部IPで公開
server.persistentVolume.storageClass default データをディスクに永続化

デプロイが完了したら、Grafana の External IP を確認します。

$ kubectl get svc
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
gf-grafana   LoadBalancer   10.0.210.171   52.179.12.156   80:31032/TCP   7m
kubernetes   ClusterIP      10.0.0.1       <none>          443/TCP        1h

ブラウザで Grafana の External IP にアクセスすると、ログイン画面が表示されます。

f:id:TonyTonyKun:20171210112709p:plain

Grafanaのデータソースを追加する

Grafana の add data source を選択して、Azure のメトリクスをデータソースとして登録します。

f:id:TonyTonyKun:20171210112728p:plain

任意の名前を入力して、Type で「Azure Monitor」を選択します。Azure Monitor API Details には、サブスクリプションIDとサービスプリンシパルを入力します。Application Insights Details はオプションなので、空欄のままで進めます。

Grafanaのダッシュボードを作成する

Grafana の New Dashboard を選択して、Azure のメトリクスを表示するダッシュボードを作成します。今回は Graph を使って、Azure Web Apps にデプロイされているアプリケーションのメトリクスを表示してみます。

f:id:TonyTonyKun:20171210112745p:plain

Panel Title の edit をクリックして、Metrics タブからメトリクスを取得するアプリケーションのリソースやメトリクスの種類を選択します。選択候補がプルダウンで表示されるので、簡単にダッシュボードを作成できます。

f:id:TonyTonyKun:20171210112807p:plain

2つのアプリケーションの CPU Time と AverageMemoryWorkingSet を 表示することができました。

まとめ

Grafana を使って、Azure のメトリクスを表示するダッシュボードを作成してみました。
このプラグインをインストールすると、Azure Monitor のほかに、Application Insights のメトリクスも取得できます。
Grafana のデータソースには、AWS の CloudWatch や OSS の Prometheus も指定できるので、Azure に限らず活用できる監視ツールだと思います。

書籍「はじめてのSpring Boot」の感想

これまで .NET を使って開発してきたのですが、仕事で Java を使う機会があったので、「はじめてのSpring Boot」を読みました。

どんな書籍なのか?

この書籍は、これから Spring Boot を学ぼうとしている初心者に向けた入門書です。
Spring Framework の DI やデータアクセスといった基礎から始まり、Spring Boot の良さを解説しながら、ステップバイステップで Web アプリケーションを構築できます。
Spring Boot は、公式ドキュメントが充実していますし、ネット上にも情報は山ほどありますが、体系的に日本語で学習できるところが良かったです。

  1. Spring Boot とは
  2. 速習 Spring Framework
  3. Spring Boot による Web アプリ開発
  4. PaaS 「Cloud Foundry」にデプロイ
  5. Spring Boot におけるテスト

書籍で解説するサンプルプログラムや誤植については、GitHub で公開されているため、すぐにアプリケーションを動かすこともできますし、コードのタイプミスで悩むこともないので安心です。
github.com

Spring Boot アプリケーションを Azure にデプロイする

この書籍では Cloud Foundry にデプロイする方法が紹介されていますが、ここでは Azure にデプロイしてみます。

Azure Web App にデプロイする

Azure Web App にデプロイするためには、Spring Boot アプリケーションを配布するための jar ファイルと Web.config が必要です。
まずは、Maven のコマンドで jar ファイルを作成します。

$ ./mvnw package

次に、jar ファイルのパスを設定した Web.config を作成します。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" />
    </handlers>
    <httpPlatform processPath="%JAVA_HOME%\bin\java.exe"
        arguments="-Djava.net.preferIPv4Stack=true -Dserver.port=%HTTP_PLATFORM_PORT% -jar &quot;%HOME%\site\wwwroot\demo-0.0.1-SNAPSHOT.jar&quot;">
    </httpPlatform>
  </system.webServer>
</configuration>

Azure ポータルから Advanced Tools(Kudu)を開いて、jar ファイルと Web.config を「d:¥home¥site¥wwwroot」にアップロードすれば、デプロイできます。

f:id:TonyTonyKun:20171130010224p:plain

Azure Web App for Containers にデプロイする

Azure Web App for Containers にデプロイするためには、Spring Boot アプリケーションをコンテナ化する必要があります。

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/helloworld-0.0.1-SNAPSHOT.jar app.jar
ENV JAVA_OPTS=""
EXPOSE 8080
ENTRYPOINT exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar

Dockerfile を作成し、Docker コマンドでビルドしたイメージを Docker Hub にプッシュしておきます。

$ docker build -t thara0402/sbapp:latest ./
$ docker push thara0402/sbapp:latest

Azure ポータルから Docker Container の画面で、プッシュした Docker イメージの URL を指定すれば、デプロイできます。

f:id:TonyTonyKun:20171130010248p:plain

まとめ

この書籍は、Java や .NET など何かしらの言語での開発経験があり、これから Spring Boot を学びたい人にお勧めできる内容です。
まずは、アプリケーションを作って感触をつかみ、そのあとに、書籍にでてくる用語を詳しく調べたり、Spring Boot の公式ドキュメントを利用して理解を深めていくのが良いと思います。