クラウドインフラ構築記

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

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するユースケースにも使えると思われます。

2016年3月12日
から hiruta
Google Cloud Functions 試用レポート #gcpja #gcpug はコメントを受け付けていません

Google Cloud Functions 試用レポート #gcpja #gcpug

gcf_email_img

AWS LambdaライクなEvent Driven なサービスがGoogle Cloud Platformにも、以前書きましたが、
Google Cloud Functionsが使えるようになりましたので、レポートします。

まずは、プログラムコードをアップロードするGCSバケットを作成しておきます。

$ gsutil mb gs://BUCKET/
 $ mkdir helloworld; cd helloworld 

まずは、お約束なhelloworldから

$ vi index.js
exports.helloworld = function (context, data) {
context.success('Hello World!');
};

次に、コードのデプロイ。実行トリガーとして、HTTPトリガーを指定しています。HTTPトリガーはAWS API Gatewayに近い。
ただし、HTTP POSTのみ対応しており、GETは現状未対応になります。
トリガーとして、GCS、Google Pub/Subがそのほかに対応しています。

Cron トリガーについては、テスター用のGoogle Groupで今後対応しそうなdiscussionがありました。

Cron triggering for Cloud Functions is on our radar.

$ gcloud alpha functions deploy helloworld --bucket BUCKET --trigger-http
Copying file:///tmp/tmpjPc7fq/fun.zip [Content-Type=application/zip]...
Uploading ...g-deploy/us-centra
l1-helloworld-mtlxhowupkjw.zip: 193 B/193 B
Waiting for operation to finish...done.
entryPoint: helloworld
gcsUrl: gs://BUCKET/us-central1-helloworld-mtlxhowupkjw.zip
latestOperation: operation-adc6aebf-e0d9-471e-92fb-8cdf865fc206
name: projects/PROJECT_ID/regions/us-central1/functions/helloworld
status: READY
triggers:
- webTrigger:
url: https://us-central1.PROJECTID.cloudfunctions.net/helloworld

初回のデプロイは、GKE Clusterを作成する(クラスタ数2)ので、多少時間がかかります。

$ curl -X POST https://us-central1.PROJECTID.cloudfunctions.net/helloworld
Hello World!

Cloud Function用のSSL証明書として、Let’s Encrypt Authority X1が使われていることを確認。

画像4

実行ログを確認すると、functionsコールは1 ms。

$ gcloud alpha functions get-logs helloworld
LEVEL NAME EXECUTION_ID TIME_UTC LOG
D helloworld - 2016-03-12 00:36:54.512 User function helloworld loaded
D helloworld OLsMt0WnTFFG-0 2016-03-12 00:38:20.796 User function triggered, starting execution
D helloworld OLsMt0WnTFFG-0 2016-03-12 00:38:20.797 Execution took 1 ms, user function completed successfully

最後に、Cloud Founctionsの削除。


$ gcloud alpha functions delete helloworld
Resource [projects/PROJECTID/regions/us-central1/functions/h
elloworld] will be deleted.

Do you want to continue (Y/n)? y

Waiting for operation to finish...done.
Deleted [projects/PROJECTID/regions/us-central1/functions/helloworld].

Google Cloud Functions削除してもGKE cluterが削除されません。GKEクラスタはn1-standard-1(クラスタのタイプは変えられない?)。

GKE Clusterを頻度に削除すると、週5の証明書の制限に抵触して接続が行えなくなることがあります。

I inspected your logs – we are not really supporting a model in which you would remove clusters that often
(after every deployment).
That is why you got issues with HTTPS (hitting limit on number certificates,
currently 5 per week for whole project). HTTP (without S) endpoint should be fine.

The workaround would be not to remove clusters after each “test” – instead let them run –
you should get a coupon from us to finance it for a while.

 

実行環境のDebianの実行コマンドをnode.jsから実行させることもむろん可能です。


$ vi index.js
var exec = require('child_process').exec;

exports.sampletest = function ( context,data) {
child = exec(data.cmd, function (error) {
context.done(error, 'Process complete!');
});

child.stdout.on('data', console.log);
child.stdout.on('data', console.error);
};
$ gcloud alpha functions deploy sampletest --bucket cms-stg-deploy  --trigger-http
$ curl -X POST https://us-central1.PROJECTID.cloudfunctions.net/sampletest --data '{"cmd":"cat  /etc/debian_version"}'
$ gcloud alpha functions get-logs
sampletest nRrOVegpcqrn-0 2016-03-12 01:11:34.008 7.9

Cloud Functionsの実行環境としてはDebian 7.9が使われていますことがわかります。BigQuery、DataStoreとの連携も可能かと。BackendでVMインスタンスが利用されていますが、インスタンスの管理が低減できる。

現在以下Execution Failureがあるようです。

  • リトライの保証はないが、60秒間隔で2回行われること
  • 最大実行時間60秒(デフォルトでデプロイ時に変更可能)
  • Functionsが無限ループを起こす場合、ブロックされる。

2016年2月25日
から hiruta
無料SSL証明書Let’s Encrypt 導入してみました。 はコメントを受け付けていません

無料SSL証明書Let’s Encrypt 導入してみました。

https://letsencrypt.org/ 無料SSL証明書を導入してみました。

letsencrypt-autoを実行すると、必須パッケージをもろもろダウンロード、インストールを自動で行ってくれます。

./letsencrypt-auto certonly --webroot --webroot-path /www -d <domain> -d www.<domain>

GCP HTTP Load balancerで使うためには、global forwarding ruleを追加します。

screencapture-console-cloud-google-com-networking-loadbalancing-http-details-web-map-globalForwardingRules-add-1456408980943

上記Certificateから、SSL証明書、秘密鍵、中間証明書を登録します。

GCP HTTP Load balancerにも発行した証明書を登録できました。ただ、中間証明書は、letsencrpt-autoコマンドで作成されたものではなく、下記から取得しました。中間証明書は、Let’s Encrypt Authority X2でなく、Let’s Encrypt Authority X1を使います。

https://letsencrypt.org/certificates/

Redirect Loopを防ぐのに、nginxの設定を一部変更しています。

location / {
root /www;
index index.php index.html index.htm;
if ($http_x_forwarded_proto = "http") {
rewrite ^/(.*)$ https://www.domain/$1 permanent;
}

また、ブログとしてWordpressを利用している場合、wp-config.phpも変更します。

define('FORCE_SSL_ADMIN', true);
if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) {
$_SERVER['HTTPS']='on';
}

ただ、Let’s EncryptのSSL証明書は三ヶ月と短いので、更新の自動化は必要かと。

SSL証明書の更新自動化は下記を使えばできそうか。

gcloud compute ssl-certificates create NAME --certificate LOCAL_FILE_PATH --private-key LOCAL_FILE_PATH [--description DESCRIPTION] [GLOBAL-FLAG …]
gcloud compute target-https-proxies update NAME [--ssl-certificate SSL_CERTIFICATE | --url-map URL_MAP] [GLOBAL-FLAG …]

2016年2月14日
から hiruta
Google Cloud Functionsアルファー版公開 #gcpja はコメントを受け付けていません

Google Cloud Functionsアルファー版公開 #gcpja

Google Cloud Functionsがアルファー版公開。

ついに、GCPでもサーバーレスアーキテクチャー

現時点で公式に公開されている情報をまとめてみました。

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

マネージドサーバー、実行環境なしで特定機能を利用できるイベントベース非同期のコンピュートソリューション

AWS LambdaのGCS版てところ。

  • マネジードのNode.js実行環境上で実行することができる。
  • イベントトリガーは、Google Cloud Storage、Cloud Pub/Subからのイベントをトリガに実行できる
    ※スケジュール機能はdocsから見る限り現時点ではなさそうな印象

GCS(Google Cloud Storage)をトリガーとして対応しているので、GCSに蓄積されるbilling ログをBigQueryに入れる実装が可能になると思われます。

ログはCloud Loggingに出力されます。
data パラメータにCloud Pub/Subあるいは、Google Cloud Storageバケットから送られたメッセージが含まれているようです。BigQuery Client libraries なども使えるのではと思われます。

module.exports = {
helloworld: function (context, data) {
if (data.message !== undefined) {
// Everything is ok
console.log(data.message);
context.success();
} else {
// This is an error case
context.failure('No message defined!');
}
}
};

gcloud コマンドでデプロイ、ログ確認、テスト実行等が行えるようですが、Web UIから行えるかは不明。

Cloud Functionsの実行時間等Limitの情報はdocsから確認することができない。制限があるかも不明。

2016年2月14日
から hiruta
Googe Cloud Vision GCSに対応 #gcpja はコメントを受け付けていません

Googe Cloud Vision GCSに対応 #gcpja

Cloud Vision Early Access ProgramのGoogleグループに流れていたことですが、Cloud Visionは、Google Cloud Storageの画像を読み込むことが可能になっています。

ようやく動作できるように(解析結果がレスポンスデータとして戻ってくるように)なりましたので、サンプルコードを掲載します。

下記ソースのbatch_requestのところがポイント。


from PIL import Image
from PIL import ImageDraw
from pprint import pprint
# The url template to retrieve the discovery document for trusted testers.
DISCOVERY_URL='https://{api}.googleapis.com/$discovery/rest?version={apiVersion}'

def get_vision_service():
credentials = GoogleCredentials.get_application_default()
return discovery.build('vision', 'v1', credentials=credentials,discoveryServiceUrl=DISCOVERY_URL)

def main():

batch_request = [{
'image': {
'source': {
'gcs_image_uri': "gs://XXXXXXXXX/top-bnr-70.png"
}
},
'features': [{
'type': 'FACE_DETECTION',
'maxResults': 30,
}]
}]

service = get_vision_service()
request = service.images().annotate(body={
'requests': batch_request,
})
response = request.execute()
pprint(response['responses'][0])

faces = response['responses'][0]['faceAnnotations']

Googleでは、Google Cloud Visionだけでなく、音声認識、Google Photo等Deep Learningをすでに運用されているので、Google Cloud Visionも解析にDeep Learning技術を使用しています。

Deep LearningのFrameworkとして切り出して公開されているのが、TensorFlowになります。(分散環境に対応したTensorFlowも公開されるとのこと)

TensorFlowは複数台の分散環境(40G portsのスペックを有しているJupiter network)で初めて性能を発揮します。スタンドアロンでは性能を発揮できません。つまり、TensorFlowをAWSのGPインスタンスで動かしても期待して性能がでません。

なお、Google Cloud Vision は、数週間後パブリックβでだれでも使用できるようになるようです。

2016年2月11日
から hiruta
Hadoop Spark Conference 2016参加レポート #hcj2016 はコメントを受け付けていません

Hadoop Spark Conference 2016参加レポート #hcj2016

2/8 のHadoop Spark Conference 2016 参加サポートです。今回はSpark Conference 併催になります。1,300名を超える申込者と人気で、各セッション立ち見も出るほど1日中熱気に満たしていました。

キーノート

Hadoopはひとつものではなくなった。

従来は、HDFS+MapReduceが中核でしたが、組み合わせで使っていく方向に。

パッケージの多様化。

並列分散エンジン(Apache Tez)も登場し、現在変化も激しいので、現在の状況を見ておくことが重要

hadoop上で多様なエコシステムが動作している。

バッチ処理をストリーミング処理を透過的に行えるものも。Google Dataflow (Apache Beam)

https://cloud.google.com/dataflow/blog/dataflow-beam-and-spark-comparison

ResourceManagerであるYARNもCPUだけでなく、GPCPUなどにも焦点を置く方向に。

HDFSについても、SSD、メモリの活用で中間データのR/Wの高速化

無停止でローリングアップデート

メンテナンスリリース(2.6、2.7)の継続、Java8対応

Spark 2.0

ユースケースてには、BIが一番。Dataware、レコメンドエンジン、ログ、不正検出等にも

サブクエリー、ビューもDataFrames APIで

Tungsten backendでStreamingの課題を解決

Next-gen Streaming with Dataframesは数週間後発表があるので

Spark 2.0では、125 million rows/secのベンチ結果も。(1.6では13.95 milliion rows/sec)

今年4月~5月にリリース予定。

JVMチューニング

heap memoryのサイズを変更するだけでパフォーマンスが変わる

Spark 1.6ではGCのオーバーヘッドが減っている

ストリーミングアーキテクチャー StateからFlowへ

3-Tierとマイクロサービスの違い

従来のバッチの有限の入出力に対し、ストリーミングは、無限の入出力、サービス間遅延にも考慮が要

非同期なサービス間疎結合の設計が必要

これに対応できるのが、Kafka、MapR Stream

ビックデータ可視化の性能を検証

DWHに比べて、デフォルト設定のHiveは遅い

Spark SQLは、ヒット件数が多だと、1/2

チューニングポイント

エグゼキュータ、パーティション数

データフォーマット

Hive

分散処理エンジンにMR使用している場合は、Apache Tezへの切替を

 

MLLib Now and Beyond

[slideshare id=58034098&doc=2016-02-06spark-conference-japan-160209041021]

手軽に機械学習を扱うことができる

DataSetとDataFrameは今後統合予定

MLLib Pipeline API

Modelを、S3他クラウドストレージに保存することもできるが、永続化に対応していないアルゴリズムもあるので注意が必要

MLLib 2.0 Roadmap

時系列データのSparkでの処理

時系列データをSparkで扱うと不便になるのでは?

が、結論時系列データも問題なく扱える。

Hive on Spark

Hiveは遅い。Hiveクエリによっては、数時間、1日かかるケースも

Hive on Sparkは、HiveQ互換なので、Hive資産の再利用も可能、バッチ処理が1/3になる。

また、Spark on elasticSearch -hadoop データの可視化ツールとして導入コストも低くそうな印象でした。standaloneのSpark 1.6の環境で試してみよう。