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

略してそこ仁!

「GCPの教科書」を読んだよ〜。わかりやすくてボリューミー!

会社の人にオススメいただいた「GCPの教科書」を読みました!
GCPを触って使い心地を楽しみつつ本を読んでいきました。
この本は内容もわかりやすいし、サービスも広く紹介されていて満足度が高い一冊でした!
そして、CLIコマンドも合わせて紹介されているのは嬉しいポイントでした。

GCPの教科書

GCPの教科書

  • 作者: クラウドエース株式会社吉積礼敏・他
  • 出版社/メーカー: リックテレコム
  • 発売日: 2019/04/19
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

📖 目次と所感

本の目次は以下の通りです。
第3章の基本的なサービス紹介ではCLIでの操作や画面キャプチャが多く、操作をしつつ学んでいくことが出来ました。
第4章〜第5章の高度なサービスはサービス紹介がサラッと書かれていました。
CLIコマンドでの記載があるので、コマンドでの操作になれることが出来るし、サービスも広く知ることが出来るので、GCPの最初の一歩にするのに適した本だと思いました!

  • 第1章 Google Cloud Platformとは?
  • 第2章 GCPの基本を知ろう
  • 第3章 GCPの基本サービスを学ぼう
    • Google Compute Engine (GCE)
    • Google Cloud Storage (GCS)
    • Google App Engine (GAE)
    • BigQuery
    • Google Cloud SQL
  • 第4章 高度なサービスを知ろう(その1)
    • Kubernetes Engine (GKE)
    • ネットワーキング
    • Bigtable
    • Datastore
    • Stackdriverモニタリング
    • Stackdriverロギング
  • 第5章 高度なサービスを知ろう(その2)
    • Deployment Manager
    • Cloud Pub/Sub
    • Cloud Dataflow
    • Dataproc
    • Cloud Launcher
    • Cloud Functions
    • その他サービス
  • 第6章 機械学習
  • 第7章 GCPで使えるAPIの紹介
  • 第8章 AWSユーザーへ
  • 第9章 GCPのまとめと今後の展望

第3章 GCPの基本サービスを学ぼう

GCEのインスタンス作成の速さに感動したんですが、それよりもっと感動が強かったのはApp Engineの使いごこちでした。
App Engineが使いたくてGCPを選択するというケースもあるんだろうなと思うレベル。
デプロイするだけでStackdriverと勝手に連携してくれて、LoggingとTraceが出来るとか最高かよと思いました。

Logging:各言語環境の標準Loggerを使って出力すると、Stackdriver Loggingと自動連携してくれてログを確認出来る。
Trace:実際にどの機能でどのくらい時間がかかっていたか、どのような順番で機能を呼び出していたかを確認出来る。ランダムにサンプルをとって、どのように各機能が呼び出されていたかをグラフィカルに表示してくれる。

さらに感動したのはバージョニングの機能です。
バージョンの切り替えがとても簡単に出来るのでブルーグリーンデプロイが簡単!というだけでなく、トラフィックも簡単に分割出来るので、A/Bテストやカナリアリリースも簡単に実現出来そうでした。
f:id:syobochim:20190909162643p:plain

Google Cloud Storageはアーカイブ用のストレージ(NearlineとColdline)でも、通常のObject Storageと一貫した API を使用することが出来て、かつ1秒未満でアクセスできるというのもすごいと思いました。
使い心地が良さそう。

Google Cloud Storageのオブジェクトの一般公開機能は書籍とは変わっていて、「allUsers」に対して権限を割り当てることで実現可能になっていました。

第4章 高度なサービスを知ろう(その1) / 第5章 高度なサービスを知ろう(その2)

Kubernetes Engineはオートスケールの設定がめちゃくちゃ簡単で使い心地がよかったです。
Marketplaceを活用することで簡単にサービスをデプロイすることも出来ます。
各種チュートリアル:Tutorials  |  Kubernetes Engine  |  Google Cloud

Cloud Functionsもチュートリアルがたくさん提供されていました。
Tutorials  |  Cloud Functions  |  Google Cloud

第7章 GCPで使えるAPIの紹介

Googleが提供しているAPIを調べられるサイトが紹介されていました。
こういうの結構嬉しい。
Google APIs Explorer

まとめ

  • 「GCPの教科書」を読みました
  • サービスが広く紹介されていて、GCPの最初の一歩には良さそう
  • App Engineがすごい

GCPの教科書

GCPの教科書

  • 作者: クラウドエース株式会社吉積礼敏・他
  • 出版社/メーカー: リックテレコム
  • 発売日: 2019/04/19
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

Oracle Cloud : Object Storageにファイルを置いたらメール通知させる

Oracle Cloudでは、

  • Events:何かアクションが発生した時に他のサービスを呼び出す
  • Notifications:EmailやPagerDutyへ通知を飛ばす

というサービスが提供されています。
今回は、この2つのサービスを利用して、「Object Storageにファイルを置いたらメール通知される」機能を作ります。
上記の2つのサービスを連携することで、5分程の簡単な設定で作成が完了しました!

公式のドキュメントはこちら

  • Object Storageを作る
  • Notificationsを作る+設定する
  • Eventsを作る+設定する
  • 試してみる
続きを読む

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に認証情報を記載
  • 👌 テーブルの作成
続きを読む