クラウドインフラ構築記

現在AWSの構築支援に携わっております。今注視しているのは、GKE、BigQuery、Google Dataflowなどサービスを展開しているGoolge Cloud Platformです。

2016年9月11日
から hiruta
GCP Next World Tour in Tokyoに参加しました。 #GCPNext はコメントを受け付けていません。

GCP Next World Tour in Tokyoに参加しました。 #GCPNext

9/6  GCP(Google Cloud Platform)のグローバルイベント GCP Net World Tour in Tokyoが開催され、参加してきました。

  • 基調講演

東京リージョンは2016 Q4に開設予定で現在最終テスト中。2016/10-12のどこかてことか

Googleのデータセンターは他のクラウド事業者とは違う。

サーバーレスアーキテクチャーがGCPの多くのサービスで取り入られている

What’s the Best Cloud? Probably GCP    https://t.co/l66Gz5L5sw

セキュリティも各種認証を取得済み。2段階認証、データ損失防止、楕円曲線暗号ECC 、デフォルト暗号化

AbemaTVもGCPを基盤として採用。障害とか品質を考慮して選定したとのこと。AbemaTVも東京リージョンには期待している。

IMAG0485

  • Google の機械学習技術で実現する「賢い」アプリケーション

Googleの幅広いサービスですでに使われている。RankBrain等に。

Google 会長「5年後には大型IPOの成功は機械学習によるものになる」

株式会社オモロキ ボケてでのCloud vision Safe Search Annotationを使って、不健全画像投稿の自動検知

  • Cloud Dataflow と Cloud Pub/Sub によるリコメンドのためのストリーム処理基盤

Spotifyのイベント処理基盤

Spotifyを現在kafka 0.7で構築されているが、データ量増大で悩まされている

システム再設計で、Cloud dataflows、kafka 0.8等の検討が行われた。

Reliable Persistent Queueの設計が根幹

Cloud Pub/Sub 未配信データを7日間は保持。一度は送信することが保証

PoCで2,000,000 イベント/secの性能が出たとのこと

https://t.co/uJteFScR2G

Scala API for Google Cloud Dataflow ( Apache Beam) https://github.com/spotify/scio

  • 事例紹介(ゲーム業界の方必見!GCP のすごいところ)

GKEでセキュリティパッチとか開発環境、本番環境の環境差分の解消

  • Google Cloud Platform で大幅強化された Firebase
  • Google Container Engine と Kubernetes で無理をしないコンテナ管理

Containers 基盤としてlmctfy が公開されたが、使い勝手のいいものではなかった。https://github.com/google/lmctfy

kubernetesの誕生。ギリシャ語で、「操舵手」「統治者」「人工頭脳」という語の語源。

複数のクラウドで動作可能。100% OSS。ベンダーロックインが避けられる。

Github上の開発も活発。上位0.01%。関連プロジェクトで1,200以上のk8sのプロジェクトが動いている。

AbemaTV


  • Alpine Linux
  • docker 1.9.1
  • Kubernetes 1.2.0

Dockerレジストリ、クラスタのスケールが容易、Stackdriver loggingによるログ管理がポイント

Podのスケール設定だけは、現状手動てこと。 kubernetes Horizontail Pod Autoscaling

 

参加してみて、ビックデータ系だと、Google cloud Platformの優位なことが改めて実感された。

番外編として、bq_sushiと、Google尽くしの1日でした。

 

IMAG0486

2016年9月8日
から hiruta
CloudSQL Second Edition を試してみました。 はコメントを受け付けていません。

CloudSQL Second Edition を試してみました。

Cloud SQL Second Editionの特徴から

  • On Demand activation policy サポートされていない。Always On/Off
  • IPv6 未サポート
  • Storage Engineは、InnoDB
  • GTID replication
  • MySQL 5.6/5.7 デフォルトは5.7
  • ディスク自動拡張

First Generationだと、UIからDBユーザを作成できたのですが、Second Editonではrootのパスワード変更以外DBユーザは作成できなくなっています。
For Second Generation instances, you cannot create and administer MySQL user accounts and databases from the console. You use the MySQL Client administration tool to manage users and databases.

x16 CPUを使用する場合、Amazon Auroraよりパフォーマンスが優れている結果も。

インスタンスを作成後、rootパスワードを設定

gcloud sql instances set-root-password [INSTANCE_NAME] --password [ROOT_PASSWORD]

Cloud Shellからだと、自動的に許可ネットワークに追加してくれます。

gcloud beta sql connect [INSTANCE_ID] --user=root
create database webdb default character set utf8

First Generationで使用していたユーザを作成する

create user cmsuser identified by 'passworsd'
grant all privideges on webdb.* to `cmsuser`@`%`

First Generationのデータベースをエクスポート

※エクスポートするデータベースを指定。指定しないとmysql等システムデータベースもインポートしようとします。

 

2016年9月4日
から hiruta
ubuntuにjupyter notebookを導入 #jupyter はコメントを受け付けていません。

ubuntuにjupyter notebookを導入 #jupyter

9/1に、OSSユーザの勉強会 TensorFlow編でGoogle 中井様(@enakai00)から、jupyterでTensorFlowの話がありましたので、jupyter notebookをUbuntu 14.04に、jupyter notebook & TensorFlowをインストールしてみました。

まずは、pythonのバージョン管理にpyenvをインストール

git clone https://github.com/yyuu/pyenv.git .pyenv
pyenv install 2.7.9
pyenv local 2.7.9

各種プラグインを取得

cd ~/.pyenv/plugins
git clone https://github.com/yyuu/pyenv-virtualenv.git
git clone https://github.com/yyuu/pyenv-virtualenvwrapper.git

TensorFlow用に2.7.11をインストール

pyenv install 2.7.11
pyenv virtualenv 2.7.11 TensorFlow
pyenv versions
 system
2.7.11
2.7.11/envs/TensorFlow
2.7.9
* TensorFlow (set by /home/hiruta/.python-version)

TensorFlowをインストール

mkdir -p tensorflow ; cd tensorflow
pip install -U https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.10.0rc0-cp27-none-linux_x86_64.whl

jupyterのインストール

pip install -U matplotlib jupyter

それで、ipythonが使えるようになっています。

jupyterは下記モジュールがないと起動できないので、インストールしておきます。

sudo apt-get install libsqlite3-dev
pip install -U pysqlite

デフォルトでは、リモートからの接続できないようになっているので、設定変更が必要

jupyter notebook --generate-config
ipython

ハッシュしたパスワードを生成しておきます。

In [1]: from notebook.auth import passwd

In [2]: passwd()
 Enter password: <パスワードを入力>
 Verify password: <パスワードを再入力>
 Out[2]: 'sha1:<ハッシュ化されたパスワード>'
cd ~/.jupyter/
vi ~/.jupyter/jupyter_notebook_config.py
c.NotebookApp.ip = '*'
c.NotebookApp.password = u'sha1:602f13266797:7ff1aed8351ad03b03e06facfd67bc2649717b7e'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8888

c.NotebookApp.ipでクライアントIPで制限もできますが、今回は全て許可にしています。

jupyterからGoogle Cloud Visionを利用するのに、下記pythonモジュールを導入しておきます。

pip install httplib2
pip install Image
pip install --upgrade google-api-python-client

Cloud visionのnotebookをgit cloneしておきます。

git clone https://github.com/enakai00/jupyter_gcp.git
 cd jupyter_gcp
 jupyter notebook 

juoyter notebookは、Google Datalabでも使えます。(Google DatalabはLaunchできないなど不安定な場合があります)

 

 

 

2016年7月26日
から hiruta
GCEにシリアルコンソール接続 はコメントを受け付けていません。

GCEにシリアルコンソール接続

getSerialPortOutputでもboot時のメッセージは確認はできますが、この方法だとread-onlyで、アクションを実行させることはできない。

シリアルコンソール接続てものが。

シリアルポート接続の有効化は以下コマンドで完了。

gcloud compute instances add-metadata [INSTANCE_NAME]  \
    --metadata=serial-port-enable=1

シリアルポート接続を有効にすると、Enable connecting to serail portsが有効化されます。Web UIでは有効にできなそう。

screencapture-console-cloud-google-com-compute-instancesDetail-zones-asia-east1-a-instances-instance-group-2-opjd-1469446491789

firewall ruleで22/tcpを閉じた状態でもコンソールのログインプロンプトが出ます。

https://cloud.google.com/compute/docs/instances/interacting-with-serial-console

注意書きにも書かれていますが、SSH鍵、IPアドレス、GCPプロジェクト名がわかっているとどこからでも接続できてしまう。IPベースのアクセス制限に対応してないとのこと

 

2016年7月24日
から hiruta
GCPUG信州の機械学習の勉強会に参加しました。 #gcpug はコメントを受け付けていません。

GCPUG信州の機械学習の勉強会に参加しました。 #gcpug

昨日GCPUG信州の機械学習がテーマの勉強会に参加してきました。

Google Cloud Platform概要

  • Googleのデータセンターの電力管理も、GoogleDeepMindにて、40%の削減
  • Googleのサーバーはリソース状況により、どのサービスに使われるか変わる
  • Googleのデータセンターの使用効率も80%
  • 1Pbpsのネットワーク
  • Region とZone。現在5つ。日本リージョンも近々?
  • AppEngineの起動は速い。Go言語だと40s位
  • インスタンス使用時間により、自動割引。同じマシンタイプを合算して割り引きしてくれる
  • Preemtible VMs Borgのプライオリティの低いサービスを利用
  • GCEのインスタンス課金は10分単位。10~20分程度の利用時間だと、1H課金のクラウドに比べ、単純に計算するだけでも、コストは1/2

Speech API

  • 文脈認識率は8割。Cortana、WindowsAPIはせいぜい3~4割※単語レベルは高いが。
  • US方言も。ただ、日本語の方言は対応していない
  • しゃべり言葉はあまりよくない?
  • Cloud Natural language API

Speech API、βリリースにあたり、長い時間の音声ファイルの認識に使えるAsyncRecognizeの新機能が。gRPCプロトコルを使用している
screencapture-mail-google-com-mail-u-0-1469332131909

TensorFlow

  • PythonAPI、C++ APIが提供されているが、Python APIを使うのがよさそう
  • 並列分散処理を簡単に実装できる。
  • アルゴリズムを実装する道具、位置づけ
  • APIも豊富 https://www.tensorflow.org/versions/r0.9/api_docs/python/index.html
  • TensorFlow独自のプロセッサーを作成していた(TPU)。AlphaGoも使用されていた。
  • ただ、GCEには、GPUインスタンスがない。GPUはCloud Machine Learningでは使えるとのこと。現在Limit Preview

CloudVisionAPIをIoTに

  • プライバシー保護が重要。人の顔にマスク(モザイク)を掛ける
  • APIベースなので、リソースが限られたRaspberryPiとかに有益

Docker

  • コンテナの粒度はアプリ単位
  • SwarmがDocker Engineに統合されたので、kubernatesとの使い分けはどうするか。今は過渡期

GCEをTensorFlow計算エンジン

  • パーセプトロン
  • バックプロパゲーション
  • 畳み込みCNN。画像認識に使われている
  • 過去にもネオコグニトロンと同等の機能があったが、ネットワークの性能、CPUパワーとかが当時に比べて向上したことで、DeepLearningが進化
  • gcloud config-ssh ssh configurationに、インスタンスのaliasを登録してくれる。ssh <instance>.<region>.<project>でアクセスが可能に。Ansibleで複数インスタンスで学習自動化するのに役に立つ

CloudVisionAPI、Speech API、バックでは、DeepLearning技術は使われているので、Googleの基盤を少しわかった気がします。

 

 

2016年7月23日
から hiruta
Internal Load Balancing 登場 #gcpja はコメントを受け付けていません。

Internal Load Balancing 登場 #gcpja

待望の Google Cloud Platform (GCP)にも、L4ベースInternal Load Balancingが登場。

Private IPアドレスのインスタンスでLoad Balancingも可能に。

まだ、使えないので、ドキュメントからわかる範囲で書いています。αサービスが使えるようになれば後日レポートします。

ドキュメントはこちらから。 https://cloud.google.com/compute/docs/load-balancing/internal/

主な特徴としては。

  • リージョン内のインスタンスにアクセスが可能。リージョン跨ぎでインスタンスをロードバランシングできない模様
  • ヘルスチェック ※133.211.0.0/22からの通信はFirewallなり許可しておく必要がる

もうPrivateなインスタンスのロードバランスの可用性に心配する必要がない

ユースケース

  • 3-Tier Web サービス(アプリケーションレイヤー、バックエンドデータベース)
  • データベースインスタンス他Internalなサービスのロードバランシング

Google Cloud Internal Load Balancingは、Andromeda network virtualization stack上に構築された lightweight load-balancing、インスタンスベースではなく、ソフトウェアベースのロードバランシング

気になる点

  • Load Balancing用IPの割り当て。手動とネットワーク内でIPを自動割り当てが可能?
gcloud alpha compute forwarding-rules create NAME --address ADDRESS --load-balancing-scheme internal 
  • Load Balancing用に割り当てられるPrivate IPはスケールアウトにより、MAX IPアドレスを割り当てる?

–capacity-scaler,–max-rate,–max-rate,-per-instanceのオプションはinternal load balacingでは使えません。

alphaバージョンでは以下制限があるようです。

  • 500インスタンスへのアクセスに制限
  • next-hop IP
  • VPNを通じた通信は行えない
  • オンプレからInternal Load Balancingへの通信は未サポート

三層構造のアーキテクチャー、イントラネット向けWEBインフラなどの構築に使えると思われます。

 

 

 

 

 

2016年7月10日
から hiruta
Windows10 IoT Core by Raspberry Pi 3導入 はコメントを受け付けていません。

Windows10 IoT Core by Raspberry Pi 3導入

Raspberry Pi3に、Windows10 IoT Coreを導入。

Raspberry Pi3用Windows10 IoT Coreは、Onboard WiFiドライバ、miniUART、が有効、UARTバンドレートが増えた、GPIOパフォーマンスが向上など、機能向上が図られています。

※Raspberry Pi 3用のWindows10 IoT Core Release Imageが現時点(7/10)存在しませんので、The March 2016 Insider Preview for Windows 10 IoT Coreを使用します。

https://developer.microsoft.com/ja-jp/windows/iot にアクセスし、すぐを作業を開始をクリック。

1-1

①Select your board 「RaspberryPi3」

②Select your hardware 「Flash onto my blank microSD card」

③Select your OS version 「Windows 10 IoT Core Insider Preview」

1-4

 

②Download and install Windows 10 IoT Core Dashboard

Dashboardをダウンロードし、ダウンロードしたsetup.exeをインストールを行います。

1-6

すべてのアプリに、Windows 10 IoT Core→Windows 10 IoT Core Dashboardができています。

Raspberry Pi3用のWindows10 IoT Coreを取得します。※Windows Insider Programに参加要

https://developer.microsoft.com/ja-jp/windows/iot/win10/GetStarted/rpi3/sdcard/insider/getstartedstep2

Manually download and flash a custom image

①Get Windows 10 IoT Core Insider Preview

1-7

 

Buildは、7/10現在、14376(最新番)、14366が選択できます。

13376だと、Performance、Processes表示に不具合があります。

2-3

IoT DashboardからSDカードにOSを書き込みます。Windows10 IoT Core のAdministratorのパスワードはここで設定可能。後から、Web UIから等でも変更は可能ですが。

3

OSを書き込んだSDカードをRasberry Pi3に入れて、Windows10 IoTを起動するとIoT dashboardの自分のデバイスに表示されていると思います。名前解決もちゃんとできています。IPv6で。。

>ping minwinpc

minwinpc [fe80::c846:c78a:c3ba:78%8]に ping を送信しています 32 バイトのデータ:
fe80::c846:c78a:c3ba:78%8 からの応答: 時間 =3ms
fe80::c846:c78a:c3ba:78%8 からの応答: 時間 =1ms
fe80::c846:c78a:c3ba:78%8 からの応答: 時間 =2ms
fe80::c846:c78a:c3ba:78%8 からの応答: 時間 =1ms

Windows10 IoT Coreは、Windows Updateにも対応しています。

実際アプリを開発するには下記が必要になります。

  • Visual Studio Community 2015 Update2 https://www.visualstudio.com/products/visual-studio-community-vs
  • Azure SDK https://azure.microsoft.com/ja-jp/downloads/で、VS2015用をダウンロード
  • Windows 10 IoT Core開発環境

Raspberry Pi3用のStarter Packがないので、Raspberry Pi2用のドキュメントを確認し、3 Setup your PC 5 IoT Core Project Templates 、5 Enable devloper modeを行っておきます。

https://developer.microsoft.com/en-us/windows/iot/win10/kitsetuppcrpi

2016年7月3日
から hiruta
Google Cloud functionsで、Cloud Vision APIを #gcpja はコメントを受け付けていません。

Google Cloud functionsで、Cloud Vision APIを #gcpja

Google Cloud Functionsで、Cloud Vision APIを使ってみました。Cloud Functionsを使う利点は、credentialsをアプリに埋め込む必要がない点(内部でAWSだとIAM Role的にcredentialsを取得してくれる。)

まず、ディレクトリの作成。

 mkdir visiontest; cd visiontest;

次に、ライブラリのインストール。node versionは、v0.12.7を使用。

 npm install --save gcloud 

node.jsのvision APIは以下を参照

https://googlecloudplatform.github.io/gcloud-node/#/docs/v0.36.0/vision?method=detectText

Cloud functionsのコードサンプルは以下になります。


var gcloud = require('gcloud')({
projectId: 'xxxxxxxxxx'
});

exports.visiontest = function (context, data){
var vision = gcloud.vision();
if ( data != null ){
var gcs = gcloud.storage();
var myBucket = gcs.bucket('vision-load-image');
var file = myBucket.file(data.name);

vision.detectText(file, function(err, text, apiResponse) {
console.log('text ', text);
data = null;

});
}
context.success();
}

functionsをデプロイ。

gcloud alpha functions deploy visiontest --bucket deploy-bucket --trigger-gs-uri vision-load-image

以前デジカメで撮影した画像をGCSバケットにアップロード。

IMAG0105

gsutil cp IMAG0105.jpg gs://vision-load-image/

Stackdriver loggingに、解析結果が表示されることがわかります。おもけに、精度も高い。コマンドでアップロードする場合は、1度のみ実行されるのだが、Cyberduckで画像ファイルをドラッグドロップすると、なぜうか2回functionsが実行される。

stackdriverlog

GCSに登録された画像を画像解析結果をBigQueryに蓄積していくようなことが可能になります。

安価なOCRシステムが構築できる!?チュートリアルも公開されています。

https://cloud.google.com/functions/docs/tutorials/ocr

今はまだnodeのAPIが公開されていないSpeech APIもよくよくは使えるようになるのかなあ。(GCSに音声ファイルをアップロードすると、音声ファイルを解析して結果を返すとか)

2016/9/22 Update

packages.jsonをデプロイするフォルダに置いておけば、npm install –save gloud等不要です。

2016年6月12日
から hiruta
Google Speech APIを使ってみました! #gcpja はコメントを受け付けていません。

Google Speech APIを使ってみました! #gcpja

Limit PreviewのGoogle Speech API少し使ってみました。

音声マイクとしては以下を利用。

サンワサプライ フラット型PCマイク MM-MC23

まずは、SoX Sound eXchangeをダウンロード

https://sourceforge.net/projects/sox/files/sox/14.4.2/sox-14.4.2-win32.zip/download

次に、ダウンロードしたSoX Source eXchangeを適当なフォルダに展開

rec.exe、play.exeをsox.exeをコピーして作成

copy sox.exe rec.exe
copy sox.exe play.exe

AUDIO DEVICE DRIVERの環境変数の設定を行います。

set AUDIODRIVER=waveaudio
rec -c 1 -r 16k output.wav

そこで、マイクから音声を録音し、FLAC形式に変換まで行っておきます。

sox output.wav output.flac

Speech API用のサンプルを取得します。

REST APIでSpeech APIを使用することもできますが、この場合、publicな権限がないとGCS上の音声ファイルを読み込むことができないので、publicでないGCSバケットの音声ファイルを解析するには、下記サンプルのようにcredential認証をアプリケーション内部で行う必要があります。

git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

日本語を解析させるには、python-docs-samples/speech/api/speech_gcs.pyで一カ所修正する必要があります。変更内容についてはクローズな情報になっていますので、ここでは記載は差し控えます。

python speech_gcs.py gs://xxxxxxxx/output.flac gs://xxxxxxxx/output.txt

レスポンス待つことなく返ってきます。おまけに高精度で。

$ cat output.txt
{
"responses": [ {
"results": [ {
"alternatives": [ {
"transcript": "おはようございますこんにちは",
"confidence": 0.95833784
} ],
"is_final": true
} ]
} ]
}

言語コードの設定をしないと、『ohayo gozaimasu konnichiwa』となります。
Speech APIの言語も、英語、日本語をはじめ、90言語近くに対応しており、今後Google Homeとのバックエンドに使われそうな予想はしています。

2016年5月8日
から hiruta
Cloud FounctionsでBigQueryにデータを登録 #gcpja はコメントを受け付けていません。

Cloud FounctionsでBigQueryにデータを登録 #gcpja

Goolge Cloud Function フルマネージド化されたことでBigQueryへのセンサーデータの送信用のモジュールを書きました。エラー処理とかされていない素の状態です。

nodeのバージョンはFunctions側とそろえておく必要がありますので、npmもfunctions側と同じバージョンを利用。

まず、gcloudモジュールの導入。

gcloud client libraryについては、こちらを参照してください。

 ../node-v0.12.7-linux-x64/bin/npm install gcloud --save

次に、コード本体。プロジェクトIDの記載は必要ですが、credentialsなどは不要です。functions側で自動認証されていると思われます。


var gcloud = require('gcloud')({
projectId: 'XXXXXXXX'
});

exports.bigquerytest = function (context, data){
var bigquery = gcloud.bigquery();
var dataset = bigquery.dataset('iot_data');
var table = dataset.table('sensor_data');

table.insert({
TIMESTAMP: data.timestamp,
temp: data.temp
}, insertHandler);

context.success();
};

function insertHandler( err, insertErrors, apiResponse) {

}

  gcloud alpha functions deploy bigquerytest --bucket gs://XXXXXXXX --trigger-http 

実際データを投入します。

curl -X POST https://us-central1.XXXXXXXXXX.cloudfunctions.net/bigquerytest -d '{"timestamp":"2016-05-08 18:06:00","temp":20}'

 

データがBigQueryに登録されていることがわかります。
screencapture-bigquery-cloud-google-com-results-cms-production-1225-bquijob_78f008d9_1548fa75338-1462699378264