そこに仁義はあるのか(仮)

略してそこ仁!

Japan Tour in Summer: Java & k8s on Azure まつり に参加してきたよ!

Java女子部とJAZUG女子部のコラボのこちらのイベントに行ってきました〜!

javajo.doorkeeper.jp

イベントは午前の部と午後の部に別れていて、一日丸々参加もできましたが私は午後の部からの参加にしました。

  • 午前の部:コンテナとDockerについて
  • 午後の部:Kubernetesとは&AKSハンズオン

午後に到着した時点で6人程度のチームが4つ作られており、それぞれでチーム名が付いていました。
私は「足引っ張り隊」に合流。良いネーミングですね。笑


🖥 実施した内容

ハンズオンでは寺田さんがgithubで公開されているこちらのPDFに沿ってハンズオンを進めていきました。
k8s-Azure-Container-Service-AKS--on-Azure/HoL-Contents.pdf at master · yoshioterada/k8s-Azure-Container-Service-AKS--on-Azure · GitHub

自分の中で整理してみましたが、このような構成の構築と操作をしていきました。
f:id:syobochim:20190809170651p:plain

ハンズオンの後はこちらのスライドに沿って、Kubernetesを導入する場合の注意点を寺田さんからお話いただきました。

www.slideshare.net

✨ 印象的だったこと

😀 Docker Imageは小さく作ろう

Docker Imageをなるべく小さくするような工夫の紹介がありました。
例えば、「openjdk:-alpine」を利用するとコンテナイメージを小さくすることができます。
Docker Hub

また、Multi stage buildという機能も活用できます。
実際Multi stage buildを利用しているDockerfileはこちら。
https://github.com/yoshioterada/k8s-Azure-Container-Service-AKS--on-Azure/blob/master/FrontService/1-Dockerfile-Multi
1つのDockerfileにFROM句が2つ書かれていて、ビルド用と実行用のイメージを分けて書いています。

Multi stage buildについてはこの記事の説明がわかりやすかったです。
Docker multi stage buildで変わるDockerfileの常識 - Qiita

また、キャッシュを利用できるように、変更が多く入る箇所についてはDockerfileの後ろの方に書こうというアドバイスもありました。

😀 Serviceを変更するとAKSへ連動される

こちらのServiceファイルのハイライト部分を変更する操作をハンズオンで試しました。
https://github.com/yoshioterada/k8s-Azure-Container-Service-AKS--on-Azure/blob/a1bd6269fbdf064b8e0ba194c3628f573652f4ef/FrontService/11-Service.yaml#L15

以下の部分の記述を

  type: ClusterIP

以下のように変更したのですが、この部分を変えることで、AzureにてLoadBalancerが自動で作られます。

  type: LoadBalancer

この動きについては、こちらのドキュメントに解説が書かれています。
概念 - Azure Kubernetes サービス (AKS) におけるネットワーク | Microsoft Docs

😀 AzureのCLIを叩いた

AKS作成の権限がユーザーに無く、調査している中で、AzureのCLIコマンドを使ってAKSを作成することになりました。
Azureのコマンドはこんな感じです。

$ az login
$ az group create --name myResourceGroup --location japan east
$ az aks create \
    --resource-group myResourceGroup \
    --node-vm-size Standard_DS2_v2 \
    --name myAKSCluster \
    --node-count 1 \
    --enable-addons monitoring,http_application_routing \
    --kubernetes-version 1.13.7 \
    --generate-ssh-keys

1つ目のコマンドでAzureにログインして、
2つ目のコマンドでAKS用のResourceGroupを作り、
3つ目のコマンドでAKSを作成します。

事前にクラウドの管理画面にてAKS作成時の入力項目を見ていたので、3つ目のコマンドのそれぞれのオプションでどんな設定をしているのか、スッと入ってきました。

✨ 最後に

最後のセッションのお話は別のイベントでもお話聞いたことがありましたが、やっぱり寺田さんのお話って面白いです。
特に「技術の勉強は勉強でやったらいいけど、システムに適用する場合は最適なモノを選択しましょう」というような話など、多くの人に聞いてほしい!という内容が多く盛り込まれていました。

運営のみなさま、寺田さん、イベント時間の長い中、お疲れ様でした!
イベント楽しかったです〜!ありがとうございました〜〜!

他のクラスへの「呼び出し回数」と「引数として渡した値」をテストする

久しぶりにテストコードを書いたのでMEMO〜。

アプリから他のサービスを使っているけど、自動テストの時はそのサービスを使いたくない。
もしくは、テスト対象のクラスから他のクラスのメソッドを呼び出しているが、他のクラスの仕様はそのクラスのテストに委譲しており、今回のテストには含めたくない。
ただ、作成したクラスからサービスや他のクラスに対して、どんな値が渡されたのかはチェックしたい。

f:id:syobochim:20190630163339p:plain:w500

例えば、Controllerクラスのテストをする場合、 Controller内で Fukuzatsu クラスの hikisuIppai()メソッドを呼び出しているとする。
でも、hikisuIppai()メソッドの挙動は Fukuzatsu クラス側でテストするから、hikisuIppai() メソッドの「呼び出し回数」「引数として渡された値」が想定通りに設定されていることだけをテストできればOKとする。
そうした時のテストクラスはこんな感じになる。

import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.web.servlet.MockMvc;

import java.math.BigDecimal;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.hamcrest.core.Is.is;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;

@AutoConfigureMockMvc
@SpringBootTest
class ControllerTest {
  @Autowired
  private MockMvc mockMvc;
  @SpyBean
  private Fukuzatsu fukuzatsu;
  @Captor
  private ArgumentCaptor<Hotel> hotel;
  @Captor
  private ArgumentCaptor<Reservation> reservation;

  @Test
  void detailTest(@Autowired ObjectMapper mapper) throws Exception {
    doReturn(null).when(this.fukuzatsu).hikisuIppai(any(), any(), any(), any());

    CreateCommand cmd = new CreateCommand(hoge, fuga, piyo);
    String json = mapper.writeValueAsString(cmd);
    mockMvc.perform(post("/detail").content(json));

    verify(this.fukuzatsu, times(1)).hikisuIppai(any(), hotel.capture(), reservation.capture(), any());
    assertThat(reservation.getValue().getRating(), allOf(greaterThanOrEqualTo(new BigDecimal(0)), lessThanOrEqualTo(new BigDecimal(5))));
    assertThat(reservation.getValue().getNumberOfPeople(), is(greaterThanOrEqualTo(0)));
  }
}

内部の処理をスキップさせるために@SpyBean を利用して Fukuzatsu クラスの hikisuIppai メソッドの処理をモック化している。
今回は、引数に何が来ても null を返すように。

  @SpyBean
  private Fukuzatsu fukuzatsu;

...

    doReturn(null).when(this.fukuzatsu).hikisuIppai(any(), any(), any(), any());

アサーションでは、 hikisuIppai メソッドの呼び出し回数と、引数として渡した値を検査している。
キャプチャできれば普通に is メソッドなどを使って比較ができる。 今回は、

  • hikisuIppaiメソッドの呼び出し回数が1回であること
  • hikisuIppai メソッドの2番目、3番目に渡した値が想定通りであること
    • 2番目の値は hotel プロパティにキャプチャして、 hotel.getValue() で値を取得している。
    • 3番目の値は reservation プロパティにキャプチャして、 reservation.getValue() で値を取得している。

を検査している。

  @Captor
  private ArgumentCaptor<Hotel> hotel;
  @Captor
  private ArgumentCaptor<Reservation> reservation;

...

    verify(this.fukuzatsu, times(1)).hikisuIppai(any(), hotel.capture(), reservation.capture(), any());
    assertThat(hotel.getValue().getRating(), allOf(greaterThanOrEqualTo(new BigDecimal(0)), lessThanOrEqualTo(new BigDecimal(5))));
    assertThat(reservation.getValue().getNumberOfPeople(), is(greaterThanOrEqualTo(0)));

GCPUG Tokyo Next Extended 2019 Infra Dayに参加しました!

GCPUG Tokyo Next Extended 2019 Infra Dayに参加しました!
スライドまとめとMEMOです。

イベントページはこちら
gcpug-tokyo.connpass.com

Next Introduction

スピーカー:しんめたる (@sinmetal) | Twitter さん
内容:Google Cloud Next SF19のイベントレポート

スライド

docs.google.com

Google Cloud Next SF19のセッション内容はYouTubeで公開されており、記事にもまとめられている。
Google Cloud Platform - YouTube
Google Cloud Japan 公式ブログ: Google Cloud Next ’19 で行った 122 の発表

Session1

スピーカー:しんめたる (@sinmetal) | Twitter さん
内容:Google Cloud Next SF19でのリリース内容まとめ

スライド

docs.google.com

ベンダーが提供したサービスを使えるようになって、請求はGCPに統合される。
2019年いっぱいで提供されていく予定とのこと!

  • Confluent
  • DataStax
  • Elastic
  • InfluxData
  • MongoDB
  • Neo4j
  • Redis Labs

こんなサービスのアップデートも紹介されていました!
FirestoreとBigtableはどういう使い分けなんだろう。。。NoSQLのベストな使い道もわからない。。。勉強したい。。。

Session2

スピーカー Jun Sakata (@sakajunquality) | Twitter さん
内容:Service Meshの説明とTraffic Directorについて

スライド

未公開

なぜService Meshをしたいのか

  • Observability
    • 全てのトラフィックがenvoyを経由することで、ステータスやレイテンシ、トラフィック量などを管理することができる
  • Reliability
    • ヘルスチェックをした上でロードバランサー的にトラフィックを制御できる
    • リトライやタイムアウトなどの設定を集中管理できる
  • Security
    • Mutual TLS
    • このサービスにはここから通信していいという設定ができる

などのメリットがある。

"Decouples developers from operations"
「開発者をオペレーションから切り離して、開発者はビジネスロジックに集中できる」

Traffic Director  |  Google CloudにはIstioのAPIが全て実装される予定。2019/7の予定だったはずだが、現時点では対応時期は未定。
Traffic Directorを利用するとサービスネットワーク構造を可視化できる。
Traffic DirectorとStackdriver(GCPのモニタリングサービス)と連携することで、サービス状況が把握しやすくなる。

現時点でIstioを利用した場合は Istio on GKEを選択するのがオススメとのこと。
Istio on GKEで構築すれば、GCP上のL4ロードバランサーを自動でプロビジョニングしてくれる。
OSS版は自分たちでマネージしなければいけないので、ハードルがある。
Trafic Directorにはまだα版の機能が多いので、まだプロダクションレディではない。

Istio 1.0.xとIstio 1.1.xはかなり動作が違う。
接続先をすべて設定していく必要があったが、1.1.Xからは基本すべて許可になったため、サービスメッシュをやる障壁が1.1.xで下がった。
外部のサービス(DataDogなど)とhttpsとつなぐ時は注意が必要。
バージョンの互換を検証してくれるものもある Upgrading Istio on GKE  |  Istio on GKE  |  Google Cloud


パネルディスカッションには残念ながら参加できずでした。
会場に飲み物やポテチなどが置いてあった…!
イベント運営の皆さま、ありがとうございました!🙇‍♂️✨

Spring BootのアプリとOracle CloudのAutonomous Databaseを接続する - アプリケーション編

Oracle Code Tokyoでハンズオンのお手伝いをしてきました!
ハンズオンは、Rails / laravel / Django / Spring Bootの4つのフレームワークを利用して、Oracle CloudのAutonomous Transaction Processingサービス(Oracle 18c)へ接続するサンプルアプリと、その手順を作っています。
私はSpring Boot(JPAを利用)のサンプルアプリとハンズオン手順、また、それに合わせてアプリの検証環境構築用のTerraformも作りました。

ハンズオンの手順やアプリはこちらのGitHubリポジトリに置いています。
ハンズオン手順と内容がかぶるところも多いのですが、この機会に、環境の作り方やデータベース接続方法などを整理したいと思います。

github.com

今回は、いよいよ完結編。アプリケーション作成のポイントを書いていこうと思います。
構成や環境構築編の内容についてはこちら
Spring BootのアプリとOracle CloudのAutonomous Databaseを接続する - 環境構築編 - そこに仁義はあるのか(仮)
アプリケーションの設定についてはこちら
Spring BootのアプリとOracle CloudのAutonomous Databaseを接続する - アプリケーション環境編 - そこに仁義はあるのか(仮)


f:id:syobochim:20190520002319p:plain

  • 👌 アプリで使っているもの
  • 👌 pom.xml
  • 👌 データベース接続設定を追加
  • 👌 シーケンスの設定
続きを読む

Spring BootのアプリとOracle CloudのAutonomous Databaseを接続する - アプリケーション環境編

Oracle Code Tokyoでハンズオンのお手伝いをしてきました!
ハンズオンは、Rails / laravel / Django / Spring Bootの4つのフレームワークを利用して、Oracle CloudのAutonomous Transaction Processingサービス(Oracle 18c)へ接続するサンプルアプリと、その手順を作っています。
私はSpring Boot(JPAを利用)のサンプルアプリとハンズオン手順、また、それに合わせてアプリの検証環境構築用のTerraformも作りました。

ハンズオンの手順やアプリはこちらのGitHubリポジトリに置いています。
ハンズオン手順と内容がかぶるところも多いのですが、この機会に、環境の作り方やデータベース接続方法などを整理したいと思います。

github.com

今回は、アプリケーション環境の設定手順を書いていこうと思います。
構成や環境構築編の内容についてはこちらです。
Spring BootのアプリとOracle CloudのAutonomous Databaseを接続する - 環境構築編 - そこに仁義はあるのか(仮)

f:id:syobochim:20190520002319p:plain

  • 👌 アプリで使っているもの
  • 👌 実行環境の設定
  • 👌 ビルド環境の設定
    • 1. ライセンス確認
    • 2. Mavenのsettings.xmlに認証情報を記載
  • 👌 テーブルの作成
続きを読む

Spring BootのアプリとOracle CloudのAutonomous Databaseを接続する - 環境構築編

Oracle Code Tokyoでハンズオンのお手伝いをしてきました!
ハンズオンは、Rails / laravel / Django / Spring Bootの4つのフレームワークを利用して、Oracle CloudのAutonomous Transaction Processingサービス(Oracle 18c)へ接続するサンプルアプリと、その手順を作っています。
私はSpring Boot(JPAを利用)のサンプルアプリとハンズオン手順、また、それに合わせてアプリの検証環境構築用のTerraformも作りました。

ハンズオンの手順やアプリはこちらのGitHubリポジトリに置いています。
ハンズオン手順と内容がかぶるところも多いのですが、この機会に、環境の作り方やデータベース接続方法などを整理したいと思います。

github.com

今回は、環境構築までの手順を書いていこうと思います。
アプリケーションの動作環境の設定についてはこちら。
syobochim.hatenablog.com

  • 👌 クラウド環境の構築
    • 手動で作成する場合
    • Terraformを使って作成する場合
  • 👌 仮想マシンの環境構築について
    • ビルド環境+実行環境
    • 実行環境
続きを読む

総務省の統計調査クラウドコンピューティングサービスの通信利用動向調査が面白い

総務省が出している統計情報の通信利用動向調査が面白かった。実際のデータや細かい数値はこちらから。
統計調査データ:通信利用動向調査:報道発表資料


この調査データは2017年までのものしか発表されていない。
これまでの発表時期を見ると、6月・7月頃に調査結果が発表されているので、2018年のデータは2019年のその頃に出るのでは。

経年でのデータをグラフ化して見てみたかったので可視化したけど、世の情勢に疎いので、何の因果関係でそうなっているのかはわからない・・・。😇😇

なお、可視化にはCanvaというサービスを利用してデータを可視化しました。
Amazingly Simple Graphic Design Software – Canva


こんな感じでテンプレートがいくつか用意されていて、それを使うと簡単におしゃれなスライドを作れる。
f:id:syobochim:20190512222132p:plain:w400
数値を入力していくだけで、お手軽にいい感じのグラフを作れた!しかし、お手軽な分、凡例をつけられないなどの細かいカスタマイズは出来ない。
f:id:syobochim:20190512222345p:plain:w400

それではまとめた結果を載せていきます。

f:id:syobochim:20190512214756p:plain
最初にクラウドサービスの利用状況の推移。
クラウドサービスを利用している企業の割合は2016年と比較して10%も増えており、ついに50%を超えた。(2016 : 46.9% → 2017 : 56.9%)


f:id:syobochim:20190512213615p:plain
クラウドサービスの効果。
効果があったと感じている企業の割合は5年間ほぼ変わらず、8割強をキープしている。しかし過去5年間でのピークは2013年。


f:id:syobochim:20190512213618p:plain
f:id:syobochim:20190512213628p:plain
産業別クラウドサービス利用の割合の推移。
どの業種も徐々に利用割合が伸びてきている。
情報通信業が多いのはともかくとして、次点が金融・保険業になっているのは少し意外だった。どちらかといえば、クラウドの導入が遅い業種なのかと思っていた。
運輸業は伸び方にムラがあるけど、何か理由があるんだろうか・・・?

f:id:syobochim:20190512213634p:plain
最後に資本金規模別クラウドサービス利用割合の推移。
1000万円未満は2016年にかなり割合が落ち込んでいるけど、何があったんだろう?
基本的にはどの業種も右肩上がりになっている。
全体の企業の利用割合は5割を超えているが、資本金別で見ると資本金が1億円未満の企業は全て50%以下、1億円以上の企業は全て50%以上になっている。

他にもデータには、「どういうクラウドサービスを利用しているか」や「なぜクラウドサービスを利用していないか」という理由などが載っていて面白い。