クラウドインフラ構築記

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

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年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

2016年5月8日
から hiruta
Google Cloud functions フルマネージドサービスに移行 #gcpja #gcpug はコメントを受け付けていません。

Google Cloud functions フルマネージドサービスに移行 #gcpja #gcpug

5/4以降、Google Cloud functions フルマネージドサービスに移行されました。

フルマネージド移行前からCloud functionsのAPIをEnableにしている場合、Disable→re-Enableが作業が必要になります。過去Functions APIをEnableしたIAMアカウント毎に作業が必須。そうでないと、GKE clusterが起動してしまいます。
また、プロジェクト内にfunctions用のGKE clusterの削除やGKE cluster用に割り当てられたExternal IPもリリースしておきます。

リージョンで初めてデプロイする場合、4分程度かかります。初期設定とか行っているのか。
2度目以降は、10s程度で完了する。8h時間程度間を開けても、10s程度で完了するようです。

functions用のサーバーはunameで確認すると、debian8が動いていることがわかります。

node runtimeは以下になっているので、node moduleを組み込む場合、バージョンをそろえておく必要があります。

v0.12.7

Stackdriver Loggingにもget-logsの内容を確認できます。

asia-east1はまだ対応していないので、europe-east1かus-central1で。

$ gcloud alpha functions deploy helloworld --region asia-east1 --bucket gs://cms-stg-deploy --trigger-http
ERROR: (gcloud.alpha.functions.deploy) ResponseError: status=[400], code=[Bad Request], message=[The request has errors
Problems:
region asia-east1 is not supported
]

Cloud functions自体に、HTTP(S)トリガー機能があるので、raspberry piとかIoTデバイスのセンサー情報をBigQueryに
送信することに使えると思います。

HTTP(S)トリガーですが、POSTのみ対応なので、注意が必要です。

 

 

2016年4月8日
から hiruta
gcpja night に参加しました。 #gcpja はコメントを受け付けていません。

gcpja night に参加しました。 #gcpja

4/6 gcpja nightに参加しました。ポイントを。

  • Machine Learning

Google PhotosとかNeural Networkがバックエンドで使われている

iOS app in Swift でラベル認識結果をfirebaseに送るデモ

Speech API

4ステップ程度で簡単に使える。多言語対応はされていない

周囲のノイズの環境でも問題ないようなことも

  • GCP Update

Cloud BigTableは、R/Wとも高速。ただし、GCEとCloud BigTableは同一リージョンにいる場合。

http://googlecloudplatform-japan.blogspot.jp/2016/04/cloud-bigtable-250.html

ダウンタイム無しでディスク拡張ができる。auto resizingに対応しているOSとしていないOSがあるようです。詳細に記載されています。

https://cloud.google.com/compute/docs/disks/persistent-disks#resize_pd

  • GCP Next Feedback

GCP Nextでは新サービスの発表もさほどなかったとのこと。東京リージョン発表も先出しになったし。

キーノートをライブで見ましたが、セキュリティ、インフラの優位性をアピールしていたとのこと

Vision API個人識別まではできない。Google Photos等 のサービスで年齢とかできているので、Vision APIは個人識別とかは省かれているかも。

Cloud Machine Learning

GPU計算にも対応。GPUインスタンスも今後出る可能性もある?

BigQueryも90日以上前のデータのストレージ単価は1/2。スキーマの自動検出

CloudIAMにより、リソース制限を細かく。

2016年3月27日
から hiruta
Google Cloud FounctionsからBigQueryへのアクセス #gcpja #gcpug はコメントを受け付けていません。

Google Cloud FounctionsからBigQueryへのアクセス #gcpja #gcpug

Google Cloud Founctionsからgcloudのnode.js moduleでbigqueryにアクセスをしてみました。

が、デプロイ失敗。

$ gcloud alpha functions deploy bigquerytest --bucket XXXXX-deploy --trigger-http
Copying file:///tmp/tmp6OEBwr/fun.zip [Content-Type=application/zip]...
Uploading ...deploy/us-central1-bigquerytest-zyupwaipvuxb.zip: 16 MiB/16 MiB
Waiting for operation to finish...failed.
ERROR: (gcloud.alpha.functions.deploy) OperationError: code=13, message=Error during function code deployment: User function failed to load: Code in file index.js can't be parsed. Please check whether syntax is correct.
Detailed stack trace: Error: Module version mismatch. Expected 14, got 46.
at Error (native)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Module.require (module.js:365:17)
at require (module.js:384:17)
at Object.<anonymous> (/user_code/node_modules/gcloud/node_modules/grpc/src/node/src/grpc_extension.js:38:15)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)

モジュールバージョンが合っていないエラーのようだ。

Alphaテスター用google group(cloud-functions-trusted-testers)だと、同じ症状が起きている方の回答を見ると、0.12.7で動くとのこと。

I’ve changed the version of node.js gcloud dependency to 0.28.0 and it has fixed the problem.
What version of node.js are you using ? The function runs under node.js in version 0.12.7.

Ubuntu 14.10には下記node.jsのバージョンがインストールされている。新しめのが入っていた。

hiruta@ubuntu:~$ node -v
v4.4.0
hiruta@ubuntu:~$ npm -v
2.14.20

該当するnode.jsをダウンロードして試してみました。

$ wget https://nodejs.org/download/release/v0.12.7/node-v0.12.7-linux-x64.tar.gz 

パッケージjsonも作成。

$ cat package.json
{
"name": "bigquerytest",
"version": "1.0.0",
"description": "",
"main": "index.js",
"dependencies": {
"gcloud": "^0.28.0"
},
"devDependencies": {},
"scripts": {
"test": "npm test"
}
}
 npm install gcloud --save 

vi index.js
var gcloud = require('gcloud')({
projectId: '<PROJECT ID>'
});

exports.bigquerytest = function (context, data){
var bigquery = gcloud.bigquery();

var query = 'SELECT url FROM [bigquery-public-data:samples.github_nested] LIMIT 20';
bigquery.query(query, function(err, rows, nextQuery) {
if (err) {
console.log('err::', err);
}
console.log(rows);
if (nextQuery) {
bigquery.query(nextQuery, function(err, rows, nextQuery) {});
}
console.log(rows);
});
context.success();
};

credentialsは別段指定する必要がない。Backendのインスタンス(alpha版の場合、GKE)でCloud APIへのアクセスが許可されているため。
ただし、projectIdの記載は必要です。

$  gcloud alpha functions deploy  bigquerytest  --bucket XXXXX-deploy --trigger-http

デプロイが成功したら、Functions用のHTTP(S) Endpointsにアクセスしてみます。

$ curl -X POST <Functions用のEndPoinit>

ログに、BigQueryから情報が取得できています。

$ gcloud alpha functions get-logs

また、GCSにnginx等のアクセスログを退避して、Cloud FounctionsでBigQueryにinsertするユースケースにも使えると思われます。