tag:blogger.com,1999:blog-44631935081794517762024-03-05T15:23:01.285+09:00Google Cloud Platform Japan 公式ブログ最新情報や使い方、チュートリアル、国内外の事例やイベントについてお伝えします。Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.comBlogger1071125tag:blogger.com,1999:blog-4463193508179451776.post-1597596237996109522019-08-02T10:50:00.001+09:002019-08-02T10:50:23.003+09:00Google Cloud Japan / GCP Japan 公式ブログ移行のお知らせ<div dir="ltr" style="line-height: 1.56; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: inherit;"><span style="background-color: white; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">いつも Google Cloud Japan Blog ならびに GCP Japan Blog をご覧いただきありがとうございます。</span><span style="background-color: white; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">本ブログは、2019 年 8 月 2 日(金)をもちまして、新プラットフォームに統合し移行いたしました。</span></span><span style="background-color: white; white-space: pre-wrap;">今後は、以下の新しい Google Cloud Japan 公式ブログより最新情報をお届けしてまいります。ぜひ、新しいブログをブックマークしてお楽しみください。</span></span></div>
<span id="docs-internal-guid-943b8870-7fff-69fe-70a3-66c24b92ca4d" style="font-weight: normal;"><span style="font-family: inherit;"><br /></span></span>
<div dir="ltr" style="line-height: 1.56; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: inherit;"><span style="background-color: white; color: red; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">New!</span><span style="background-color: white; color: black; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;"> Google Cloud Japan 公式ブログ</span></span></div>
<div dir="ltr" style="line-height: 1.56; margin-bottom: 0pt; margin-top: 0pt;">
<a href="http://cloud.google.com/blog/ja" style="text-decoration-line: none;" target="_blank"><span style="background-color: white; color: #1155cc; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; text-decoration-line: underline; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">http://cloud.google.com/blog/ja</span></span></a></div>
<div dir="ltr" style="line-height: 1.56; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: inherit;"><span style="background-color: white; color: black; font-family: inherit; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.56; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: inherit;"><span style="background-color: white; color: black; font-family: inherit; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.56; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: inherit;"><span style="background-color: white; color: black; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">※US 版 Google Cloud Blog の URL は </span><a href="http://cloud.google.com/blog" style="text-decoration-line: none;" target="_blank"><span style="background-color: white; color: #1155cc; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; vertical-align: baseline; white-space: pre-wrap;">http://cloud.google.com/blog</span></a><span style="background-color: white; color: black; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> です。ページ下部の言語設定ボタンから言語(英語コンテンツと日本語コンテンツ)の切り替えが可能です。もしくは、URL " </span><a href="https://cloud.google.com/blog/ja" style="text-decoration-line: none;" target="_blank"><span style="background-color: white; color: #1155cc; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; vertical-align: baseline; white-space: pre-wrap;">https://cloud.google.com/blog/ja</span></a><span style="background-color: white; color: black; font-size: 9pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> "の最後の "ja" の箇所を削除、もしくは追加することで言語の切り替えが可能です。</span></span></div>
<span style="font-weight: normal;"><br /></span>
<div dir="ltr" style="line-height: 1.56; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: white; color: black; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.56; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: white; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.56; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: white; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">なお、本ブログは、今後数か月間でクローズいたします。2017 年以降のブログポストについては、新プラットフォームに統合し移行してまいります。新しいブログ上の、カテゴリや検索機能から該当ポストをお探しください。</span></span></div>
<span style="font-weight: normal;"><span style="font-family: inherit;"><br /></span></span>
<div dir="ltr" style="line-height: 1.56; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: white; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">また、最新情報は随時 Google Cloud Japan の Facebook および Twitter でもお知らせいたします。ぜひこちらも合わせてフォローいただければ幸いです。</span></span></div>
<span style="font-weight: normal;"><span style="font-family: inherit;"><br /></span></span>
<span style="font-weight: normal;"><span style="font-family: inherit;"><br /></span></span>
<div dir="ltr" style="line-height: 1.56; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: inherit;"><span style="background-color: white; color: black; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Facebook:</span><a href="https://www.facebook.com/GoogleCloudJapan" style="text-decoration-line: none;" target="_blank"><span style="background-color: white; color: #1155cc; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; vertical-align: baseline; white-space: pre-wrap;">@GoogleCloudJapan</span></a></span></div>
<div dir="ltr" style="line-height: 1.56; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: inherit;"><span style="background-color: white; color: black; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">Twitter:</span><a href="https://twitter.com/googlecloud_jp" style="text-decoration-line: none;" target="_blank"><span style="background-color: white; color: #1155cc; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; vertical-align: baseline; white-space: pre-wrap;">@googlecloud_jp</span></a></span></div>
<span style="font-family: inherit;"><br /></span>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: white; color: black; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;"><br /></span></span>
<span style="background-color: white; color: black; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;"><br /></span></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: white; color: black; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: inherit;">今後とも Google Cloud Japan をよろしくお願いいたします。</span></span></div>
Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-78596170430450249712019-07-22T11:00:00.000+09:002019-07-22T11:47:05.034+09:00株式会社ブロードリーフの導入事例: 新世代の大規模ビジネス プラットフォーム『Broadleaf Cloud Platform』を Google Cloud Platform 上に構築<br />
<div style="text-align: center;">
<a href="https://lh5.googleusercontent.com/Eek01K3J3IaMMqb8A1mQY2mVO7Njlk1lqePX28fJtuSwVlcBFkDWczDosoFzpJfV0mqlWT9eUjYBVT04gUe4aqZlek8y2xeqPV7-Xn5CBRIkO5HqU6Oga7ah51JOKaZ-Pr3enKM2" imageanchor="1" target="_blank"><img border="0" src="https://lh5.googleusercontent.com/Eek01K3J3IaMMqb8A1mQY2mVO7Njlk1lqePX28fJtuSwVlcBFkDWczDosoFzpJfV0mqlWT9eUjYBVT04gUe4aqZlek8y2xeqPV7-Xn5CBRIkO5HqU6Oga7ah51JOKaZ-Pr3enKM2" /></a></div>
<br />
約 10 兆円とも言われる自動車アフター マーケットの業務支援ソフトウェア メーカーとして、国内トップクラスのシェアを誇る株式会社ブロードリーフ。そんな同社が今取り組んでいるのが、「ブロードリーフのビジネスを変える」ためのプラットフォーム作り。昨今のビジネス環境変化を受けて、パッケージ ソフトを制作・販売する企業から、プラットフォーマーへの転針を図る同社は、Google Cloud Platform(GCP)に何を期待しているのでしょうか?<br />
<br />
<div style="text-align: center;">
<img border="0" height="401" src="https://lh6.googleusercontent.com/i5TPXi7kMWeDQys_F_jefcelkSSDSmteVaHDojmHWC9nsNUleZnZRZR8ooYsxwoc-zNjAfJpbOqDlrjgimxOyD1Ws8pLLPHKaWLKxp4NGTCcRBcdlY5wIdbmlPsuqTIg1uPbUIye" width="602" /></div>
<br />
利用している Google Cloud Platform サービス<br />
<blockquote class="tr_bq">
<a href="https://cloud.google.com/bigquery/" target="_blank">BigQuery</a>、<a href="https://cloud.google.com/kubernetes-engine/" target="_blank">Google Kubernetes Engine</a> など</blockquote>
<br />
お話を伺った方<br />
<ul>
<li>開発本部 基盤開発部 部長 祖慶 良大氏(写真)</li>
</ul>
<ul>
<li>開発本部 基盤開発部 松本 宏紀氏(インタビュー内のみ登場)</li>
</ul>
<br />
<a href="https://www.broadleaf.co.jp/" target="_blank">株式会社ブロードリーフ</a><br />
<blockquote class="tr_bq">
整備工場など、自動車アフター マーケットを中心に、携帯電話販売代理店、旅行代理店など、幅広い業種・業界の現場業務を支援するソフトウエア・ITソリューション&各種サービスを提供(約 3 万社が利用)。近年は中国、フィリピンなど、アジア地域へも進出している。2005 年 12 月創業。開発拠点は東京・札幌・福岡の 3 か所。従業員数は 921 人(2018 年 12 月末時点)。</blockquote>
<br />
<h3>
Google Cloud ならではの高品質なネットワークと開発環境としての GKE に魅力を感じた</h3>
「我々が GCP で実現したかったのは、ブロードリーフのビジネスを変えること。今回、その第一歩として、整備事業者向けの販売管理システム『Maintenance.c』を開発・提供開始しましたが、その背景には、昨今、お客さまを取り巻くビジネス環境が変容しつつあり、これまで提供していた機能的な価値に加え、EDI(Electronic Data Interchange/電子データ交換)などへの対応などが求められるようになったことが挙げられます。そこで、約 4 年前、ブロードリーフの提供する各種ソフトウェア・サービスをクラウドに移行した、新たなビジネス プラットフォームを構築することを決断しました。」(祖慶さん)<br />
<br />
そのプラットフォームの名は『Broadleaf Cloud Platform』。計画は約 4 年前に立案され、プロトタイピング ベースでの検証を経て、約 2 年前から GCP 上での本格的な開発がスタートしました。<br />
<br />
「開発に際し、主要なクラウド プラットフォームは一通り検証したのですが、GCP を選んだのにはいくつか理由があります。何より大きかったのがネットワークが充実していること。我々の提供するサービスは一般的なデータベースと比べて、かなりサイズの大きなデータをやり取りするため、GCP の回線の太さは魅力的でした。ちなみに、自動車アフター マーケット業界は取り扱うデータの種類がとにかく多いことも特徴の 1 つ。車種データだけでも何十万件レコード、その部品データに至ってはなんと約 4 億 6,000 万レコードにもなります。同じ型式の車でも地域やオプションの違いなどによって 1 台 1 台細かく異なる部品が使われていますから、そうしたデータを安定して、スピーディに検索できることは導入の最低条件でした。また、将来的にビジネスの規模に合わせてどこまでもスケールできること、月末月初や決算期、繁忙期(自動車業界の場合、2~3 月)のスパイクに耐えられるスケーラビリティも必要でした。加えて、BigQuery のように Google Cloud にしかないエッジの立ったサービスが多く揃っていたことも決定を後押ししています。」(祖慶さん)<br />
<br />
「開発チームとしては、Google Kubernetes Engine(GKE)の存在が大きかったですね。PaaS は便利な反面、ベンダー依存が大きくなるため、それを避けるために Kubernetes を利用することを決めたのですが、GKE ならそれをフルマネージドで利用できます。当時、それができるのは GCP だけだったんですよ。具体的には新しいサービスのプロダクション環境を構築するのに、従来のオンプレ環境では機材調達からネットワーク設定までを含めて数週間かかっていたものが、約1時間でできるようになりました。開発時もバージョンアップ作業などを効率的に実施できるようになり、1日20回以上の頻繁なバージョンアップも可能になりました。」(松本さん)<br />
<br />
なお、ブロードリーフは今回のビジネス プラットフォーム構築のタイミングで、モノリシックだったサービスを、GKE を駆使してマイクロサービス化。業界特有のノウハウが必要なものを国内3つの開発拠点で分散開発した上で、顧客管理や売上管理などは外部のベンダーに外注し、効率的にサービスを構築していったそうです。<br />
<br />
「マイクロサービス化には『Broadleaf Cloud Platform』を将来的にサードパーティ ベンダーに開放したいという狙いもあります。」(祖慶さん)<br />
<br />
「なお、GKE の利用に際しては、GKE を意識しない開発と運用をできるよう注意しています。実のところ、Kubernetes に詳しいエンジニアはまだまだ少ないですから、Kubernetes に詳しくないと開発できない、運用できないという状況は避けたかったんです。ですので、基本的には GitOps でソースをマージしたら、GitLab CI で Docker イメージをビルドして、開発環境であれば自動的にデプロイされるというようなかたちにしています。GKE ならマスターやノードの管理をしなくて良いのも助かっていますね。GKE のおかげで開発効率がかなり上がっていると感じています。」(松本さん)<br />
<div style="text-align: center;">
<img border="0" height="401" src="https://lh5.googleusercontent.com/xBEKA7_rEr_Hg6j7aLznPhRVCqaNy6kVio-6r47qfBaC6vzBY_zZn3lAoYYSai6RSSZiGWZPEr1rnp62A031izrbhPolqyLOdOgvBdIri07zBRRn8Elb_9-hHt6RqxYWJ9XMXy5Q" width="602" /></div>
<div style="text-align: center;">
<span style="font-size: small;">東京・札幌・福岡に分散している開発拠点間のやりとりには Hangouts Meet を活用</span></div>
<br />
<br />
<h3>
</h3>
<h3>
蓄積されたビッグデータを BigQuery × AI で積極的に活用</h3>
サービスのクラウド プラットフォーム化によってもたらされる恩恵の 1 つが、より能動的なビッグデータ活用が可能になること。事実、ブロードリーフが GCP を採用した理由の 1 つには膨大なデータを瞬時に解析できる BigQuery の存在も大きかったそうです。<br />
<br />
「具体的にはログの解析・集計のほか、検索動向の分析などにも利用しています。よく検索されているということは、そこが故障しやすい箇所ということ。さらに言えば、リコールの予兆とも言えます。『Maintenance.c』では AI 技術なども駆使して、これをシステム上でサジェストする仕組みを用意し、利用者(修理工場)が顧客(修理依頼者)に早めの問題解決を提案するなどできるようにしました。クラウド移行以前もこうした方法論はあったものの、リソースが不足しており実現できていませんでした。もちろん、大手自動車メーカーもすでにこうした取り組みを進めていると思いますが、ブロードリーフはそれをメーカーの壁を越えて横断的に行えるのが強みです。なお、AI 活用については、今後さらに推し進めていく予定。たとえば車の情報だけでなく、お客さまの特性も学習させ、入庫する前により適切なサジェストができるようにするなどといったことを考えています。また、<a href="https://cloud.google.com/vision/" target="_blank">Cloud Vision API</a> でナンバープレートを自動認識させたり、<a href="https://cloud.google.com/speech-to-text/" target="_blank">Cloud Speech-to-Text API</a> でお客さまとの電話内容などを自動的にテキスト化したりといったことも検討中です。」(祖慶さん)<br />
<br />
まずは約 3 万社という既存顧客を対象に機能強化を進めている『Broadleaf Cloud Platform』。こうしたエンタープライズ領域に GCP を利用することについて、2 年前の時点では不安もあったと祖慶さん、松本さんは当時をふり返ります。<br />
<br />
「当時はまだ、エンタープライズ領域で GCP の採用事例が少なかったため、可用性の点で若干の不安がありました。ただ、実際に 2 年ほど GCP を利用してみて、今は高い信頼性と安定感を備えたプラットフォームであることを実感しています。」(松本さん)<br />
<br />
「現在はハイブリッド クラウドの時代ですから、それぞれの強みの部分を積極的に使っていくべき。GCP は特にマネージドなサービスが充実しているので、そうした点をより拡充していって欲しいですね。」(祖慶さん)<br />
<br />
「今後は、GCP のマネージドなサービスを積極的に活用していって、運用の負荷を下げていくことも考えて行きたいですね。面倒なことはすべて Google Cloud に任せて(笑)、自分たちがより開発に専念していけるのが理想です。」(松本さん)<br />
<br />
現在は予定通りに進行しているという『Broadleaf Cloud Platform』によるブロードリーフ事業のクラウド移行。今後はグローバル展開も推進していきたいとのことです。<br />
<br />
「日本の自動車は世界中で走っています。中には古い車も多く、そのアフター マーケットは今後、ますます拡大していくことになるでしょう。国内と同様にサービスを提供し、データを収集していくためも、世界中に展開されている GCP のネットワークに期待しています。」(祖慶さん)<br />
<br />
<div style="text-align: center;">
<img border="0" height="344" src="https://lh6.googleusercontent.com/_AEYL8_LQtJiUjqXG9acvPDfokPH0Dt_vlHftbNVu0_MYmSkfVebwnWPAhtIwiFl0JTYnEWQ2PwEvY4YdXg1XSJJ0MUwpNJ5K-MreQAAnuT1UWzKgvQBTrbNqDdWcvY8nzrjSbFH" width="516" /></div>
<div style="text-align: center;">
<span style="font-size: small;">今回の取材では、札幌拠点に勤務している松本氏が Hangouts Meet でインタビューに参加している</span></div>
<br />
<br />
<br />
株式会社ブロードリーフの導入事例 PDF は<a href="http://lp.cloudplatformonline.com/rs/808-GJW-314/images/Google_GCP_broadleaf.pdf" target="_blank">こちら</a>をご覧ください。<br />
その他の導入事例は<a href="https://cloud.google.com/customers/" target="_blank">こちら</a>をご覧ください。Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-63611088248926279062019-07-12T10:00:00.000+09:002019-07-12T11:20:49.320+09:00Google Kubernetes Engine で進化戦略を実行する方法<div class="separator" style="clear: both; text-align: center;">
<a href="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/MLInGSuite_V2-02_RLA3zRs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="444" data-original-width="800" height="354" src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/MLInGSuite_V2-02_RLA3zRs.png" width="640" /></a></div>
<br />
<i>*この記事は Yujin Tang と David Ha による Cloud Blog の記事 "<a href="https://cloud.google.com/blog/products/ai-machine-learning/how-to-run-evolution-strategies-on-google-kubernetes-engine" target="_blank">How to run evolution strategies on Google Kubernetes Engine</a>" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。</i><br />
<br />
強化学習(RL)は、<a href="https://ai.googleblog.com/2019/03/simulated-policy-learning-in-video.html" target="_blank">ゲーム</a>、<a href="https://deepmind.com/blog/alphazero-shedding-new-light-grand-games-chess-shogi-and-go/" target="_blank">チェス</a>、<a href="https://ai.google/research/teams/brain/robotics/" target="_blank">ロボティクス</a>ですばらしい成果をあげており、それとともに機械学習コミュニティでの人気も高まっています。<a href="https://cloud.google.com/blog/products/ai-machine-learning/deep-reinforcement-learning-on-gcp-using-hyperparameters-and-cloud-ml-engine-to-best-openai-gym-games" target="_blank">以前のブログ投稿</a>では、Google の強力なコンピューティング インフラや、ハイパーパラメータのベイズ最適化などスマートなトレーニング サービスを活用して、<a href="https://cloud.google.com/ai-platform/" target="_blank">AI Platform</a> で RL アルゴリズムを実行する方法を紹介しました。このブログでは、進化戦略(ES)アルゴリズムについて説明し、<a href="https://cloud.google.com/kubernetes-engine/" target="_blank">Google Kubernetes Engine</a>(GKE)で実行する方法を紹介します。<br />
<br />
<a href="https://en.wikipedia.org/wiki/Evolution_strategy" target="_blank">進化戦略</a>は、進化の考え方に基づいた最適化テクニックです。最近、ES は RL に代わってさまざまな難題に対処するものと見なされるようになっています(<a href="https://arxiv.org/abs/1703.03864" target="_blank">1</a>、<a href="https://arxiv.org/abs/1712.06567" target="_blank">2</a>)。特に、ノイズの多いポリシー最適化の勾配推定をバイパスでき、かつ収束の早い分散コンピューティングに向いた性質を備えているという 2 点が、よく知られている ES のメリットとしてあげられます。ES は 1960 年代に開発され、容易にスケールする点がメリットとして知られていました。しかし、研究コミュニティのオープンソース プロジェクト(<a href="https://github.com/openai/evolution-strategies-starter" target="_blank">Salimans 他、2007 年</a>)によって、ES を大量のマシンにスケーリングすることで RL アルゴリズムの最高性能に匹敵する結果を出せることが実証されたのは、つい最近のことです。そのため、最新の研究に進化型のアルゴリズムを取り入れる方法を探るディープ ラーニング分野のリサーチャがますます増えています(<a href="https://arxiv.org/abs/1802.01548" target="_blank">1</a>、<a href="https://arxiv.org/abs/1806.10230" target="_blank">2</a>、<a href="https://arxiv.org/abs/1901.11117" target="_blank">3</a>、<a href="https://arxiv.org/abs/1804.02395" target="_blank">4</a>、<a href="https://worldmodels.github.io/" target="_blank">5</a>)。<br />
<br />
進化型コンピューティング アルゴリズムをスケーリングする優れたインフラストラクチャを構築すれば、この領域はさらに進展するということは判明していましたが、大規模システム開発に明るい研究者は多くはいません。幸い、ここ数年間で Kubernetes などのテクノロジーが生み出され、専門のエンジニアでなくても簡単に分散環境によるソリューションを構築できるようになりました。そこで本稿では、Kubernetes を活用してスケーラブルな進化型アルゴリズムをデプロイする仕組みの実例を紹介します。コードと手順も<a href="https://github.com/lerrytang/es_on_gke" target="_blank">こちら</a>で公開していますので、ML 研究において GKE 上で ES を試す際の参考にお役立てください。<br />
<br />
ちなみに、Google Cloud では<a href="https://cloud.google.com/ml-engine/docs/distributed-training-containers" target="_blank">コンテナによる分散トレーニング</a>が可能なプラットフォームとして AI Platform も提供しています。AI Platform では TensorFlow と同様の分散処理をサポートする ML フレームワークが利用可能です。しかしその目的は、おもにモデルを非同期でトレーニングすることであり、次のセクションで説明するような ES の分散コンピューティングの目的とは異なります。<br />
<h3 dir="ltr">
進化戦略入門</h3>
ES は一種のブラックボックス最適化です。ベースとなるタスクや関数に勾配がない場合や、勾配の計算が非常に複雑な場合、または勾配推定にノイズが多く学習できない場合など、勾配ベースのアルゴリズムではうまく解決できない ML タスクに有効です。例として、下の図の左側に示す地形に立っていることを想像してみてください。あなたのタスクは、目隠しをして最も低い場所へ向かうことです。あなたは複数の魔法の玉を持っており、それを介してしか周囲の状況を知ることができません。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://storage.googleapis.com/gweb-cloudblog-publish/images/sphere_and_Rastrigin_function.max-700x700.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="231" data-original-width="700" height="210" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/sphere_and_Rastrigin_function.max-700x700.png" width="640" /></a></div>
<div style="text-align: center;">
<i>図 1. 球関数(左)と Rastrigin 関数(右)(出典: Wikipedia)</i></div>
<div style="text-align: center;">
<br /></div>
大ざっぱに言えば、勾配ベースのアルゴリズムでは、玉を落として転がしながら行く先を決めるというステップを経ていきます。玉の動く速さを見て、一番速く転がる方向(勾配が一番急な方向)に進みます。左側の地形であれば、このルールに従って何度か玉転がしを繰り返せばゴールにたどり着けます。しかし、同じやり方を右側の地形で試すとどうなるでしょうか。おそらく、山に囲まれた谷底にはまってしまい、目標は達成できないでしょう。<br />
<br />
ES のアプローチはこれとはまったく異なります。最適化のステップごとに、複数回の試行を行います。そして、高い適応度(fitness)を示した設定に基づいて進み先を決めます(適応度とは、試行がどのくらい優れているかを測る指標です。上図の地形の例では地面の高さがそれに当たり、低いほど適応度が高いことになります。RL で言えば試行で得られる累積報酬に当たります)。この過程を通じて、適応度が低い試行は取り除かれ、適応度がもっとも高いものだけが生き残ります。これが進化の過程に似ているため、進化戦略という名前が付けられています。<br />
<br />
先ほどのたとえに当てはめて ES の仕組みを説明するなら、各ステップで玉を落として転がす代わりにピストルに玉を込めて数発を発射し、いくつかの玉を周囲に散りばめる、ということになります。それぞれの玉が地面に打たれた時点で位置と高度がわかるので、ステップを繰り返すうちに高度が低いと推定される場所に徐々に移動していけます。この方法は、図の左右どちらの地形にもうまく働きます(高い山の向こうにも届く強力なピストルを使うことを想定します)。またこの方法なら、複数回の試行を同時に実行することで最適化を簡単に高速化できます。ますたとえるならピストルの代わりに散弾銃を使うようなものです。<br />
<br />
ここまで、ES の基本的な考え方と仕組みを説明しました。さらに興味がある方は、筆者による<a href="http://blog.otoro.net/2017/10/29/visual-evolution-strategies/" target="_blank">ブログ</a>記事に<a href="http://blog.otoro.net/2017/11/12/evolving-stable-strategies/" target="_blank">より</a>詳しい説明が記載されていますので、ぜひ読んでみてください。<br />
<h3 dir="ltr">
Kubernetes 入門</h3>
Kubernetes は、コンテナ化したワークロードとサービスを宣言的な設定や自動化を活用して管理するためのプラットフォームです。Google が開発を始め、2014 年にオープンソース化されました。Kubernetes を詳細に解説するには何ページも必要なので、ここでは概説にとどめ、ES への応用を中心に説明します。<br />
<br />
これまでの説明で、ES がいわゆるコントローラ ワーカー(controller-worker) アーキテクチャで実装できることが分かるかと思います。この場合、ある設定で試行するようコントローラがワーカーに命令し、ワーカーから戻ってきた結果に基づいて最適化を進める、という処理を繰り返し行います。この実装方法について、先ほどの地形の例を使って Kubernetes 上で ES を実行する方法の定義と説明を書いてみましょう。<br />
<br />
今回は、銃や玉は使いません。その代わり、携帯電話で誰かに連絡して玉を発射してもらえます。ただしその前に、何を実行したいのかを具体的に伝えなければなりません(この例では、玉を発射してもらうことです)。そこで「サービス プロバイダへのメモ」に仕様を記述します。また記録のため「自分用のメモ」も準備します。サービス プロバイダにこの仕様を送れば、そこからは Kubernates の楽しい仕掛けが動き始めます。<br />
<br />
<br />
<table style="border-collapse: collapse; border: none; table-layout: fixed; width: 468pt;"><colgroup><col></col><col></col></colgroup><tbody>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><b>サービス プロバイダへのメモ</b></td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;"><b>自分へのメモ</b></td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;">タスク名<br />
Kubernetes による ES 実行の説明<br />
<br />
設定<br />
<ul>
<li>タスク実行用にクルマを 10 台用意。もしクルマが足りなければ、クルマを追加</li>
<li>玉の射撃手を 100 人用意</li>
<li>連絡係を 1 人用意</li>
</ul>
<br />
やるべきこと<br />
サービス プロバイダへ、<br />
<br />
私はこれから、私がどこにいるか、いくつの玉を撃ちたいか、どこに向けて撃ちたいかを指示します。そこにクルマを移動し、玉を撃ち、玉が当たった位置と高さを教えてください。</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;">タスク名<br />
Kubernetes による ES 実行の説明<br />
<br />
やるべきこと<br />
自分へ、<br />
<br />
ゲームが終わるまで、以下を繰り返し実行する。<br />
<br />
<ol>
<li>サービス プロバイダを呼び出し、自分がどこにいるか、玉をいくつ撃つか、どの方向に撃つかを伝える</li>
<li>玉が当たった位置と高さをサービス プロバイダから受け取る</li>
<li>ES アルゴリズムを使い、受け取った位置と高さに基づき次に移動すべき場所を計算する</li>
</ol>
<br /></td></tr>
</tbody></table>
<br />
<br />
この仕様を Kubernetes で実装する場合、サービス プロバイダへのメモにある「やるべきこと」の部分をワーカーのプログラムとして記述し、自分用のメモの部分をコントローラのプログラムとして記述します。これらをいくつかのランタイム ライブラリと合わせてパッケージ化し、コンテナ イメージを作成します。そして Kubernetes がサービス プロバイダとなり、ワークロードと呼ばれる仕様を受け取り。ワークロードはコンテナ イメージとリソースなどのいくつかのシステム設定で構成されます。<br />
<br />
上記例にある 10 台のクルマは、クラスタ内の 10 個のノードに相当します。また 100 人の玉の射撃手は、実行したいコンテナ(Kubernetes の用語ではポッドと言います)の数を表します。Kubernetes は、これらのポッドを用意する責任を持ちます。また 100 人の射撃手を用意できても、個々の射撃手と直接やりとりして結果を集めたりするのは面倒な作業です。中には、病気で休んだ人(マシンの再起動により動作していないコンテナ)が、あなたの知らない別の人(新しく起動したコンテナ)に仕事を引き継いでいるかもしれません。こうした面倒に対処するため、Kubernetes はワークロードをサービスとして公開し、コントローラとワーカーの連絡窓口とします。サービスは関連するポッドを取りまとめているので、いつでもポッドに取り次いでくれるうえ、負荷の分散も可能です。<br />
<br />
プラットフォームとして Kubernetes を使うと、高可用性(希望どおりの数のポッドを確実に実行可能)と大きな拡張性(実行時にポッドを追加・削除可能)が得られます。こうした性質を備えた Kubernetes は、ES に理想的なプラットフォームだと私たちは考えています。また、Kubernetes の<a href="https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-repair?hl=en" target="_blank">可用性</a>と<a href="https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-autoscaler" target="_blank">拡張性</a>をノードレベルにまで拡張する GKE を導入することで、さらに優れたプラットフォームが実現可能です。<br />
<h3 dir="ltr">
GKE による ES の実装</h3>
では、ES の実装方法の詳細と、それを GKE で実行する手順を見ていきましょう。コードと実装手順は<a href="https://github.com/lerrytang/es_on_gke" target="_blank">こちら</a>でアクセスできます。<br />
<h3 dir="ltr">
実装</h3>
上述のとおり、実装にはコントローラ ワーカー アーキテクチャを採用します。各ワーカーは独立したサーバーで構成され、コントローラがクライアントとなります。プロセス間通信には gRPC を利用します。リモート プロシージャ コール(RPC)はデータを渡す手段としてはメッセージ パッシング インターフェース(MPI)などの他の選択肢ほど高効率ではありません。しかしデータのパッケージングが簡単で耐障害性も高いため、クラウド環境ではよく使われています。<br />
<br />
次のコード スニペットに、メッセージの定義を示します。「ロールアウト」とは 1 回の試行を表しており、rollout_reward はロールアウトから返される適応度です。<br />
<br />
<div class="h-c-grid">
<div class="uni-paragraph
h-c-grid__col h-c-grid__col--8 h-c-grid__col-m--6 h-c-grid__col-l--6
h-c-grid__col--offset-2 h-c-grid__col-m--offset-3 h-c-grid__col-l--offset-3">
<!----><!----><!----><article-code-block _nghost-c14="" class="ng-star-inserted"><!----></article-code-block><br />
<pre _ngcontent-c14=""> <!----><code _ngcontent-c14="" class="ng-star-inserted">message RolloutRequest {
</code><code _ngcontent-c14="" class="ng-star-inserted"> // Index of rollout
</code><code _ngcontent-c14="" class="ng-star-inserted"> int32 rollout_index = 1;
</code><code _ngcontent-c14="" class="ng-star-inserted"> // Random seed from the master
</code><code _ngcontent-c14="" class="ng-star-inserted"> int32 env_seed = 2;
</code><code _ngcontent-c14="" class="ng-star-inserted"> // The weights of the neural network policy
</code><code _ngcontent-c14="" class="ng-star-inserted"> Repeated double policy_weights = 3;
</code><code _ngcontent-c14="" class="ng-star-inserted"> // Whether this request is evaluation
</code><code _ngcontent-c14="" class="ng-star-inserted"> bool evaluate = 4;
</code><code _ngcontent-c14="" class="ng-star-inserted">}
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted">message RolloutResponse {
</code><code _ngcontent-c14="" class="ng-star-inserted"> // Index of rollout
</code><code _ngcontent-c14="" class="ng-star-inserted"> int32 rollout_index = 1;
</code><code _ngcontent-c14="" class="ng-star-inserted"> // The reward collected in the rollout
</code><code _ngcontent-c14="" class="ng-star-inserted"> double rollout_rewards = 2;
</code><code _ngcontent-c14="" class="ng-star-inserted">}
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted">service Rollout {
</code><code _ngcontent-c14="" class="ng-star-inserted"> // The RPC service for policy evaluation
</code><code _ngcontent-c14="" class="ng-star-inserted"> rpc RolloutWithParameter(RolloutRequest) returns (RolloutResponse) {}
</code><code _ngcontent-c14="" class="ng-star-inserted">}</code>
</pre>
</div>
</div>
<br />
このサンプルで利用する ES アルゴリズムは、<a href="https://github.com/hardmaru/estool" target="_blank">estool</a> に基づく Parameter-exploring Policy Gradients(PEPG)と 、<a href="https://github.com/CMA-ES/pycma" target="_blank">pycma</a> に基づく Covariance Matrix Adaptation(CMA)です。これらは解決がとりわけ難しい連続制御 RL 環境である Google Brain の <a href="https://github.com/bulletphysics/bullet3/tree/master/examples/pybullet/gym/pybullet_envs/minitaur/envs" target="_blank">Minitaur Locomotion</a> や OpenAI の <a href="https://github.com/openai/gym/wiki/Leaderboard#bipedalwalkerhardcore-v2" target="_blank">BipedalWalkerHardcore-v2</a> でも試せます。また、コードを拡張して ES アルゴリズムを追加したり、設定を変更して独自の環境でアルゴリズムを試したりすることも簡単です。具体的には、algorithm.solver.Solver で定義されたインターフェースに従った実装であれば他のコードと合わせて実行できるはずです。<br />
<h3 dir="ltr">
GKE で ES を実行する</h3>
GKE でのコードの実行には、<a href="https://cloud.google.com/" target="_blank">Google Cloud Platform</a>(GCP)で動作するクラスタが必要です。<a href="https://cloud.google.com/kubernetes-engine/docs/how-to/creating-a-cluster" target="_blank">こちら</a>の手順に従ってクラスタを作成します。この例では、次のコマンドと設定を使ってクラスタを作成しましたが、必要に応じて変更しても構いません。<br />
<br />
<div class="h-c-grid">
<div class="uni-paragraph
h-c-grid__col h-c-grid__col--8 h-c-grid__col-m--6 h-c-grid__col-l--6
h-c-grid__col--offset-2 h-c-grid__col-m--offset-3 h-c-grid__col-l--offset-3">
<!----><!----><!----><article-code-block _nghost-c14="" class="ng-star-inserted"><!----></article-code-block><br />
<pre _ngcontent-c14=""> <!----><code _ngcontent-c14="" class="ng-star-inserted">GCLOUD_PROJECT={your-project-id}
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"># Create a cluster.
</code><code _ngcontent-c14="" class="ng-star-inserted">gcloud container clusters create es-cluster \
</code><code _ngcontent-c14="" class="ng-star-inserted">--zone=us-central1-a \
</code><code _ngcontent-c14="" class="ng-star-inserted">--machine-type=n1-standard-64 \
</code><code _ngcontent-c14="" class="ng-star-inserted">--max-nodes=20 \
</code><code _ngcontent-c14="" class="ng-star-inserted">--min-nodes=16 \
</code><code _ngcontent-c14="" class="ng-star-inserted">--num-nodes=17 \
</code><code _ngcontent-c14="" class="ng-star-inserted">--enable-autoscaling \
</code><code _ngcontent-c14="" class="ng-star-inserted">--project ${GCLOUD_PROJECT}</code>
</pre>
</div>
</div>
<br />
クラスタができたら、次の 3 つのステップでサンプルの ES コードを GKE で実行できます。それぞれ簡単な bash コマンドです。<br />
<ol>
<li>コントローラとワーカーのコンテナ イメージをビルドする</li>
<li>ワーカーをクラスタにデプロイする</li>
<li>コントローラをクラスタにデプロイする</li>
</ol>
<div class="h-c-grid">
<div class="uni-paragraph
h-c-grid__col h-c-grid__col--8 h-c-grid__col-m--6 h-c-grid__col-l--6
h-c-grid__col--offset-2 h-c-grid__col-m--offset-3 h-c-grid__col-l--offset-3">
<!----><!----><!----><article-code-block _nghost-c14="" class="ng-star-inserted"><!----></article-code-block><br />
<pre _ngcontent-c14=""> <!----><code _ngcontent-c14="" class="ng-star-inserted"># Step 1: Build a container image for the controller and the workers.
</code><code _ngcontent-c14="" class="ng-star-inserted">gcloud builds submit \
</code><code _ngcontent-c14="" class="ng-star-inserted">--tag gcr.io/${GCLOUD_PROJECT}/es-on-gke:1.0 . \
</code><code _ngcontent-c14="" class="ng-star-inserted">--timeout 3600 \
</code><code _ngcontent-c14="" class="ng-star-inserted">--project ${GCLOUD_PROJECT}
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"># Step 2: Replace the ${GCLOUD_PROJECT} in the YAML file and run the command.
</code><code _ngcontent-c14="" class="ng-star-inserted">kubectl apply -f deploy_workers.yaml
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"># Step 3: When all the workers are started and running,
</code><code _ngcontent-c14="" class="ng-star-inserted"># replace the ${GCLOUD_PROJECT} in the YAML file and run the command.
</code><code _ngcontent-c14="" class="ng-star-inserted">kubectl apply -f deploy_master.yaml</code>
</pre>
</div>
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp_console_O3XicUg.max-600x600.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="99" data-original-width="600" height="104" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp_console_O3XicUg.max-600x600.png" width="640" /></a></div>
<div style="text-align: center;">
<i>図 2. デプロイが成功した GCP コンソールの例</i></div>
<br />
以上です。これで、GKE 上の指定した環境で ES のトレーニングが実行されています。<br />
<br />
トレーニング プロセスの確認は、次の 3 つの方法で行えます。<br />
<ol>
<li><b>Stackdriver</b>—GCP コンソールで [GKE Workloads] ページをクリックすると、ポッドの詳細ステータス レポートが表示されます。es-master-pod の詳細に移動すると、[Container logs] から Stackdriver のログを確認できます。ここから、トレーニングやテストの報酬を確認します。</li>
<li><b>HTTP サーバー</b>—今回のコードではコントローラ内で簡単な HTTP サーバーが動作しており、トレーニングのログに簡単にアクセスできます。[GKE Services] ページにある es-master-service のエンドポイントからアクセスできます。</li>
<li><b>kubectl</b>—kubectl コマンドでもログやモデルを取得できます。例として以下のコマンドを示します。</li>
</ol>
<div class="h-c-grid">
<div class="uni-paragraph
h-c-grid__col h-c-grid__col--8 h-c-grid__col-m--6 h-c-grid__col-l--6
h-c-grid__col--offset-2 h-c-grid__col-m--offset-3 h-c-grid__col-l--offset-3">
<!----><!----><!----><article-code-block _nghost-c14="" class="ng-star-inserted"><!----></article-code-block><br />
<pre _ngcontent-c14=""> <!----><code _ngcontent-c14="" class="ng-star-inserted">POD_NAME=$(kubectl get pod | grep es-master | awk '{print $1}')
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"># Download reward vs time plot.
</code><code _ngcontent-c14="" class="ng-star-inserted">kubectl cp $POD_NAME:/var/log/es/log/reward_vs_time.png $HOME/
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"># Download reward vs iteration plot.
</code><code _ngcontent-c14="" class="ng-star-inserted">kubectl cp $POD_NAME:/var/log/es/log/reward_vs_iteration.png $HOME/
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"># Download best model so far.
</code><code _ngcontent-c14="" class="ng-star-inserted">kubectl cp $POD_NAME:/var/log/es/log/best_model.npz $HOME/
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"># Download model at iteration 1000.
</code><code _ngcontent-c14="" class="ng-star-inserted">kubectl cp $POD_NAME:/var/log/es/log/model_1000.npz $HOME/
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"># Download all test scores.
</code><code _ngcontent-c14="" class="ng-star-inserted">kubectl cp $POD_NAME:/var/log/es/log/scores.csv $HOME/</code>
</pre>
</div>
</div>
<h3 dir="ltr">
ローカルで ES を実行する</h3>
トレーニングとテストの両方をローカルで実行してデバッグに利用できます。train_local.sh と test.py に適切なオプションを追加して使います。<br />
<br />
<div class="h-c-grid">
<div class="uni-paragraph
h-c-grid__col h-c-grid__col--8 h-c-grid__col-m--6 h-c-grid__col-l--6
h-c-grid__col--offset-2 h-c-grid__col-m--offset-3 h-c-grid__col-l--offset-3">
<!----><!----><!----><article-code-block _nghost-c14="" class="ng-star-inserted"><!----></article-code-block><br />
<pre _ngcontent-c14=""> <!----><code _ngcontent-c14="" class="ng-star-inserted"># Train locally.
</code><code _ngcontent-c14="" class="ng-star-inserted"># E.g. bash ./train_local.sh -c configs/BipedalWalkerHardcore.gin -n 10
</code><code _ngcontent-c14="" class="ng-star-inserted">bash ./train_local.sh -c {path-to-config-file} -n {number-of-workers}
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"># Test locally.
</code><code _ngcontent-c14="" class="ng-star-inserted"># E.g. python test.py --checkpoint=1000 --logdir=./log
</code><code _ngcontent-c14="" class="ng-star-inserted">python test.py --checkpoint={checkpoint} --logdir={path-to-log-directory}</code>
</pre>
</div>
</div>
<h3 dir="ltr">
実験結果</h3>
では、GKE で ES を実行するメリットを 2 つの例を通じて確認しましょう。1 つは OpenAI の BipedalWalkerHardcore 環境で CMA を使ってトレーニングした 2D ウォーカー、もう 1 つは Google Brain の MinitaurLocomotion 環境の四足歩行ロボットです。ここでは、テスト試行で 100 回連続して TargetReward よりも大きな平均報酬を実現できれば、エージェントがタスクを解決したと見なします。RL で試せばわかりますが、どちらのタスクも難易度はかなり高いです。<br />
<br />
次の表は、実験環境の設定についてまとめたものです。比較のため、スタンドアロンの 64 コア Google Compute Engine インスタンスでも実験を行いました。この Compute Engine インスタンスのワーカーの数は、CPU 使用率が 90% を超えるように調整します。<br />
<br />
<br />
表 1. 実験構成<br />
<table style="border-collapse: collapse; border: none; table-layout: fixed; width: 468pt;"><colgroup><col></col><col></col><col></col><col></col></colgroup><tbody>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;">環境</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;">アルゴリズム</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;">TargetReward</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;">ワーカー数</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;">BipedalWalkerHardcore</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;">CMA</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;">300</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;">1000 (GKE), 58-60 (GCE)</td></tr>
<tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;">MinitaurLocomotion</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;">PEPG</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;">13</td><td style="border-bottom: solid #000000 1pt; border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-top: solid #000000 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt 5pt 5pt 5pt; vertical-align: top;">1000 (GKE), 58-60 (GCE)</td></tr>
</tbody></table>
<br />
<br />
今回の実装では、両方のタスクをクリアできました。結果を下に示します。<br />
<br />
厳密にはタスクの内容に依存しますが、GKE で ES を実行すると速度を大幅に向上できる可能性があります。今回の例では、BipedalWalkerHardcore の学習は 5 倍、四足歩行ロボットの学習は 10 倍以上高速です。ML 研究においてこの高速化はより多くのアイデアを試すチャンスとなり、ML アルゴリズム開発のイテレーションの向上にもつながります。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/BipedalWalkerHardcore.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="444" data-original-width="800" height="354" src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/BipedalWalkerHardcore.gif" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/minitaurlocomotion.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="444" data-original-width="800" height="354" src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/minitaurlocomotion.gif" width="640" /></a></div>
<h3 dir="ltr">
まとめ</h3>
ES は、勾配ベースのアルゴリズムでよい結果が得られない ML タスクに対して強力なソリューションとなります。ES には並列処理との親和性が高い性質があるので、Kubernetes で ES を実行することで大幅な高速化を実現できます。これにより、ML リサーチャやエンジニアが新しいアイデアを試すイテレーションのスピードが上がります。<br />
<br />
簡単にスケールできるという ES の力をもっとも活かせる応用は、難しい問題を解くためのシミュレーション環境をローコストに用意できるケースです。最近の研究(<a href="https://ai.googleblog.com/2017/10/closing-simulation-to-reality-gap-for.html" target="_blank">1</a>、<a href="https://arxiv.org/abs/1808.00177" target="_blank">2</a>)では、コントローラを実環境にデプロイする前に、まずシミュレーションで仮想ロボット コントローラをトレーニングする方法が効果的であることが実証されています。また、手作業のプログラミングではなく、収集した観測結果から学習で得られたディープラーニング モデルでもシミュレーション環境を実現できます(<a href="https://worldmodels.github.io/" target="_blank">1</a>、<a href="https://planetrl.github.io/" target="_blank">2</a>、<a href="https://ai.googleblog.com/2019/03/simulated-policy-learning-in-video.html" target="_blank">3</a>)。こうした応用であれば、ES のスケーリングを活かした数 1000 ノード規模の並列シミュレーション環境での学習が可能でしょう。<br />
<br />
進化の手法を用いると最適化する対象の選択肢がぐんと広がるため、従来の RL ポリシー最適化では対応できなかったさまざまな応用が可能です。たとえば、この<a href="https://designrl.github.io/" target="_blank">最新の研究</a>では RL 環境で ES を使い、ポリシーのトレーニングだけでなくより優れたロボットの設計まで学習しています。進化の手法を使うジェネラティブ デザインの領域では、ずっと多くの<a href="https://www.joelsimon.net/evo_floorplans.html" target="_blank">クリエイティブな応用</a>が生まれるはずです。また、この<a href="https://weightagnostic.github.io/" target="_blank">最新の研究成果</a>では、複数の RL タスクを実行できる最小のニューラル ネットワーク アーキテクチャが、進化型アルゴリズムを使うことでパラメータのトレーニングなしで得られることを実証しています。この結果は多くの ML リサーチャを驚かせ、進化の手法が切り拓くまったく新しい研究分野の存在を示しています。<br />
<br />
ディープ ラーニングの革命は、大規模なディープ ニューラル ネットワークのトレーニングを実現する GPU が触媒となり生じました。同様に、ローコストな CPU で構成された大規模クラスタへ簡単にスケールできる進化の手法は、これからのコンピューティング革命をリードするカギとなるでしょう。<br />
<br />
GKE や Kubernetes によるディープラーニングの詳細については以下をご覧ください。<br />
<ul>
<li><a href="https://cloud.google.com/kubernetes-engine/" target="_blank">Kubernetes Engine</a></li>
<li><a href="https://www.kubeflow.org/docs/gke/gcp-e2e/" target="_blank">GCP でのエンドツーエンド Kubeflow</a></li>
</ul>
Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-11038368993989162962019-07-11T15:00:00.000+09:002019-07-12T08:43:56.241+09:00Google Cloud Next ’19 in Tokyo - 夜のおすすめセッションおよび認定資格取得者向け特典のご案内<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrdsRz3SoOxhhJxiCA4c0or1prVFYY78hXB4ZMRuKMMJs1nqjhUm-yOR7wS417xcvH9UI0NS0_l36hrm_7mUGCW1JnC_iBUi336jPmwcLGo3CTasJ0y6EtTpWtcfUEqEv_uh9Q8a1E_LDL/s1600/NEXT_Tokyo_2019_banner+%25281%2529.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="320" data-original-width="640" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrdsRz3SoOxhhJxiCA4c0or1prVFYY78hXB4ZMRuKMMJs1nqjhUm-yOR7wS417xcvH9UI0NS0_l36hrm_7mUGCW1JnC_iBUi336jPmwcLGo3CTasJ0y6EtTpWtcfUEqEv_uh9Q8a1E_LDL/s640/NEXT_Tokyo_2019_banner+%25281%2529.jpg" width="640" /></a></div>
<div style="text-align: center;">
<br /></div>
Google Cloud Next ’19 in Tokyo の開催まで、3 週間を切りました。イベントへのお申し込みおよびセッション登録はお済みでしょうか? 本日は、7 月 31 日(水)の夜の時間帯に開催するセッションをピックアップしてご紹介します。18 時以降に開催するセッションでは、お弁当を提供させていただきますので、お仕事帰りにぜひお気軽にご参加ください。なお、ご来場の際には事前の<a href="https://cloud.withgoogle.com/next/tokyo?utm_source=google&utm_medium=social&utm_campaign=FY19-Q3-apac-next-physicalevent-er-gen_reg_scl&utm_content=gsblog" target="_blank">イベント申し込み・希望セッションへの登録</a> をお願いいたします。<br />
<br />
<br />
<h3 dir="ltr">
テーマ:データ分析 </h3>
7 月 31 日(水)| 5:20–6 PM <br />
<a href="https://cloud.withgoogle.com/next/tokyo/sessions?session=D1-5-S03&utm_source=google&utm_medium=social&utm_campaign=FY19-Q3-apac-next-physicalevent-er-gen_reg_scl&utm_content=gsblog" target="_blank"><strong>D1-5-S03</strong></a> <strong>Google Cloud Platform でゲノム解析</strong><br />
GCP が提供する Genomics Pipelines API はゲノムの変異検出を高速かつ安価に実現することを可能にします。また BigQuery を活用することで、膨大な変異情報を標準的なSQLで解析することが可能になります。このセッションでは、GCP 上で、GATK や DeepVariant、ワークフローエンジン などのオープンソースを使用し、ゲノムデータをエンドツーエンドで解析する方法を学びます。<br />
<br />
<h3 dir="ltr">
テーマ: DevOps、SRE</h3>
7 月 31 日(水)| 6:40–7:20 PM<br />
<a href="https://cloud.withgoogle.com/next/tokyo/sessions?session=D1-6-S07&utm_source=google&utm_medium=social&utm_campaign=FY19-Q3-apac-next-physicalevent-er-gen_reg_scl&utm_content=gsblog" target="_blank"><strong>D1-6-S07</strong></a><strong> 開発者向け DevOps プラットフォーム 〜 メディアストリーム解析サービスでの GCP 活用 〜</strong><br />
NTTコミュニケーションズは、映像音声のリアルタイム解析に特化した開発者向け DevOps プラットフォーム『SkyWay Media Pipeline Factory』をリリースしました。 GKE や Stackdriver などの GCP サービスと、各種 3rd party API とをサーバレス / マイクロサービス アーキテクチャにより結合することにより、高いアジリティ、マルチテナント分離、分散コンポーネント管理を実現した GCP ベスト プラクティスを、デモを交えて紹介します。<br />
<br />
<h3 dir="ltr">
テーマ:アプリケーション開発 </h3>
7 月 31 日(水)| 6:40–7:20 PM<br />
<a href="https://cloud.withgoogle.com/next/tokyo/sessions?session=D1-6-S01&utm_source=google&utm_medium=social&utm_campaign=FY19-Q3-apac-next-physicalevent-er-gen_reg_scl&utm_content=gsblog" target="_blank"><strong>D1-6-S01</strong></a><strong> 失敗から学ぶ GCP 〜「ほしい本が必ず見つかる!」honto での書店の在庫検索システム構築〜</strong><br />
ハイブリッド型総合書店「honto」と、アプリ「honto with」では、自分のほしい本がどの店舗にあるか分かる在庫検索機能があります。現在 GCP 上で安定稼働しているこのシステムでは 1 億件を超える在庫データの参照、更新を可能にしています。このシステムを構築、運用するにあたっての数々の失敗と、どうやって乗り越えたかを共有します。<br />
<br />
<h3 dir="ltr">
テーマ:ハイブリッド クラウド</h3>
7 月 31 日(水)| 6:40–7:20 PM<br />
<a href="https://cloud.withgoogle.com/next/tokyo/sessions?session=D1-6-S03&utm_source=google&utm_medium=social&utm_campaign=FY19-Q3-apac-next-physicalevent-er-gen_reg_scl&utm_content=gsblog" target="_blank"><strong>D1-6-S03</strong></a><strong> AdTech / MarTech エリアにおける GCP 活用 〜GKE を利用した DAC 、CRM ソリューションの移行〜</strong><br />
AdTech / MarTech エリアにおけるGCP活用例として、デジタル広告ビジネスを統合的に展開しているデジタル・アドバタイジング・コンソーシアム株式会社のCRMソリューション、DialogOne の移行事例を紹介します。 DialogOne を GCP に移行することを決めた理由、移行にあたっての学び、今後の展望について話します。<br />
<br />
<h3 dir="ltr">
テーマ:ストレージ </h3>
7 月 31 日(水)| 7:40–8:20 PM<br />
<a href="https://cloud.withgoogle.com/next/tokyo/sessions?session=D1-7-S07&utm_source=google&utm_medium=social&utm_campaign=FY19-Q3-apac-next-physicalevent-er-gen_reg_scl&utm_content=gsblog" target="_blank"><strong>D1-7-S07</strong></a><strong> ユースケースで見る FileStorage の最適化</strong><br />
本セッションでは、GCP における FileStorage の活用について、プロダクトの概要、機能、価格、そしてユースケースにおける最適なストレージの選択についてご紹介します。また、他の GCP のサービスとの連携にしたファイルのワークフローについてデモでご紹介します。<br />
<br />
<h3 dir="ltr">
テーマ:ハイブリッド クラウド </h3>
7 月 31 日(水)| 7:40–8:20 PM<br />
<strong><a href="https://cloud.withgoogle.com/next/tokyo/sessions?session=D1-7-S04&utm_source=google&utm_medium=social&utm_campaign=FY19-Q3-apac-next-physicalevent-er-gen_reg_scl&utm_content=gsblog" target="_blank">D1-7-S04</a> ゼロから始める Google Kubernetes Engine 〜Kubernetes の基本からクラウドネイティブ・アプリの運用まで</strong><br />
Google Kubernetes Engine は小規模アプリから大規模システムまで、本番環境に必要な様々な機能を備えています。本講演では Kubernetes の基本となる機能、簡単なアプリの展開に加え、自動スケールやモニタリングなど Google Kubernetes Engine を最大限に活用した、クラウドネイティブ・アプリの運用方針までご紹介します。<br />
<br />
<h3 dir="ltr">
テーマ:セキュリティ </h3>
7 月 31 日(水)| 7:40–8:20 PM <br />
<a href="https://cloud.withgoogle.com/next/tokyo/sessions?session=D1-7-S01&utm_source=google&utm_medium=social&utm_campaign=FY19-Q3-apac-next-physicalevent-er-gen_reg_scl&utm_content=gsblog" target="_blank"><strong>D1-7-S01</strong></a><strong> 実例から学ぶ、VPC Service Control Deep Dive</strong><br />
Google Cloud では企業の中の機密データの価値を最大化するため、その前提となる機密データを企業内で安全に扱うための方法として VPC Service Control という機能を提供しております。このセッションではその詳細を、実際に実装されたお客様の実例とともに解説します。<br />
<br />
<br />
なお、7 月 31 日(水)・ 8 月 1 日(木)の 2 日間は、12:00 - 18:00 の時間帯で Google Cloud 認定資格取得者向けの特典をご用意しています。こちらにもぜひ足をお運びください。<br />
<br />
<strong>Google Cloud Certified Lounge</strong><br />
Google Cloud 認定資格取得者専用のラウンジを東京プリンスホテル 11 階 Room H にご用意しております。ラウンジでリフレッシュしていただき、Google Cloud Next ’19 in Tokyo を 100% お楽しみください。<br />
<br />
<strong>Google Cloud 認定資格取得者特典</strong><br />
Google Cloud 認定資格取得者の特典として、Google Cloud スペシャル バックパックをご用意しています。東京プリンスホテル 11 階 Room H、Google Cloud Certified Loung にお立ち寄りください。<br />
<br />
<strong>ハンズオンラボ</strong><br />
実際に GCP Console を使って、Google Cloud のサービスを体験しませんか?初級から上級の演習を、自分のペースで行っていただけます。Google エキスパートが質問対応をいたします。東京プリンスホテル 3 階 Room F にお越しください。<br />
<br />
<br />
————————————————————<br />
お問い合わせ先<br />
Google Cloud Next Tokyo 運営事務局<br />
gc-nexttokyo-info@google.com<br />Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-33531257765586073372019-07-05T09:00:00.000+09:002019-07-05T09:00:00.465+09:00Kaggle Kernels ノートブックで BigQuery データを分析<div class="separator" style="clear: both; text-align: center;">
<a href="https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp_bq_kaggle.max-2000x2000.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="334" data-original-width="800" height="266" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/gcp_bq_kaggle.max-2000x2000.png" width="640" /></a></div>
<span style="font-size: small;">※この投稿は米国時間 2019 年 6 月 25 日に Google Cloud blog に<a href="https://cloud.google.com/blog/products/data-analytics/analyze-bigquery-data-with-kaggle-kernels-notebooks" target="_blank">投稿</a>されたものの抄訳です。</span><br />
<br />
Google Cloud のエンタープライズ向けクラウド データ ウェアハウスである <a href="https://cloud.google.com/bigquery/?hl=ja" target="_blank">BigQuery</a> に <a href="https://kaggle.com/" target="_blank">Kaggle</a> が統合されました。BigQuery をご利用のお客様は、超高速の SQL クエリを実行し、SQL で機械学習モデルをトレーニングし、Kernels でそのモデルを分析できるようになります。Kernels とは、無料で使える Kaggle のホステッド Jupyter ノートブック環境です。<br />
<br />
BigQuery と Kaggle Kernels を一緒に使うことで、直感的に扱える開発環境を使用して BigQuery データにクエリを実行し、データの移動やダウンロードなしで機械学習を行えます。Kernels ノートブックまたはスクリプトに Google Cloud アカウントをリンクすると、<a href="https://googleapis.github.io/google-cloud-python/latest/bigquery/generated/google.cloud.bigquery.client.Client.html" target="_blank">BigQuery API Client ライブラリ</a>を使ってノートブックで直接クエリを組み立て、BigQuery で実行するという形で、ほぼあらゆるタイプのデータ分析が可能になります。たとえば、Matplotlib、scikit-learn、XGBoost など最新のデータ サイエンス ライブラリをインポートすれば、結果を可視化したり、最先端の機械学習モデルをトレーニングしたりすることができます。さらに、Kernels の無料使用枠は、GPU と最大 16 GB の RAM を使って 9 時間実行できるという贅沢な内容です。Kernels が提供する機能の詳細は <a href="https://www.kaggle.com/docs/kernels#technical-specifications" target="_blank">Kaggle のドキュメント</a>をご覧ください。<br />
<br />
300 万人以上のユーザーを抱える Kaggle は、データ サイエンティストたちがデータの探索や分析、その成果のシェアのために集まる世界的なオンライン コミュニティです。Python か R の <a href="https://www.kaggle.com/kernels" target="_blank">Kernels</a> ノートブックを起動すればすぐにコーディングを開始でき、ほかの人々が書いた 20 万以上の公開 Kernels からヒントを得ることができます。<br />
<br />
BigQuery のお客様にとって何よりも大きいのは、クエリや分析を 1 か所にまとめられる IDE(統合開発環境)、すなわち Kaggle Kernels を使えることでしょう。データ サイエンティストの仕事は細切れになりがちで、従来はクエリ エディタでクエリを実行し、そのデータを別の場所にエクスポートして分析を終えていましたが、Kernels はそれらをシームレスにつないで 1 つにまとめます。<br />
<br />
しかも、Kaggle は Kernels を簡単に公開できるシェアのためのプラットフォームです。オープンソースの仕事を広めたり、世界最高レベルのデータ サイエンティストたちと議論したりすることができます。<br />
<br />
<h3>
Kaggle と BigQuery の始め方</h3>
BigQuery を初めてお使いになる方は、<a href="https://cloudplatform-jp.googleblog.com/2019/03/query-without-a-credit-card-introducing-bigquery-sandbox.html" target="_blank">BigQuery サンドボックス</a>でアカウントを有効にしてください。これにより、最大で 10 GB のストレージ、1 か月あたり 1 TB のクエリ処理、10 GB の BigQuery ML モデル作成クエリを無料で使用できます(<a href="https://cloud.google.com/bigquery/pricing?hl=ja" target="_blank">料金体系の詳細</a>は BigQuery のドキュメントをご覧ください)。<br />
<br />
Kernels で BigQuery データセットを分析するには、まず <a href="https://www.kaggle.com/" target="_blank">Kaggle アカウントにサインアップ</a>します。サインインの後に、上のバーの “Kernels” をクリックし、さらに “New Kernel” をクリックすると、新しい IDE セッションがスタートします。Kernels にはスクリプトとノートブックの 2 つのタイプがあります。次に示すのはノートブック オプションの例です。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://storage.googleapis.com/gweb-cloudblog-publish/images/kaggle.max-2000x2000.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="434" data-original-width="800" height="346" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/kaggle.max-2000x2000.png" width="640" /></a></div>
次に、Kernels のエディタ環境で、右側にあるサイドバーの “BigQuery” をクリックし、続いて “Link an account” をクリックして、Kaggle アカウントに BigQuery アカウントを紐づけます。アカウントがリンクされたら、<a href="https://googleapis.github.io/google-cloud-python/latest/bigquery/generated/google.cloud.bigquery.client.Client.html" target="_blank">BigQuery API Client ライブラリ</a>を使ってご自分の BigQuery データセットにアクセスできます。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://storage.googleapis.com/gweb-cloudblog-publish/images/kaggle_bigquery.max-2000x2000.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="430" data-original-width="800" height="342" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/kaggle_bigquery.max-2000x2000.png" width="640" /></a></div>
Kaggle で公開されている <a href="https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data" target="_blank">Ames Housing データセット</a>を使用して、これを試してみましょう。このデータセットは米国アイオワ州エイムズに建つ住宅の(ほとんど)すべての側面を記述する 79 種の説明変数から成り、その最終販売価格も含まれています。このデータから情報を得るためにクエリを作ってみましょう。このデータセットにはどのような家のタイプが含まれているのでしょうか。また、セントラル空調を設置している家、設置していない家はどれくらいあるのでしょうか。クエリは次のとおりです。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://storage.googleapis.com/gweb-cloudblog-publish/images/kaggle_how_to_bigquery.max-2000x2000.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="572" data-original-width="800" height="456" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/kaggle_how_to_bigquery.max-2000x2000.png" width="640" /></a></div>
<div style="text-align: center;">
<br /></div>
エイムズで最も一般的な家のタイプは平屋建てで、タイプに関係なく、ほとんどの家にセントラル空調が設置されていることがすぐにわかります。Kaggle には、このような形で探索できる<a href="https://kaggle.com/datasets" target="_blank">公開データセット</a>がほかにもたくさんあります。<br />
<br />
<h3>
SQL クエリを使った機械学習モデルの構築</h3>
データ分析のほか、<a href="https://cloud.google.com/bigquery-ml/docs/bigqueryml-intro?hl=ja" target="_blank">BigQuery ML</a> では SQL クエリを使って機械学習モデルを作成、評価できます。機械学習フレームワークやプログラミング言語に関する詳細な知識がなくても、データ サイエンティストであれば、わずかなクエリだけで回帰モデルの構築や評価を行えるのです。ここでは、エイムズにある不動産の最終販売価格を予想する線形モデルを作ってみましょう。このモデルでは、居住スペースの広さ、築年数、条件全般、品質全般を入力としてトレーニングを行います。モデルのコードは次のようになります。<br />
<br />
<div>
<!----><!----><!---->
<article-code-block _nghost-c14="" class="ng-star-inserted"><!----></article-code-block>
<br />
<pre _ngcontent-c14=""> <!----><code _ngcontent-c14="" class="ng-star-inserted">model1 = """
</code><code _ngcontent-c14="" class="ng-star-inserted"> CREATE OR REPLACE MODEL
</code><code _ngcontent-c14="" class="ng-star-inserted"> `my-example-housing-dataset.ameshousing.linearmodel`
</code><code _ngcontent-c14="" class="ng-star-inserted"> OPTIONS(model_type='linear_reg', ls_init_learn_rate=.15, l1_reg=1, max_iterations=5) AS
</code><code _ngcontent-c14="" class="ng-star-inserted"> SELECT
</code><code _ngcontent-c14="" class="ng-star-inserted"> IFNULL(SalePrice, 0) AS label,
</code><code _ngcontent-c14="" class="ng-star-inserted"> IFNULL(GrLivArea, 0) AS LivingAreaSize,
</code><code _ngcontent-c14="" class="ng-star-inserted"> YearBuilt,
</code><code _ngcontent-c14="" class="ng-star-inserted"> OverallCond,
</code><code _ngcontent-c14="" class="ng-star-inserted"> OverallQual
</code><code _ngcontent-c14="" class="ng-star-inserted"> FROM
</code><code _ngcontent-c14="" class="ng-star-inserted"> `my-example-housing-dataset.ameshousing.train`
</code><code _ngcontent-c14="" class="ng-star-inserted"> """</code>
</pre>
</div>
<br />
このように、1 つのクエリだけで、Kernels の中に SQL ベースの機械学習モデルを作りました。Kernels を使用すれば、分析のためにもっと高度なクエリを作成したり、モデルを最適化して性能を高めたりすることができます。分析が完了したら、Kaggle コミュニティや、より広範なインターネット ユーザーに向けて Kernels ノートブックを公開することも可能です。<br />
<br />
トレーニング統計情報の取得やモデルの評価に関するワークフローの続きの部分については、『<a href="https://www.kaggle.com/jessicali9530/how-to-use-bigquery-on-kaggle" target="_blank">Tutorial : How to use BigQuery in Kaggle Kernels</a>』をご覧ください。このチュートリアルは Kernels ノートブックとして公開されています。モデルのトレーニングや評価を深く掘り下げる『<a href="https://www.kaggle.com/vimota/getting-started-with-bigquery-ml" target="_blank">Getting started with BigQuery ML</a>』もあります。<br />
<br />
BigQuery と Kaggle Kernels の統合の詳細は <a href="http://kaggle.com/docs" target="_blank">Kaggle のドキュメント</a>をご覧ください。BigQuery を使って SQL 言語の基本を学べる Kaggle の <a href="https://www.kaggle.com/learn/intro-to-sql" target="_blank">SQL micro-course</a> も内容を一新しており、サインアップすることをお勧めします。この統合機能をぜひお試しください。<br />
<br />
<i>- By Jessica Li, Product Manager, Kaggle and Jordan Tigani, Director, BigQuery, Google Cloud</i>Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-74900252524900218022019-06-28T13:00:00.000+09:002019-07-03T08:02:18.600+09:00Cloud OnAir 番組レポート : G Suite のお客様事例と Google 社内での活用方法<a href="https://goo.gl/kWM1J3" target="_blank">Cloud OnAir</a> は、Google Cloud の製品をわかりやすく解説し、最新の情報などをいち早く皆様にお伝えする Online 番組です。<br />
<br />
6 月 20 日の放送では、G Suite の活用事例をテーマにお送りしました。実際にご活用いただいているお客様でどのように活用しているかを詳しく紹介するとともに、Google 社内でどのように使っているか、さらに、G Suite に関するよくある質問にお答えしました。<br />
<br />
<h3 dir="ltr">
<b>G Suite のお客様活用事例</b></h3>
コラボレーションとコミュニケーションのプラットフォームとして、<a href="https://gsuite.google.co.jp/intl/ja/" target="_blank">G Suite</a> は多数の企業にご利用いただいています。番組では、そうしたお客様の中から 3 社を取り上げ、G Suite 導入の背景や目的、導入後の効果、今後の方針についてご紹介しました。<br />
<br />
<ul>
<li><b><b>株式会社 TBS テレビ</b></b></li>
</ul>
<blockquote class="tr_bq">
全社を挙げて本格的な「働き方改革」に取り組んでいる株式会社 TBS テレビ。TBS グループ、約 6,500 人を対象とした、IT を活用した働き方改革プロジェクトを推進する一貫として、G Suite の導入を決めました。2017 年 7 月から検討を開始。2018 年 4 月より社内への先行導入がはじまり。順次ユーザー数を増やして、同年 7 月に全社展開に至りました。ドライブ、Gmail、カレンダー、ドキュメント、スプレッドシート、スライド、ハングアウトなどその利用機能は多岐に渡ります。</blockquote>
<ul>
<li><b><b>横浜ゴム株式会社</b></b></li>
</ul>
<blockquote class="tr_bq">
横浜ゴム株式会社は、2014 年に G Suite を導入。主に Gmail を中心に利用し、その他の機能は、他のさまざまなシステムと併用する形で利用していました。その後、昨今の働き方改革を推進する流れの中で、より本格的に G Suite を活用していく決断をされました。メールだけでなく、共有ストレージなど、多くの機能を G Suite に置き換えており、<a href="https://cloud.google.com/dialogflow/" target="_blank">Dialogflow</a> を利用した社内チャットボットの運用もはじまっています。</blockquote>
<ul>
<li><b><b>メタウォーター株式会社</b></b></li>
</ul>
<blockquote class="tr_bq">
メタウォーター株式会社では、オンプレミスですべての IT インフラを構築、運用していましたが、2012 年 6 月に G Suite の全社利用を開始し、現在は約 3,400 アカウントがメールだけでなく、ドライブ、カレンダー、Hangouts Meet などさまざまなものを使用しています。さらに、全社で計 6 台の Jamboard も導入。Jamboard 上で Web 会議をしながら情報を共有するといった従来にない働き方を実践しています。たとえば、設計部門では、Google ドライブに設計図を保存しておき、Jamboard 上で設計図を開き打ち合わせをすることで、効率的かつ効果的な作業を行なっています。</blockquote>
<br />
<h3 dir="ltr">
<b>G Suite のよくある質問と回答</b></h3>
続いて、番組では、G Suite に関する次の 8 つの質問に答えます。G Suite の導入を検討している方だけでなく、すでに導入済みで本格的な活用を計画されている方にとってもお役に立つ内容です。<br />
<ol>
<li>G Suite の新規ユーザーはどの程度いますか?</li>
<li>G Suite の特徴は?</li>
<li>100% クラウドのメリットとは?</li>
<li>G Suite を導入する場合は既存の Microsoft Office 形式のファイルをすべて Google ドキュメント形式などに変換する必要がありますか?</li>
<li>Google Drive をファイル サーバーのように使えますか?</li>
<li>現在使っているシステムからの移行方法を教えてください。</li>
<li>既存システムと平行稼働が必要な場合に使えるサービスはありますか?</li>
<li>G Suite を導入したいのですが、個人 Gmail のアクセスを制限するにはどのようにすればいいですか?</li>
</ol>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/ghG1BDVuQbo" width="560"></iframe>
</div>
<div style="text-align: center;">
<a href="https://cloudonair.withgoogle.com/events/cloud-onair-japan-q2-2019/watch?talk=tky_hpc_q2&reg=" target="_blank">2019 年 6 月 20 日放送 G Suite のお客様事例と Google 社内での活用方法をご紹介</a></div>
<div style="text-align: center;">
<br /></div>
番組で説明した資料は<a href="https://www.slideshare.net/GoogleCloudPlatformJP/cloud-onair-g-suite-q-a-2019620" target="_blank"><b>こちら</b></a>で公開しています。<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/6Wmw1evLqdFx5o" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe> </div>
<div style="margin-bottom: 5px;">
<div style="text-align: center;">
<strong> <a href="https://www.slideshare.net/GoogleCloudPlatformJP/cloud-onair-g-suite-q-a-2019620" target="_blank" title="[Cloud OnAir] G Suite の活用事例紹介 と Q & A 2019年6月20日 放送">[Cloud OnAir] G Suite の活用事例紹介 と Q & A 2019年6月20日 放送</a> </strong> from <strong><a href="https://www.slideshare.net/GoogleCloudPlatformJP" target="_blank">Google Cloud Platform - Japan</a></strong> </div>
</div>
<br />
<a href="https://goo.gl/kWM1J3" target="_blank">Cloud OnAir</a> では、各回 Google Cloud のエンジニアがトピックを設け、Google Cloud の最新情報を解説しています。過去の番組、説明資料、さらには視聴者からの質問と回答は<a href="https://goo.gl/kWM1J3" target="_blank">こちら</a>よりご覧いただけます。 最新の情報を得るためにもまずはご登録をお願いします。Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-25354772326412511742019-06-27T09:00:00.000+09:002019-06-27T09:00:04.309+09:00大和証券株式会社の導入事例:Google Cloud Speech-to-Text で面倒なテキスト入力を自動化。その成功を起点に今後の積極的なクラウド活用を推進<div class="separator" style="clear: both; text-align: center;">
<img border="0" data-original-height="99" data-original-width="302" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirFYA8I-SbDICwSjAXdqKIxc8CpI92anoFI-DH9Q0W9Nk8FQZk4giCPIQD6v462F9Aju2arCgBIDT_kqlfbf8Eoozii6O3BOeV1kbjr5K0QPgwT_AI8i1QnvfGh9j1MKdg5GDSKTplUTa5/s1600/%25E5%25A4%25A7%25E5%2592%258C%25E8%25A8%25BC%25E5%2588%25B8%25E3%2583%25AD%25E3%2582%25B3%25E3%2582%2599.png" /></div>
<div style="text-align: center;">
<br /></div>
日本 5 大証券会社の 1 社として、国内金融・証券業界に大きな貢献を果たしている大和証券。求められるセキュリティ基準の高さから、クラウド移行が難しいとされる金融・証券業界ですが、大和証券はそこに向けた最初の一歩を踏み出しました。それが、Google Cloud Speech-to-Text を活用した音声によるテキスト入力の実現。その背景と、今後も見据えた狙いについて、同社システム企画部の皆さんにお話をお伺いしました。<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" data-original-height="1067" data-original-width="1600" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkHGMjpu1tjcuG6YG91r3gRo7um-dev4BQ-SU-h4fnW80pJtY7NunmxgsFkA1bEQSzXt7abncubVJZhGU9x5bUDb8mH86OdelS7uYbpf_Bjiu7S8UvsTl6uxbw8e1CGKEK_YGN54CI_dzB/s640/_17A3078.jpg" width="640" /></div>
<div style="text-align: center;">
<br /></div>
<h2>
利用している Google Cloud Platform サービス</h2>
<blockquote class="tr_bq">
<a href="https://cloud.google.com/speech-to-text/?hl=ja" target="_blank">Google Cloud Speech-to-Text</a>、<a href="https://cloud.google.com/translate/?hl=ja" target="_blank">Cloud Translation</a></blockquote>
<h2>
写真左から</h2>
<ul>
<li>システム企画部 兼 大和証券グループ本社 システム企画部 主任 川口 哲平氏</li>
<li>システム企画部 ITソリューション課長 兼 大和証券グループ本社 システム企画部 ITソリューション課長、副部長 武部 啓造氏</li>
<li>システム企画部 兼 大和証券グループ本社 システム企画部 主任 鈴木 宏美氏</li>
</ul>
<br />
<h2>
<a href="http://www.daiwa.jp/" target="_blank">大和証券株式会社</a></h2>
<blockquote class="tr_bq">
1902 年に設立された「藤本 ビルブローカー」を源流とする老舗証券会社。大和証券のほか、大和証券投資信託委託や大和総研、大和企業投資などを傘下に擁する大和証券グループ本社の基幹企業。グループとして掲げる企業理念は「信頼の構築」「人材の重視」「社会への貢献」「健全な利益の確保」。現在の従業員数は 16,516 名(2018 年 9 月時点)。</blockquote>
<br />
<h3 dir="ltr">
Google Cloud Speech-to-Text なら金融・証券業界独自の用語にもスムーズに対応</h3>
「私が所属している先端 IT 戦略部(現在は組織改編によって「システム企画部」に)は、先端テクノロジーを駆使して、業務の効率化を図る取り組みを企画する部署。今回お話しする Google Cloud Speech-to-Text(Speech-to-Text) は、従業員のテキスト入力をサポートするために導入を決定しました。」(武部さん)<br />
<br />
全国 160 か所の拠点で、約 9,000 名の従業員が働く大和証券では、取引情報、顧客情報の共有化のため、商談の記録を CRM(Customer Relationship Management)システムに細かく入力するという業務があります。しかし、その入力内容は個人差が大きく、特にキーボード タイピングを苦手とする従業員が入力に手間がかかりすぎることから、必要最低限の情報しか入力しなかったり、逆に慣れないキーボードで丁寧に入力しようとした結果、勤務時間が増加してしまう問題が発生していたといいます。<br />
<br />
「実はその少し前に、お客様からの電話内容を録音して音声認識技術でテキスト化するという取り組みをおこなっていたのですが、これをその問題の解決に使えるのではないかと考えました。ただ、その機能が社内で実際にどれくらい使われるかはまったくの未知数。そこで今回は、使った分だけの従量課金でコストを抑えられるクラウド型の音声認識エンジンを利用することにしました。」(武部さん)<br />
<br />
そうして、さまざまな音声認識ソリューションを評価していくなかで、最終的に Speech-to-Text にいきついたのは、認識精度が高かったから。金融・証券業界では、「取引残高報告書」を「取残(とりざん)」と略すなど、一般に使われない独自の用語が多数存在していますが、Speech-to-Text はわずかな学習と独自辞書の追加で、さまざまな専門用語の認識をマスター。前後の文脈をもとに正しくテキスト化できたといいます。<br />
<br />
「方向性の確定後、実際に開発をおこなったのは大和証券グループのシステム開発会社である大和総研なのですが、6 名のエンジニアで約 4 か月かけて、既存の CRM システムに Speech-to-Text を駆使したテキスト入力機能を組み込むことができました。2018 年 5 月の連休明けから各拠点に展開し、利用を開始しています。」(武部さん)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWH0Vnqut77Ds2zWe4axBrbtcOQCVDP2Aivwm1Sc1ntCHL8v53YxFIyi_VuFcwGTb5PqlFHqZ2HB4SvS-E4VjAqq1xdhz7a7QWk1F_fI2b7Z733NARcRFXJyiWvRS2xRionBkaqBi2HbWd/s1600/%25E9%259F%25B3%25E5%25A3%25B0%25E5%2585%25A5%25E5%258A%259B.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="592" data-original-width="1129" height="334" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWH0Vnqut77Ds2zWe4axBrbtcOQCVDP2Aivwm1Sc1ntCHL8v53YxFIyi_VuFcwGTb5PqlFHqZ2HB4SvS-E4VjAqq1xdhz7a7QWk1F_fI2b7Z733NARcRFXJyiWvRS2xRionBkaqBi2HbWd/s640/%25E9%259F%25B3%25E5%25A3%25B0%25E5%2585%25A5%25E5%258A%259B.png" width="640" /></a></div>
<div style="text-align: center;">
<span style="font-size: small;">CRM システムに組み込んだ Speech-to-Text を活用したテキスト入力機能</span></div>
<br />
「導入後の効果の検証はこれからなのですが、現場からは、これまでキーボード タイピングが苦手で入力が億劫だったという方から、より細かく商談内容を記録できるようになったという声が届いています。今後は、そうして情報量の高まった商談記録が実際のビジネスに活用されていくことに期待しています。」(鈴木さん)<br />
<br />
「なお、コストに関しては上限を設定しているほか、マイクをオンにしたまま放置してしまって無駄な利用料金が発生してしまわないよう、無音状態が続くと自動的に切れる設定にしています。」(武部さん)<br />
<br />
<br />
<h3 dir="ltr">
将来的にはクラウドでグループ各社、各拠点の情報共有を進めていきたい</h3>
独特な金融・証券用語を正確にテキスト化できる Speech-to-Text の導入によって、当初の課題をクリアした大和証券ですが、その成功から、新たな可能性が生じ、次なる取り組みが生まれていったと言います。<br />
<br />
「思った以上に精度が高かったため、CRM システムへの入力だけでなく、広範な用途に使えるよう社内ポータルに音声認識システムを配置し、開放しました。ボタンを押して、マイクに向かって話すとその内容がテキストデータとして表示されます。それをメールやドキュメントなどにコピー&ペーストして利用してもらうイメージです。また、聴覚障害のあるスタッフが社内研修用のビデオを見る際に、自動的に字幕が付くような仕組みも作りました。これまでは別途、字幕付きビデオを作っていたのですが、Speech-to-Text を活用すれば、動画の音声をリアルタイムにテキスト化し、画面上に表示することができます。精度面でもまったく問題ありませんし、リアルタイムの情報共有の実現と同時に、結果的にはその手間と費用の大幅削減にもつながりました。」(武部さん)<br />
<br />
なお、武部さん曰く、Speech-to-Text の導入には、これから拡大していくクラウド活用を見据えたテストケースという意味合いもあったそうです。情報セキュリティがとりわけ厳しい金融・証券業界では、外部にデータを置くことがタブーとされています。そこで、まずはデータを外部サーバーに保存することなく利用できる API でクラウド サービスを使い始めることにしたのです。<br />
<br />
そして、現在は Speech-to-Text 以外の機能にも利用を拡大。具体的には Cloud Translation を社内の翻訳業務に導入しました。こちらも社内ポータルに「大和翻訳センター」という名称で配置し、誰でも使えるようにしています。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgofK8py_ZUc7892iX2qMFDFStMYMwP2NK9l_jQWNVTYlM-WRa96KRhna2xMbbjrzyl6PhlboHgcSsr3M1OQKnT2JP4_Vg2tddAMLBMVggOojIbmZVE_JYGpd-pYKf0xP1R2epcO8CX6pMP/s1600/%25E7%25BF%25BB%25E8%25A8%25B3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="690" data-original-width="1316" height="334" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgofK8py_ZUc7892iX2qMFDFStMYMwP2NK9l_jQWNVTYlM-WRa96KRhna2xMbbjrzyl6PhlboHgcSsr3M1OQKnT2JP4_Vg2tddAMLBMVggOojIbmZVE_JYGpd-pYKf0xP1R2epcO8CX6pMP/s640/%25E7%25BF%25BB%25E8%25A8%25B3.png" width="640" /></a></div>
<div style="text-align: center;">
<br /></div>
「大和証券では、機密保持の観点から外部の翻訳サービスの利用も禁止されているため、これまで英語で書かれた契約書やレポートの翻訳が大きな負担になっていました。しかし、Cloud Translation なら、Speech-to-Text 同様、社内システム上で問題なく利用できます。これまでも多くの社員にとって有用なレポートなどは、本部で翻訳し配布していたのですが、大和翻訳センター設置後は、コストや工数をかけずに、それぞれの社員が個別に必要な情報を素早く翻訳できるようになりました。」(川口さん)<br />
<br />
現在はこうした API レベルでの活用に留まっている大和証券の GCP 活用ですが、今後は、段階的にその活用を深めていきたいと武部さんは言います。<br />
<br />
「大和証券グループの大きな課題として、各社、各拠点が閉じたネットワークで業務をおこなっており、情報の共有が阻害されているというものがあります。やむを得ないことではあったのですが、今後はそうもいきません。セキュリティの問題をクリアにしつつ、クラウドへのデータ保存・共有などを実現していきたいですね。たとえば、現在は社内の地図データにクリッピングしている顧客情報を <a href="https://cloud.google.com/maps-platform/?hl=ja" target="_blank">Google Maps Platform </a>に移行できたらルート検索などの機能を組み合わせて使えるようになり、さらに業務効率が改善するのではないかと思っています。また、今後、AI 技術の導入によって、大和証券グループが進めている働き方改革がさらに推進されていくことにも期待しています。」(武部さん)<br />
<br />
「大和翻訳センターの機能改善要望で最も多いのが、PDF や画像などに記載された英文(画像)の翻訳・テキスト化。今後、クラウド対応を進めていくなかで実現していきたいですね。」(鈴木さん)<br />
<br />
「また、検索機能もさらに活用していきたいですね。現在は拠点ごとに情報が散乱しており、その鮮度もまちまちです。誰もが最新のデータを簡単かつ即座に入手できる環境の構築が急務だと考えています。また、アクセスログをきちんと解析して、利便性の向上にも役立てていきたいです。」(川口さん)<br />
<br />
<br />
その他の導入事例は<a href="https://cloud.google.com/customers/#/" target="_blank">こちら</a>をご覧ください。Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-43921889417607394812019-06-20T16:00:00.000+09:002019-06-21T09:16:55.419+09:00Cloud OnAir 番組レポート : お客様事例紹介 アサヒグループのデータと GCP の活用<a href="https://goo.gl/kWM1J3" target="_blank">Cloud OnAir</a> は、Google Cloud の製品をわかりやすく解説し、最新の情報などをいち早く皆様にお伝えする Online 番組です。<br />
<br />
6 月 13 日の放送では、Google Cloud Platform を実際にご活用いただいているアサヒプロマネジメント株式会社にご出演いただき、データ活用やデータ分析の取り組みについて伺いました。<br />
<br />
<h3 dir="ltr">
<b>データ活用の取り組み</b></h3>
アサヒグループにおいて、財務・人事・総務など、グループ全体の管理の請け負うアサヒプロマネジメント。グローバル化が進み、事業規模も急激に拡大する中で、IT を含むさまざまな業務に関してグループの最適な戦略・施策を立案、実行する会社です。このアサヒプロマネジメント株式会社では、事業拡大を支えるためにどのようなデータを扱っているのか、データを何のために使っているのか、データの活用によってどのようなことが改善されたのか、これらの点について、同社の清水博さんにお話いただきました。<br />
<br />
清水さん曰く、社内に蓄積されたさまざまなデータ(たとえば POS 販売実績データ)だけでなく、メーカーや卸業者が持つ市場データや位置情報を組み合わせて分析し、より適切な戦略立案を進める上で、マーチャンダイジング(MD)業務の革新がポイントになるそうです。<br />
<br />
アサヒプロマネジメントでは、MD の業務生産性向上を目指し、クラウドを利用した新システムを構築しました。その結果、各種データ・資料を一元管理、集計することで年間で MD 一人あたりの作業時間を 56% 削減することができたそうです。この結果を受けて、MD の業務内容を単純なデータ分析から、提案・検証および課題解決業務へとシフトさせることができたわけです。<br />
<br />
<h3 dir="ltr">
<b>GCP の活用</b></h3>
オンプレミスでの運用がまだまだ多いというアサヒプロマネジメントですが、クラウド化への方針転換は 2 年ほど前に遡るそうです。IT 部門として、グループ内の IT システムの品質を維持し、安定運用を継続することが第一と捉え、その実現の障害となることをいかに取り除くかを熟慮した結果、フルマネージドサービスの活用に至ったと、清水さんは語ります。<br />
<br />
しかし、一方で、クラウドへの移行に十分な知見・経験が社内の既存の開発体制だけでは不十分であり、移行には時間がかかると判断。クラウドに精通した外部リソースの活用で、クラウドへの移行を迅速に推進することができたそうです。<br />
<br />
フルマネージドな GCP を活用した新システムのもとで大きな効果を実証できた今、アサヒプロマネジメントでは、ますます変化し、多様化する消費者のニーズに対応するため、Systems of Engagement(SoE)と Systems of Records(SoR)を上手に連携したシステムの実現を目指していくとのことです。<br />
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/3FG915OWRTI" width="560"></iframe><br /></div>
<div style="text-align: center;">
<a href="https://cloudonair.withgoogle.com/events/cloud-onair-japan-q2-2019/watch?talk=tky_hpc_q2&reg=" target="_blank">2019 年 6 月 13 日放送 お客様事例紹介 アサヒグループのデータと GCP の活用</a></div>
<div style="text-align: center;">
<br /></div>
番組で説明した資料は<a href="https://www.slideshare.net/GoogleCloudPlatformJP/cloud-onair-gcp-2019613" target="_blank"><b>こちら</b></a>で公開しています。<br />
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/9EYQD4y1AY3EaT" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe> </div>
<div style="margin-bottom: 5px;">
<div style="text-align: center;">
<strong> <a href="https://www.slideshare.net/GoogleCloudPlatformJP/cloud-onair-gcp-2019613" target="_blank" title="[Cloud OnAir] お客様事例紹介 アサヒグループのデータと GCP の活用 2019年6月13日 放送">[Cloud OnAir] お客様事例紹介 アサヒグループのデータと GCP の活用 2019年6月13日 放送</a> </strong> from <strong><a href="https://www.slideshare.net/GoogleCloudPlatformJP" target="_blank">Google Cloud Platform - Japan</a></strong> </div>
</div>
<div style="text-align: center;">
<br /></div>
<a href="https://goo.gl/kWM1J3" target="_blank">Cloud OnAir</a> では、各回 Google Cloud のエンジニアがトピックを設け、Google Cloud の最新情報を解説しています。過去の番組、説明資料、さらには視聴者からの質問と回答は<a href="https://goo.gl/kWM1J3" target="_blank">こちら</a>よりご覧いただけます。 最新の情報を得るためにもまずはご登録をお願いします。Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-45390378084407841432019-06-14T11:00:00.000+09:002019-06-14T11:00:11.228+09:00BigQuery GIS による天文データのクエリ<a href="https://storage.googleapis.com/gweb-cloudblog-publish/images/QueryTheStars.max-2200x2200.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="333" data-original-width="800" height="266" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/QueryTheStars.max-2200x2200.png" width="640" /></a><br />
<span style="font-size: small;">※この投稿は米国時間 2019 年 5 月 15 日に Google Cloud blog に<a href="https://cloud.google.com/blog/products/data-analytics/querying-the-stars-with-bigquery-gis" target="_blank">投稿</a>されたものの抄訳です。</span><br />
<br />
多くの組織は、アナリティクスや販売数、業績評価指標などのデータで満たされた大規模なデータ ウェアハウスを運用しています。ただ、データはこうしたものに限られるわけではなく、たとえば星でいっぱいの夜空というような自然界も膨大なデータセットの供給源です。<a href="https://cloud.google.com/bigquery/docs/gis-intro?hl=ja" target="_blank">BigQuery GIS</a> は、もともとは地球上の地理空間データを利用するユーザーのニーズに応えるために設計されたものですが、その球面座標系と組み込みの変換関数は、球面座標を使用するもう 1 つの分野、天文学にも非常に適しています。<br />
<br />
BigQuery が天文データセットの分析に適した優れたプラットフォームである理由は次のとおりです。<br />
<ul>
<li>BigQuery はオンライン分析(OLAP)向けに作られており、非トランザクショナルな膨大なデータセットの処理に最適化されています。毎年という周期(プロジェクトによって異なります)で発行される天文カタログの操作の大半は、これに当てはまります。</li>
</ul>
<ul>
<li>BigQuery は、BigQuery GIS を使った球面幾何学でのクエリをサポートします。天球上にオブジェクトを配置するには球面幾何学が必要です。</li>
</ul>
<ul>
<li>BigQuery GIS は専用のデータベース プラットフォームとほぼ同じスピードで天文データのクエリを実行できるほか、フルテーブル スキャンに使用すると、もっと高速になることがあります。</li>
</ul>
<br />
探求すべき天文データが足りなくなることはありません。たとえば、カタログ データは望遠鏡による観測結果を巨大なテーブルにまとめたものです。大規模なカタログ データセットのなかには数十億もの天体のさまざまな観測値を集めたものがあり、一部のデータセットには数時間とか数年といったスパンの観測値も含まれています。<br />
<br />
人工衛星に搭載された望遠鏡である <a href="http://wise2.ipac.caltech.edu/docs/release/allwise/" target="_blank">WISE</a> や <a href="https://www.cosmos.esa.int/web/gaia/dr2" target="_blank">Gaia</a> は、高解像度のイメージ データを地球に送ってきます。地上に新しく設置される巨大望遠鏡の <a href="https://www.lsst.org/" target="_blank">LSST</a> もまもなく稼働します。LSST は、観測データのカタログを 10 年間にわたって公開することが義務づけられています。この投稿記事の後半では、この種のカタログ データを BigQuery GIS で処理する方法を探ります。<br />
<br />
<h3 dir="ltr">
天球座標系の基礎</h3>
BigQuery による天文カタログ データのクエリ例を示す前に、<a href="https://en.wikipedia.org/wiki/Geographic_information_system" target="_blank">GIS</a> のニーズをサポートするため BigQuery GIS に実装されている幅広い関数群について簡単に説明しましょう。<br />
<br />
<h3 dir="ltr">
少しの間、地球を見下ろしてみる</h3>
地球は球体ですが、地球上の位置が GPS(全地球測位システム)で簡単に得られる緯度と経度の 2 次元情報で表現されることについて考えてみましょう。GPS は「緯度と経度」の座標であなたの位置を特定し、あなたが行きたい場所に案内してくれます。<br />
<br />
移動距離を知りたいとしましょう。高校で習った幾何学を覚えている方なら、ピタゴラスの定理で移動距離を計算できると考えるかもしれません。近距離であればうまくいきそうな気がしますが、距離が長くなると話がややこしくなります。<br />
<br />
移動距離を計算するには、出発点と目的地の緯度および経度をユークリッド平面上のデカルト座標に変換し、角度をメートルまたはマイルに変換する必要があります。ところが、ユークリッド距離は平面幾何学の問題ですが、あいにく地球の表面は平面ではなく球面なのでピタゴラスの定理は使えません。数学的な問題の大半は古代ギリシャやイスラムの数学者たちが 1000 年前に解決していますが、この変換が大変なことは今でも変わりありません。<br />
<br />
幸いなことに、BigQuery GIS はこの種の計算を実行できる Google の <a href="http://s2geometry.io/" target="_blank">S2 Geometry ライブラリ</a>を利用しており、上記の複雑な幾何学計算を単純な標準 SQL で実行できます。地球上の地点間の距離だけでなく、領域やポリゴンなどを使った複雑な計算にも対応可能です。BigQuery GIS は非常に強力で、非常に使いやすいものなのです。<br />
<br />
<h3 dir="ltr">
再び天空に向かって</h3>
地球表面の幾何学を理解したところで、もう一度星空を見上げてみましょう。BigQuery GIS は、地球上の物体の移動とまったく同じ基本概念に沿って天体の移動を追跡します。つまり、夜空における星の位置を指定するときには、地球上の物体の位置を指定する場合と同じように、緯度経度のような座標を割り当てます。宇宙空間内での星の位置は、この座標によって正確に指し示すことができます。<br />
<br />
とはいえ、宇宙空間は球体ではありません。宇宙は、恒星、銀河、ブラックホール、惑星、クエーサー、パルサー、星雲などが、文字どおり完全かつ 3 次元的に無限に広がっている空間です。それらは何光年も離れたところに散らばっており、地球上の自宅から最寄りの Google オフィスへの行き方を GPS で調べるのとはまったく異なります。<br />
<br />
面白いのはここからです。上で挙げた天体は非常に遠いところにあるため、私たち人間は、近くにある天体と遠くにある天体を簡単に区別することができません。夜空を見上げたときの星のように、地球を中心とする大きな黒い球体の表面で光る点のようなものです。この投稿では天文学の歴史に深入りするつもりはありませんが、科学史に詳しい方であれば、古代ギリシャの科学者、そして彼らの知的後継者が天体を記述するときのモデルはまさにこのようなものだったことを思い出されるでしょう。興味のある方には Thomas S Kuhn の著書『<a href="https://en.wikipedia.org/wiki/The_Structure_of_Scientific_Revolutions" target="_blank">The Structure of Scientific Revolutions</a>』(科学革命の構造)をお勧めします。<br />
<br />
天空に戻りましょう。夜空とすべての天体が、地球を中心とする大きな球と区別がつかないなら、天体に緯度経度を与えるという先ほどの提案も合理的に見えてきます。実際、天文学者はそうしています。彼らの座標は赤経(ra)および赤緯(dec)と呼ばれ、緯度や経度と同じように機能します。赤経は、時分秒を使った古い記法で表現されることがあります。<br />
<br />
<a href="https://www.skyandtelescope.com/astronomy-resources/what-are-celestial-coordinates/" target="_blank">例</a>を見てみましょう。ベガ(映画『コンタクト』で有名な星)は、赤経 18h 36m 56s、赤緯 +38° 47′ 1″ にあります。幸いなことに、現代の天文学データは、地理学データと同様に度を単位とする小数表現で座標を格納しており、その最近の記法によれば、ベガの赤緯(+39°)は米国カンザスシティの緯度(北緯 39 度)と同じです。これは、カンザスシティでは毎日 1 回ずつベガが真上に見えるということです(夜であればの話ですが)。赤経が歴史的に 24 時間記法で表現されてきたのは、明らかにこの自転に由来します。<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://storage.googleapis.com/gweb-cloudblog-publish/images/celestial_coordinate_system.max-600x600.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/celestial_coordinate_system.max-600x600.png" width="200" /></a></div>
<br />
ご覧のように、天文学では空を見上げるのに対して、地理学では地面を見下ろすという違いはあるものの、天球座標系と地理座標系はよく似ています。<br />
<br />
そこで、地球上の物体の位置を示すために緯度経度を使用するのと同じように、天球上の天体の位置を示すために ra と dec の球面座標を使用することは、有効な方法として確立されています(緩やかな形で)。ただし、次の点に注意することが重要です。<br />
<br />
<ol>
<li>天球は、その主旨からして真球なので、地球が少し平べったいこと(楕円体になっていること)による GIS システムの補正機能は無効にする必要があります。好都合なことに、BigQuery GIS はデフォルトで真球を使用しています。</li>
<li>天球の極は、地球の地理学的な極と一致します。星の位置を示す座標(ra、dec)は固定されたままです。</li>
</ol>
<br />
天文学者が実行すべきクエリにはさまざまなものがありますが、LSST の例が<a href="https://dev.lsstcorp.org/trac/wiki/db/queries" target="_blank">こちら</a>にいくつか示されています。この投稿では WISE データでの例を示します。<br />
<br />
<h3 dir="ltr">
例とデータセット</h3>
WISE データセットには、天体のマルチエポック(または時系列)データをまとめたテーブルが含まれています。なかでも面白い例が、<a href="https://en.wikipedia.org/wiki/Beta_Lyrae" target="_blank">食変光星である「こと座ベータ星」</a>の光度曲線です。BigQuery AllWise データセットに含まれるこの光度曲線データにアクセスするためのクエリは次のとおりです。<br />
<br />
<div class="h-c-grid">
<div class="uni-paragraph
h-c-grid__col h-c-grid__col--8 h-c-grid__col-m--6 h-c-grid__col-l--6
h-c-grid__col--offset-2 h-c-grid__col-m--offset-3 h-c-grid__col-l--offset-3">
<!----><!----><!----><article-code-block _nghost-c14="" class="ng-star-inserted"><!----></article-code-block><br />
<pre _ngcontent-c14=""> <!----><code _ngcontent-c14="" class="ng-star-inserted">SELECT
</code><code _ngcontent-c14="" class="ng-star-inserted"> w1mpro_ep,
</code><code _ngcontent-c14="" class="ng-star-inserted"> mjd,
</code><code _ngcontent-c14="" class="ng-star-inserted"> load_id,
</code><code _ngcontent-c14="" class="ng-star-inserted"> frame_id
</code><code _ngcontent-c14="" class="ng-star-inserted">FROM
</code><code _ngcontent-c14="" class="ng-star-inserted"> `bigquery-public-data.wise_all_sky_data_release.mep_wise`
</code><code _ngcontent-c14="" class="ng-star-inserted">WHERE
</code><code _ngcontent-c14="" class="ng-star-inserted"> source_id_mf='3425p651_ac51-032187'
</code><code _ngcontent-c14="" class="ng-star-inserted">ORDER BY
</code><code _ngcontent-c14="" class="ng-star-inserted"> mjd ASC</code>
</pre>
</div>
</div>
<br />
返されたデータを <a href="https://datastudio.google.com/overview" target="_blank">Data Studio</a> でプロットすると、次のようになります。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://storage.googleapis.com/gweb-cloudblog-publish/images/data_studio_plot.max-1400x1400.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="603" data-original-width="800" height="482" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/data_studio_plot.max-1400x1400.png" width="640" /></a></div>
<br />
ベンチマークとして使用できる数値を得るため、私たちは天文学者が興味を持つような現実的なクエリを試してみることにしました。そして、未加工のテーブルがロードされた状態での初期テスト実行後、次に示す 4 つの重要な最適化を施しました。<br />
<br />
<ul>
<li>テーブルを分割しました。</li>
<li>天体を三角測量する<a href="http://skyserver.org/htm/index.html" target="_blank">レベル 7 HTM 空間インデックスキー</a>の整数値でデータをクラスタ化しました。</li>
<li>ジオメトリ型の POINT を使用して天体の位置を事前に計算しました。</li>
<li>ST_WITHIN の代わりに ST_CONTAINS を使用して、空間のリージョンを制限し、データセットのサイズを小さくしました。</li>
</ul>
<br />
最終的なクエリは次のとおりです。このクエリは、予想される天文データ クエリのタイプに最も近いクエリのなかで代表的なものです。<br />
<br />
<div class="h-c-grid">
<div class="uni-paragraph
h-c-grid__col h-c-grid__col--8 h-c-grid__col-m--6 h-c-grid__col-l--6
h-c-grid__col--offset-2 h-c-grid__col-m--offset-3 h-c-grid__col-l--offset-3">
<!----><!----><!----><article-code-block _nghost-c14="" class="ng-star-inserted"><!----></article-code-block><br />
<pre _ngcontent-c14=""> <!----><code _ngcontent-c14="" class="ng-star-inserted">CREATE TEMP FUNCTION
</code><code _ngcontent-c14="" class="ng-star-inserted"> ArcSecondDistance(p1 GEOGRAPHY, p2 GEOGRAPHY,
</code><code _ngcontent-c14="" class="ng-star-inserted"> d FLOAT64) AS (ST_DISTANCE(p1,p2) < d * 30.8874796235);
</code><code _ngcontent-c14="" class="ng-star-inserted">SELECT
</code><code _ngcontent-c14="" class="ng-star-inserted"> source_id_mf,
</code><code _ngcontent-c14="" class="ng-star-inserted"> point
</code><code _ngcontent-c14="" class="ng-star-inserted">FROM
</code><code _ngcontent-c14="" class="ng-star-inserted"> `bigquery-public-data.wise_all_sky_data_release.mep_wise`
</code><code _ngcontent-c14="" class="ng-star-inserted">WHERE
</code><code _ngcontent-c14="" class="ng-star-inserted"> ArcSecondDistance(point,
</code><code _ngcontent-c14="" class="ng-star-inserted"> ST_GEOGPOINT(201.5, -2.6),60)
</code><code _ngcontent-c14="" class="ng-star-inserted"> AND ST_CONTAINS(
</code><code _ngcontent-c14="" class="ng-star-inserted"> ST_GEOGFROMTEXT('Polygon((201.00 -3.10,201.00 -2.10,202.00 -2.10,202.00 -3.10, 201.00 -3.10))'),point)</code>
</pre>
</div>
</div>
<br />
上記 4 つの最適化の組み合わせにより、17 TB のテーブルのクエリに要する時間の中央値は 60 秒から 4 秒に下がりました。これによって、単一の天文データソースから関連情報を迅速に取得するよう最適化されたデータベース プラットフォームに匹敵する性能が、BigQuery からも得られるようになりました。さらに、フルテーブル スキャンに関しては、BigQuery は大きく優位に立つ可能性があります。<br />
<br />
何よりも素晴らしいのは、BigQuery GIS と天文データセットがまだ開発初期の段階にあることです。私たちはもっと多くの天文カタログを <a href="https://cloud.google.com/bigquery/public-data/?hl=ja" target="_blank">BigQuery の一般公開データセット</a>に追加していきます。WISE データセットは、いくつか計画しているうちの最初のものに過ぎません。<br />
<br />
BigQuery GIS の初心者は、<a href="https://cloud.google.com/bigquery/docs/gis-data?hl=ja" target="_blank">こちらのドキュメント</a>を読むことで、地球上の地理データを分析する方法を学べます。BigQuery を使って自然現象を記録することに興味のある方は、<a href="https://cloud.google.com/bigquery/docs/gis-tutorial-hurricane?hl=ja" target="_blank">BigQuery GIS を使用したハリケーン進路のプロット</a>に関するこちらの優れたチュートリアルをご覧ください。ビジネス ユースで地上の GIS データのアナリティクスを実行する方法については、<a href="https://cloud.google.com/bigquery/docs/gis-analyst-start?hl=ja" target="_blank">ニューヨーク市でのシティ バイクの移動データに関するチュートリアル</a>が役に立ちます。地理空間(または天文)データを使用するにあたって何か発見がありましたら、ぜひ私たちにお知らせください。<br />
<br />
<i>- By Ross Thomson, Cloud Solutions Architect</i>Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-91635836959489401712019-06-13T10:30:00.000+09:002019-06-13T10:30:00.372+09:00署名付き URL を活用して Cloud Storage に画像ファイルを直接アップロードするアーキテクチャを設計する<div class="separator" style="clear: both; text-align: center;">
<a href="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/DataAnalytics_B_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="333" data-original-width="800" height="266" src="https://storage.googleapis.com/gweb-cloudblog-publish/original_images/DataAnalytics_B_1.jpg" width="640" /></a></div>
<div style="text-align: center;">
<span style="font-size: small;"><br /></span></div>
<span style="font-size: small;">※この投稿は米国時間 2019 年 5 月 29 日に Google Cloud blog に<a href="https://cloud.google.com/blog/products/storage-data-transfer/uploading-images-directly-to-cloud-storage-by-using-signed-url" target="_blank">投稿</a>されたものの抄訳です。</span><br />
<br />
昨今のクラウドの普及によって、クラウド上にデプロイしたアプリケーションをエンドユーザーに広く提供することが一般的になってきました。それと同時に、不特定多数のエンドユーザーがクラウド上のリソースに直接アクセスすることを念頭に置くことによって、柔軟にクラウドの利点を活かしたシステムアーキテクチャを設計できるようになります。<br />
<br />
本稿では、主にエンドユーザーに対してコンテンツを配信するサービスを提供している方に向けて、クラウド上のリソースを理解し、その強みを最大限活用することによって、従来の課題をスマートに解決し、サーバの開発や運用にかかるコストを削減する方法を、具体的なアーキテクチャの設計を通してご紹介します。全体を通して、エンドユーザーが署名付き URL を使って直接 <a href="https://cloud.google.com/storage/" target="_blank">Cloud Storage</a> に画像ファイルをアップロードし、そのファイルを配信するシステムを <a href="https://cloud.google.com/" target="_blank">Google Cloud Platform</a> ( GCP )上に構築することを目指します。<br />
<br />
本稿でご紹介するアーキテクチャのように、エンドユーザーからの画像ファイルのアップロードを受け付けるサーバを、クラウドを活用せず、大規模に開発・運用することは非常に困難な場合があります。考慮しなければならないものとして、例えばファイルのアップロードを担当するサーバのプロセスへのリクエストを一度キューに入れてフロー制御をしたり、リクエストの過負荷によるシステムダウンを防ぐ必要があります。さらに、関連するサーバの有限のリソース( RAM など)に対して、適切な制限を設定する必要もあるでしょう。<br />
<br />
加えて、非常に大きなファイルをサーバにアップロードできるようにするためには、サーバの開発と運用にさらに大きなコストが発生する可能性があります。また、アップロードを担うサーバを何百万ものユーザーが使用する場合、そのスケーラビリティやユーザーエクスペリエンスを確保するために多くの作業が必要になります。<br />
<br />
このような課題に対応するために、 Cloud Storage を画像ファイルのアップロードサーバとして活用するシステムアーキテクチャを提案します。次項から実際にその設計方法を見ていきましょう。なお、本稿で使用するソースコードはすべて <a href="https://github.com/GoogleCloudPlatform/professional-services/tree/master/examples/direct-upload-to-gcs" target="_blank">GitHub</a> 上で管理しています。<br />
<br />
<h3>
画像アップロード機能の構築をはじめましょう</h3>
このアーキテクチャに必要な GCP コンポーネントを掘り下げる前に、まずは要件を定義しましょう。<br />
<ul>
<li>オペレーションコストを削減するために、マネージドサービスを可能な限り使用する。</li>
<li>認証されたユーザのみがファイルをアップロードできるようにする。</li>
<li>アップロードされたコンテンツに対して適切にバリデーションを行う。</li>
</ul>
<br />
上記の要件を満たすために、次のアーキテクチャを提案します。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://storage.googleapis.com/gweb-cloudblog-publish/images/architecture_with_GCP_services.max-1100x1100.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="366" data-original-width="800" height="292" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/architecture_with_GCP_services.max-1100x1100.png" width="640" /></a></div>
<div style="text-align: center;">
<br /></div>
このアーキテクチャの主な特徴として、ファイルのアップロードからその配信に至るまで、全てのコンポーネントをサーバーレスに使用可能なアプリケーションランタイム、もしくはマネージドサービスによってのみ構成している点が挙げられます。これは一つ目の要件を満たすための設計指針に基づいています。次に、各ステップについて詳しく解説します。<br />
<ol>
<li>App Engine がユーザーからのリクエストを受け取ったら、 Cloud Storage の特定のバケット・特定のオブジェクトキーに対して PUT リクエストを実行可能とするための署名付き URL を生成し、ユーザーに返却する。このとき、 App Engine 上では任意のアプリケーションロジックに基づいて、認証済みのユーザーに対してのみ、当該署名付き URL を払い出すようにする。</li>
<li>署名付き URL を返却されたユーザーは、それを用いて Cloud Storage の特定のバケット・特定のオブジェクトキーに対してファイルをアップロードする。</li>
<li>Cloud Storage へのファイルのアップロードを終えると、 Cloud Storage の <code>finalize</code> イベントをトリガーとして <a href="https://cloud.google.com/functions/" target="_blank">Cloud Functions</a> を起動する。Cloud Functionsではアップロードされたファイルをバリデーションする。</li>
<li>Cloud Functions上で、アップロードされたファイルが適切な形式、かつ適切なサイズであることを確認したら、 <a href="https://cloud.google.com/vision" target="_blank">Cloud Vision API </a>を用いて不適切なコンテンツをフィルタリングする。</li>
<li>手順の 3 と 4 の検証が完了したら、アップロード先のバケットから配信用のバケットにファイルをコピーする。</li>
<li>コピーが完了した画像はインターネットに公開される。</li>
</ol>
<br />
次に、上記の手順を実現するための実装について解説します。<br />
<br />
<h2 dir="ltr">
</h2>
<h3>
署名つき URL を App Engine Standard runtime 上で生成する</h3>
Cloud Storage には、個々のエンドユーザーが特定のリソースに対し、特定のアクションを実行できるようにするための署名付き URL と呼ばれる機能があります。署名付き URL を使用すると、ファイルを安全にアップロードするために、特定のエンドユーザーにのみ有効な一時認証情報を生成することができます。これについて、 Google Cloud 公式のクライアントライブラリを使用すると、簡単にこの機能を実装することができます。本稿ではこの機能を用いて、特定のエンドユーザーのために署名付き URL を生成させる API サーバを App Engine Standard runtime 上に作成します。<br />
<br />
実装は公式のライブラリに頼るとしても、署名付き URL を生成する実際の流れについては理解しておくことが望ましいため、処理の流れを次に示します。<br />
<br />
<ol>
<li>任意のバイト列を署名するためのサービスアカウントを用意する。</li>
<ol>
<li>新たなサービスアカウントを作成するか、 App Engine のデフォルトサービスアカウントなどの既存のサービスアカウントに必要なパーミッションを付与する。</li>
</ol>
<li>署名付き URL の生成に必要なシグネチャを生成する(本稿では <code>Content_MD5</code> と <code>Canonicalized_Extension_Headers</code> を省略する)。</li>
<ol>
<li>ファイルのアップロードを受け入れる HTTP_Verb には、 <code>PUT</code> を選択する。</li>
<li><code>Content-Type</code> の値はアップロードされるファイルの MIME type によって異なる。この値はエンドユーザーから送信される API リクエストによって決定することとする。</li>
<li>有効期限をUnixタイムで X-Goog-Expires にセットする。 API リクエストを受け取った時点から未来の時間を設定する。本稿では15分と設定する。</li>
<li><code>Canonicalized_Resource</code> としてアップロード対象のバケットとオブジェクトキーを設定する。オブジェクトキーは UUID などを用いて、動的に生成することで、既存のオブジェクトキーとの重複を回避する。</li>
</ol>
<li>手順 1 で用意したサービスアカウントの秘密鍵を用いて、手順 2 で生成した文字列を署名する。</li>
</ol>
<br />
各手順の詳細については、<a href="https://cloud.google.com/storage/docs/access-control/signed-urls#string-components" target="_blank">公式ドキュメント</a>を参照してください。本稿では上記の手順の例として、 Go を用いて実装します。<br />
<br />
<div class="h-c-grid">
<div class="uni-paragraph
h-c-grid__col h-c-grid__col--8 h-c-grid__col-m--6 h-c-grid__col-l--6
h-c-grid__col--offset-2 h-c-grid__col-m--offset-3 h-c-grid__col-l--offset-3">
<!----><!----><!----><article-code-block _nghost-c14="" class="ng-star-inserted"><!----></article-code-block><br />
<pre _ngcontent-c14=""> <!----><code _ngcontent-c14="" class="ng-star-inserted">package main
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted">import (
</code><code _ngcontent-c14="" class="ng-star-inserted"> "context"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "encoding/base64"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "fmt"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "log"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "net/http"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "os"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "time"
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"> "cloud.google.com/go/storage"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "github.com/google/uuid"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "golang.org/x/oauth2/google"
</code><code _ngcontent-c14="" class="ng-star-inserted"> iam "google.golang.org/api/iam/v1"
</code><code _ngcontent-c14="" class="ng-star-inserted">)
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted">var (
</code><code _ngcontent-c14="" class="ng-star-inserted"> // iamService is a client for calling the signBlob API.
</code><code _ngcontent-c14="" class="ng-star-inserted"> iamService *iam.Service
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"> // serviceAccountName represents Service Account Name.
</code><code _ngcontent-c14="" class="ng-star-inserted"> // See more details: https://cloud.google.com/iam/docs/service-accounts
</code><code _ngcontent-c14="" class="ng-star-inserted"> serviceAccountName string
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"> // serviceAccountID follows the below format.
</code><code _ngcontent-c14="" class="ng-star-inserted"> // "projects/%s/serviceAccounts/%s"
</code><code _ngcontent-c14="" class="ng-star-inserted"> serviceAccountID string
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"> // uploadableBucket is the destination bucket.
</code><code _ngcontent-c14="" class="ng-star-inserted"> // All users will upload files directly to this bucket by using generated Signed URL.
</code><code _ngcontent-c14="" class="ng-star-inserted"> uploadableBucket string
</code><code _ngcontent-c14="" class="ng-star-inserted">)
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted">func signHandler(w http.ResponseWriter, r *http.Request) {
</code><code _ngcontent-c14="" class="ng-star-inserted"> // Accepts only POST method.
</code><code _ngcontent-c14="" class="ng-star-inserted"> // Otherwise, this handler returns 405.
</code><code _ngcontent-c14="" class="ng-star-inserted"> if r.Method != "POST" {
</code><code _ngcontent-c14="" class="ng-star-inserted"> w.Header().Set("Allow", "POST")
</code><code _ngcontent-c14="" class="ng-star-inserted"> http.Error(w, "Only POST is supported", http.StatusMethodNotAllowed)
</code><code _ngcontent-c14="" class="ng-star-inserted"> return
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"> ct := r.FormValue("content_type")
</code><code _ngcontent-c14="" class="ng-star-inserted"> if ct == "" {
</code><code _ngcontent-c14="" class="ng-star-inserted"> http.Error(w, "content_type must be set", http.StatusBadRequest)
</code><code _ngcontent-c14="" class="ng-star-inserted"> return
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"> // Generates an object key for use in new Cloud Storage Object.
</code><code _ngcontent-c14="" class="ng-star-inserted"> // It's not duplicate with any object keys because of UUID.
</code><code _ngcontent-c14="" class="ng-star-inserted"> key := uuid.New().String()
</code><code _ngcontent-c14="" class="ng-star-inserted"> if ext := r.FormValue("ext"); ext != "" {
</code><code _ngcontent-c14="" class="ng-star-inserted"> key += fmt.Sprintf(".%s", ext)
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"> // Generates a signed URL for use in the PUT request to GCS.
</code><code _ngcontent-c14="" class="ng-star-inserted"> // Generated URL should be expired after 15 mins.
</code><code _ngcontent-c14="" class="ng-star-inserted"> url, err := storage.SignedURL(uploadableBucket, key, &storage.SignedURLOptions{
</code><code _ngcontent-c14="" class="ng-star-inserted"> GoogleAccessID: serviceAccountName,
</code><code _ngcontent-c14="" class="ng-star-inserted"> Method: "PUT",
</code><code _ngcontent-c14="" class="ng-star-inserted"> Expires: time.Now().Add(15 * time.Minute),
</code><code _ngcontent-c14="" class="ng-star-inserted"> ContentType: ct,
</code><code _ngcontent-c14="" class="ng-star-inserted"> // To avoid management for private key, use SignBytes instead of PrivateKey.
</code><code _ngcontent-c14="" class="ng-star-inserted"> // In this example, we are using the `iam.serviceAccounts.signBlob` API for signing bytes.
</code><code _ngcontent-c14="" class="ng-star-inserted"> // If you hope to avoid API call for signing bytes every time,
</code><code _ngcontent-c14="" class="ng-star-inserted"> // you can use self hosted private key and pass it in Privatekey.
</code><code _ngcontent-c14="" class="ng-star-inserted"> SignBytes: func(b []byte) ([]byte, error) {
</code><code _ngcontent-c14="" class="ng-star-inserted"> resp, err := iamService.Projects.ServiceAccounts.SignBlob(
</code><code _ngcontent-c14="" class="ng-star-inserted"> serviceAccountID,
</code><code _ngcontent-c14="" class="ng-star-inserted"> &iam.SignBlobRequest{BytesToSign: base64.StdEncoding.EncodeToString(b)},
</code><code _ngcontent-c14="" class="ng-star-inserted"> ).Context(r.Context()).Do()
</code><code _ngcontent-c14="" class="ng-star-inserted"> if err != nil {
</code><code _ngcontent-c14="" class="ng-star-inserted"> return nil, err
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> return base64.StdEncoding.DecodeString(resp.Signature)
</code><code _ngcontent-c14="" class="ng-star-inserted"> },
</code><code _ngcontent-c14="" class="ng-star-inserted"> })
</code><code _ngcontent-c14="" class="ng-star-inserted"> if err != nil {
</code><code _ngcontent-c14="" class="ng-star-inserted"> log.Printf("sign: failed to sign, err = %v\n", err)
</code><code _ngcontent-c14="" class="ng-star-inserted"> http.Error(w, "failed to sign by internal server error", http.StatusInternalServerError)
</code><code _ngcontent-c14="" class="ng-star-inserted"> return
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> w.WriteHeader(http.StatusOK)
</code><code _ngcontent-c14="" class="ng-star-inserted"> fmt.Fprintln(w, url)
</code><code _ngcontent-c14="" class="ng-star-inserted">}
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted">func main() {
</code><code _ngcontent-c14="" class="ng-star-inserted"> cred, err := google.DefaultClient(context.Background(), iam.CloudPlatformScope)
</code><code _ngcontent-c14="" class="ng-star-inserted"> if err != nil {
</code><code _ngcontent-c14="" class="ng-star-inserted"> log.Fatal(err)
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> iamService, err = iam.New(cred)
</code><code _ngcontent-c14="" class="ng-star-inserted"> if err != nil {
</code><code _ngcontent-c14="" class="ng-star-inserted"> log.Fatal(err)
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"> uploadableBucket = os.Getenv("UPLOADABLE_BUCKET")
</code><code _ngcontent-c14="" class="ng-star-inserted"> serviceAccountName = os.Getenv("SERVICE_ACCOUNT")
</code><code _ngcontent-c14="" class="ng-star-inserted"> serviceAccountID = fmt.Sprintf(
</code><code _ngcontent-c14="" class="ng-star-inserted"> "projects/%s/serviceAccounts/%s",
</code><code _ngcontent-c14="" class="ng-star-inserted"> os.Getenv("GOOGLE_CLOUD_PROJECT"),
</code><code _ngcontent-c14="" class="ng-star-inserted"> serviceAccountName,
</code><code _ngcontent-c14="" class="ng-star-inserted"> )
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"> http.HandleFunc("/sign", signHandler)
</code><code _ngcontent-c14="" class="ng-star-inserted"> log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", os.Getenv("PORT")), nil))
</code><code _ngcontent-c14="" class="ng-star-inserted">}</code>
</pre>
</div>
</div>
<br />
コード内で言及しているように、署名付き URL を生成するための方法は大きく分けて二つあります。<br />
<br />
一つはサービスアカウントに紐付いた秘密鍵を使って署名を行う方法です。この方法は自分自身の手で秘密鍵を管理する必要があります。これは <a href="https://cloud.google.com/compute" target="_blank">Google Compute Engine</a> や <a href="https://cloud.google.com/kubernetes-engine/" target="_blank">Google Kubernetes Engine</a> などのフルマネージドでないランタイム上で API サーバを開発・提供するケースに適しています。<br />
<br />
二つ目の方法は、 <a href="https://cloud.google.com/iam/" target="_blank">Cloud Identity and Access Management</a> が提供する Service Account API の中の一つである <code>serviceAccounts.signBlob</code> を用いる方法です。これを用いることによって、アプリケーションランタイムで秘密鍵を管理せずに署名をすることができます。本稿では、秘密鍵の管理を避けるために、この方法を採用しています。<br />
<br />
補足として、 Cloud Storage で署名付き URL を生成するためにサービスアカウント付与すべきパーミッションを次に列挙します。<br />
<br />
<ul>
<li><code>storage.buckets.get</code></li>
<li><code>Storage.objects.create</code></li>
<li><code>Storage.objects.delete</code></li>
</ul>
<br />
二つ目の方法に示した <code>serviceAccounts.signBlob</code> API を使用する場合には、 roles/iam.serviceAccountTokenCreator ロールを付与します。このロールにまとめられたパーミッション群は<a href="https://cloud.google.com/iam/docs/understanding-roles#service-accounts-roles" target="_blank">公式ドキュメント</a>で確認することができます。<br />
<br />
<h2 dir="ltr">
</h2>
<h3>
署名付き URL を使ってファイルをアップロードする</h3>
ここまで説明した機能によって、ユーザーは App Engine 上で生成された署名付き URL を使って Cloud Storage にファイルを直接アップロードできるようになりました。 ここでは、署名付き URL を介して <a href="https://cloud.google.com/storage/docs/xml-api/put-object" target="_blank"><code>Put Object</code></a> と呼ばれる API を呼び出すことで、実際にファイルをアップロードします。<br />
<br />
次に示すのは、モバイルアプリケーションや Web ブラウザなどで実行される処理を想定した Go によるサンプルコードです。前出の App Engine 上で動かすことを想定したソースコードと対応するものになります。<br />
<br />
<div class="h-c-grid">
<div class="uni-paragraph
h-c-grid__col h-c-grid__col--8 h-c-grid__col-m--6 h-c-grid__col-l--6
h-c-grid__col--offset-2 h-c-grid__col-m--offset-3 h-c-grid__col-l--offset-3">
<!----><!----><!----><article-code-block _nghost-c14="" class="ng-star-inserted"><!----></article-code-block><br />
<pre _ngcontent-c14=""> <!----><code _ngcontent-c14="" class="ng-star-inserted">package main
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted">import (
</code><code _ngcontent-c14="" class="ng-star-inserted"> "bytes"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "fmt"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "io/ioutil"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "log"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "net/http"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "net/url"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "strings"
</code><code _ngcontent-c14="" class="ng-star-inserted">)
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted">const signerUrl = "<APPENGINE_URL>"
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted">func getSignedURL(target string, values url.Values) (string, error) {
</code><code _ngcontent-c14="" class="ng-star-inserted"> resp, err := http.PostForm(target, values)
</code><code _ngcontent-c14="" class="ng-star-inserted"> if err != nil {
</code><code _ngcontent-c14="" class="ng-star-inserted"> return "", err
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> defer resp.Body.Close()
</code><code _ngcontent-c14="" class="ng-star-inserted"> b, err := ioutil.ReadAll(resp.Body)
</code><code _ngcontent-c14="" class="ng-star-inserted"> if err != nil {
</code><code _ngcontent-c14="" class="ng-star-inserted"> return "", err
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> return strings.TrimSpace(string(b)), nil
</code><code _ngcontent-c14="" class="ng-star-inserted">}
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted">func main() {
</code><code _ngcontent-c14="" class="ng-star-inserted"> // Get signed url from the API server hosted on App Engine.
</code><code _ngcontent-c14="" class="ng-star-inserted"> u, err := getSignedURL(signerUrl, url.Values{"content_type": {"image/png"}})
</code><code _ngcontent-c14="" class="ng-star-inserted"> if err != nil {
</code><code _ngcontent-c14="" class="ng-star-inserted"> log.Fatal(err)
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> fmt.Printf("Signed URL here: %q\n", u)
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"> b, err := ioutil.ReadFile("/path/to/sample.png")
</code><code _ngcontent-c14="" class="ng-star-inserted"> if err != nil {
</code><code _ngcontent-c14="" class="ng-star-inserted"> log.Fatal(err)
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> // Generates *http.Request to request with PUT method to the Signed URL.
</code><code _ngcontent-c14="" class="ng-star-inserted"> req, err := http.NewRequest("PUT", u, bytes.NewReader(b))
</code><code _ngcontent-c14="" class="ng-star-inserted"> if err != nil {
</code><code _ngcontent-c14="" class="ng-star-inserted"> log.Fatal(err)
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> req.Header.Add("Content-Type", "image/png")
</code><code _ngcontent-c14="" class="ng-star-inserted"> client := new(http.Client)
</code><code _ngcontent-c14="" class="ng-star-inserted"> resp, err := client.Do(req)
</code><code _ngcontent-c14="" class="ng-star-inserted"> if err != nil {
</code><code _ngcontent-c14="" class="ng-star-inserted"> log.Fatal(err)
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> fmt.Println(resp)
</code><code _ngcontent-c14="" class="ng-star-inserted">}</code>
</pre>
</div>
</div>
<br />
<br />
<h2 dir="ltr">
</h2>
<h3>
Cloud Storage の Bucket Lock と Object Lifecycle を署名付き URL と組み合わせる</h3>
前出のアーキテクチャ図からもわかるように本稿では、ファイルのアップロード先を担うバケット (<code>Uploadable Bucket</code>)と、ファイルの配信を担うバケット (<code>Distribution Bucket</code>)の二つの Cloud Storage バケットを定義しています。しかしながら、これらのバケットをデフォルトのまま取り扱うと、大きく分けて二つの問題が発生します。<br />
<br />
一つ目に、アップロードされた全てのオブジェクト(ファイル)は、それにかかる検証を終えた後に Distribution Bucket にコピーされますが、何もしなければそれらのファイルは Uploadable Bucket に存在し続けることになります。しかしそれらのオブジェクトが、それ以降の処理でいずれのコンポーネントからも参照されることはありません。したがって、コピーが完了したオブジェクトを Uploadable Bucket に残し続けておくことには意味がありません。言い換えれば不要な費用が発生し続けるということになります。<br />
<br />
二つ目に、エンドユーザーは署名付き URL の期限内であれば、何度も特定のバケット・オブジェクトキーに対してファイルをアップロードできてしまうということです。言い換えれば、アップロードされたファイルをサーバ側のコンポーネントが参照する度に、その中身が書き換わっている可能性があるということになります。これにより、後述の Cloud Functions で動かすアプリケーションにおいて、リトライと共に冪等性を担保することが困難になります。用途によってはそのような仕様を持っていても構わないのですが、本稿ではよりシンプルな仕様を維持するために、これを問題と捉えて対策します。<br />
<br />
さて、これらの問題を解消するために、<a href="https://cloud.google.com/storage/docs/lifecycle" target="_blank">Object Lifecycle Management</a> と <a href="https://cloud.google.com/storage/docs/bucket-lock" target="_blank">Retention Policy</a> という二つの Cloud Storage 固有の機能を活用します。<br />
<br />
最初に、ライフサイクルを定義することによって、不要なオブジェクトが Uploadable Bucket に残り続けないようにします。これを実現するためには、バケットや署名付き URL の有効期限などに合わせて Cloud Storage 上に存在するオブジェクトのライフサイクルを定義します。本稿では次のように、オブジェクトが Uploadable Bucket にアップロードされてから1日が経過したら、それを不要と判断して削除するライフサイクルを定義します。<br />
<br />
<div class="h-c-grid">
<div class="uni-paragraph
h-c-grid__col h-c-grid__col--8 h-c-grid__col-m--6 h-c-grid__col-l--6
h-c-grid__col--offset-2 h-c-grid__col-m--offset-3 h-c-grid__col-l--offset-3">
<!----><!----><!----><article-code-block _nghost-c14="" class="ng-star-inserted"><!----></article-code-block><br />
<pre _ngcontent-c14=""> <!----><code _ngcontent-c14="" class="ng-star-inserted">{
</code><code _ngcontent-c14="" class="ng-star-inserted"> "rule": [
</code><code _ngcontent-c14="" class="ng-star-inserted"> {
</code><code _ngcontent-c14="" class="ng-star-inserted"> "action": {"type": "Delete"},
</code><code _ngcontent-c14="" class="ng-star-inserted"> "condition": {"age": 1}
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> ]
</code><code _ngcontent-c14="" class="ng-star-inserted">}</code>
</pre>
</div>
</div>
<br />
次に、ユーザーが有効期限内であったとしても何度もファイルをアップロードできないようにするため、保持ポリシーを定義します。<br />
<br />
バケットロックと保持ポリシーを使用して、あるバケットにおけるオブジェクトの保持期間を設定し、その期間中はオブジェクトの上書きや削除ができないようにします。この保持期間を署名付き URL の有効期限に定める値と一致させることで、署名付き URL を介してアップロードされたオブジェクトが、エンドユーザーによって上書きされることを防ぐことができます。なお、前述のライフサイクルの定義によって、オブジェクトは1日が経過すると削除されるため、ライフサイクルとの競合が起こらないようにしてください。仮にライフサイクルとの競合が起きてしまうと、正常にオブジェクトを削除できないなどの問題が発生します。補足として、<a href="https://cloud.google.com/storage/docs/bucket-lock#retention-policy" target="_blank">バージョン管理が有効となっているバケットでは、このバケットロックと保持ポリシーを有効化できない</a>点に注意してください。<br />
<br />
上記の設定を有効化したバケットを作成するためには、次に示すコマンドを実行します。<br />
<br />
<div class="h-c-grid">
<div class="uni-paragraph
h-c-grid__col h-c-grid__col--8 h-c-grid__col-m--6 h-c-grid__col-l--6
h-c-grid__col--offset-2 h-c-grid__col-m--offset-3 h-c-grid__col-l--offset-3">
<!----><!----><!----><article-code-block _nghost-c14="" class="ng-star-inserted"><!----></article-code-block><br />
<pre _ngcontent-c14=""> <!----><code _ngcontent-c14="" class="ng-star-inserted">REGION="REGION"
</code><code _ngcontent-c14="" class="ng-star-inserted">PROJECT_ID="PROJECT_ID"
</code><code _ngcontent-c14="" class="ng-star-inserted">UPLOADABLE_BUCKET="UPLOADABLE_BUCKET"
</code><code _ngcontent-c14="" class="ng-star-inserted">DISTRIBUTION_BUCKET="DISTRIBUTION_BUCKET"
</code><code _ngcontent-c14="" class="ng-star-inserted">LIFECYCLE_POLICY_FILE="/path/to/lifecycle.json"
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"># Creates the uploadable bucket
</code><code _ngcontent-c14="" class="ng-star-inserted">gsutil mb -p $PROJECT_ID -l $REGION --retention 900s gs://$UPLOADABLE_BUCKET
</code><code _ngcontent-c14="" class="ng-star-inserted"># Creates the bucket for distribution
</code><code _ngcontent-c14="" class="ng-star-inserted">gsutil mb -p $PROJECT_ID -l $REGION gs://$DISTRIBUTION_BUCKET
</code><code _ngcontent-c14="" class="ng-star-inserted"># Set lifecyle for the uploadable bucket
</code><code _ngcontent-c14="" class="ng-star-inserted">gsutil lifecycle set $LIFECYCLE_POLICY_FILE gs://$UPLOADABLE_BUCKET</code>
</pre>
</div>
</div>
<br />
<h3 dir="ltr">
ファイルを検証し、コピーする</h3>
これまで、署名付き URL を生成してファイルを直接 Cloud Storage にアップロードし、アップロードされたファイルを適切に管理する方法について解説してきました。しかし、アップロードされたファイルを実際に多くのエンドユーザーに配信する前に、アプリケーションの仕様に合わせてそのファイルの妥当性を検証する必要があります。ここでは、認証されたユーザーによってアップロードされたファイルの有効性・妥当性を検証する方法と共に、検証が済んだオブジェクトを Distribution Bucket にコピーする方法について解説します。<br />
<br />
まず、本稿ではこれを行うために検証・コピーを行う処理を Cloud Functions 上に実装します。Cloud Functions を実行するためには、特定の Cloud Storage のイベントをトリガーとして、予めデプロイしておいた Cloud Functions を呼び出します。対象となる Cloud Storage のイベントには、オブジェクトの書き込み完了を意味する <code>google.storage.object.finalize</code> イベントを用います。<br />
<br />
次に、どのようにバリデーションやそれに付随する処理を行うべきかを考える必要があります。これを順序立てて整理しましょう。<br />
<br />
<ol>
<li>アップロードされたオブジェクトと同一のオブジェクトキーを持つオブジェクトが Distribution Bucket に存在しないことを確認する。</li>
<ol>
<li>オブジェクトキーが存在する場合は、以降の処理を停止する。</li>
<li>これは <a href="https://cloud.google.com/functions/docs/bestpractices/retries#semantics_of_retry" target="_blank">Cloud Functions が at least-once の実行</a>を保証することを考慮し、同様の処理を不要に実行させないためのものである。</li>
</ol>
<li>Uploadable Bucket 内のオブジェクトのメタデータから、<code>Content-Type</code> と ファイルのサイズを取得する。</li>
<ol>
<li>サイズが規定サイズを超過するのものでないことを確認する。規定サイズはアプリケーションの仕様に基づいて決定する。超過している場合は以降の処理を停止する。</li>
<li>本稿ではアップロードされたファイルを Cloud Functions のメモリ上に一度展開するため、Cloud Functions のRAM上限値を考慮して規定サイズを決定するとよい。</li>
</ol>
<li>アップロードされたオブジェクトを実際に取得し、手順 2 で取得した <code>Content-Type</code> に基づいて、そのオブジェクトが適切なファイルフォーマットに準拠していることを確認する。</li>
<ol>
<li>署名付き URL の生成時に指定する <code>Content-Type</code> はあくまでリクエストに指定すべき <code>Content-Type</code> を規定するものであり、アップロードされたオブジェクトがそこに指定されたフォーマットに準拠している保証はない。</li>
<li>オブジェクトが指定されたフォーマットに準拠していないと見做された場合は、以降の処理を停止する。</li>
</ol>
<li>Cloud Vision の <a href="https://cloud.google.com/vision/docs/detecting-safe-search" target="_blank">Safe Search Annotation</a> を用いてアップロードされた画像ファイル(オブジェクト)が不適切な表現を含むものでないことを検証する。</li>
<ol>
<li>暴力描写・アダルト表現・人種差別などの可能性があるものを検閲する。</li>
<li>本稿では <code>likelihood</code> が <code>POSSIBLE</code> 以上のものを該当すると判定し、以降の処理を停止する。</li>
</ol>
<li>全ての検証をパスしたら、アップロードされたオブジェクトを Distribution Bucket にコピーする。</li>
</ol>
<br />
上記の手順を実装するために、本稿では Cloud Functions Go 1.11 ランタイムを使用します。次にソースコードを示します。<br />
<br />
<div class="h-c-grid">
<div class="uni-paragraph
h-c-grid__col h-c-grid__col--8 h-c-grid__col-m--6 h-c-grid__col-l--6
h-c-grid__col--offset-2 h-c-grid__col-m--offset-3 h-c-grid__col-l--offset-3">
<!----><!----><!----><article-code-block _nghost-c14="" class="ng-star-inserted"><!----></article-code-block><br />
<pre _ngcontent-c14=""> <!----><code _ngcontent-c14="" class="ng-star-inserted">package function
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted">import (
</code><code _ngcontent-c14="" class="ng-star-inserted"> "context"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "errors"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "fmt"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "image"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "image/gif"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "image/jpeg"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "image/png"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "log"
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"> "cloud.google.com/go/storage"
</code><code _ngcontent-c14="" class="ng-star-inserted"> vision "cloud.google.com/go/vision/apiv1"
</code><code _ngcontent-c14="" class="ng-star-inserted"> "golang.org/x/xerrors"
</code><code _ngcontent-c14="" class="ng-star-inserted"> pb "google.golang.org/genproto/googleapis/cloud/vision/v1"
</code><code _ngcontent-c14="" class="ng-star-inserted">)
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted">type GCSEvent struct {
</code><code _ngcontent-c14="" class="ng-star-inserted"> Bucket string `json:"bucket"`
</code><code _ngcontent-c14="" class="ng-star-inserted"> Name string `json:"name"`
</code><code _ngcontent-c14="" class="ng-star-inserted">}
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted">var retryableError = xerrors.New("upload: retryable error")
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted">func validate(ctx context.Context, obj *storage.ObjectHandle) error {
</code><code _ngcontent-c14="" class="ng-star-inserted"> attrs, err := obj.Attrs(ctx)
</code><code _ngcontent-c14="" class="ng-star-inserted"> if err != nil {
</code><code _ngcontent-c14="" class="ng-star-inserted"> return xerrors.Errorf("upload: failed to get object attributes %q : %w",
</code><code _ngcontent-c14="" class="ng-star-inserted"> obj.ObjectName(), retryableError)
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> // You can enlarge maximum size up to 20MB by modifying this line.
</code><code _ngcontent-c14="" class="ng-star-inserted"> if attrs.Size >= 1024*100 {
</code><code _ngcontent-c14="" class="ng-star-inserted"> return fmt.Errorf("upload: image file is too large, got = %d", attrs.Size)
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> // Validates obj and returns true if it conforms supported image formats.
</code><code _ngcontent-c14="" class="ng-star-inserted"> if err := validateMIMEType(ctx, attrs, obj); err != nil {
</code><code _ngcontent-c14="" class="ng-star-inserted"> return err
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> // Validates obj by calling Vision API.
</code><code _ngcontent-c14="" class="ng-star-inserted"> return validateByVisionAPI(ctx, obj)
</code><code _ngcontent-c14="" class="ng-star-inserted">}
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted">func validateMIMEType(ctx context.Context, attrs *storage.ObjectAttrs, obj *storage.ObjectHandle) error {
</code><code _ngcontent-c14="" class="ng-star-inserted"> r, err := obj.NewReader(ctx)
</code><code _ngcontent-c14="" class="ng-star-inserted"> if err != nil {
</code><code _ngcontent-c14="" class="ng-star-inserted"> return xerrors.Errorf("upload: failed to open new file %q : %w",
</code><code _ngcontent-c14="" class="ng-star-inserted"> obj.ObjectName(), retryableError)
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> defer r.Close()
</code><code _ngcontent-c14="" class="ng-star-inserted"> if _, err := func(ct string) (image.Image, error) {
</code><code _ngcontent-c14="" class="ng-star-inserted"> switch ct {
</code><code _ngcontent-c14="" class="ng-star-inserted"> case "image/png":
</code><code _ngcontent-c14="" class="ng-star-inserted"> return png.Decode(r)
</code><code _ngcontent-c14="" class="ng-star-inserted"> case "image/jpeg", "image/jpg":
</code><code _ngcontent-c14="" class="ng-star-inserted"> return jpeg.Decode(r)
</code><code _ngcontent-c14="" class="ng-star-inserted"> case "image/gif":
</code><code _ngcontent-c14="" class="ng-star-inserted"> return gif.Decode(r)
</code><code _ngcontent-c14="" class="ng-star-inserted"> default:
</code><code _ngcontent-c14="" class="ng-star-inserted"> return nil, fmt.Errorf("upload: unsupported MIME type, got = %q", ct)
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> }(attrs.ContentType); err != nil {
</code><code _ngcontent-c14="" class="ng-star-inserted"> return err
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> return nil
</code><code _ngcontent-c14="" class="ng-star-inserted">}
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted">// validateByVisionAPI uses Safe Search Detection provided by Cloud Vision API.
</code><code _ngcontent-c14="" class="ng-star-inserted">// See more details: https://cloud.google.com/vision/docs/detecting-safe-search
</code><code _ngcontent-c14="" class="ng-star-inserted">func validateByVisionAPI(ctx context.Context, obj *storage.ObjectHandle) error {
</code><code _ngcontent-c14="" class="ng-star-inserted"> client, err := vision.NewImageAnnotatorClient(ctx)
</code><code _ngcontent-c14="" class="ng-star-inserted"> if err != nil {
</code><code _ngcontent-c14="" class="ng-star-inserted"> return xerrors.Errorf(
</code><code _ngcontent-c14="" class="ng-star-inserted"> "upload: failed to create a ImageAnnotator client, error = %v : %w",
</code><code _ngcontent-c14="" class="ng-star-inserted"> err,
</code><code _ngcontent-c14="" class="ng-star-inserted"> retryableError,
</code><code _ngcontent-c14="" class="ng-star-inserted"> )
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> ssa, err := client.DetectSafeSearch(
</code><code _ngcontent-c14="" class="ng-star-inserted"> ctx,
</code><code _ngcontent-c14="" class="ng-star-inserted"> vision.NewImageFromURI(fmt.Sprintf("gs://%s/%s", obj.BucketName(), obj.ObjectName())),
</code><code _ngcontent-c14="" class="ng-star-inserted"> nil,
</code><code _ngcontent-c14="" class="ng-star-inserted"> )
</code><code _ngcontent-c14="" class="ng-star-inserted"> if err != nil {
</code><code _ngcontent-c14="" class="ng-star-inserted"> return xerrors.Errorf(
</code><code _ngcontent-c14="" class="ng-star-inserted"> "upload: failed to detect safe search, error = %v : %w",
</code><code _ngcontent-c14="" class="ng-star-inserted"> err,
</code><code _ngcontent-c14="" class="ng-star-inserted"> retryableError,
</code><code _ngcontent-c14="" class="ng-star-inserted"> )
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> // Returns an unretryable error if there is any possibility of inappropriate image.
</code><code _ngcontent-c14="" class="ng-star-inserted"> // Likelihood has been defined in the following:
</code><code _ngcontent-c14="" class="ng-star-inserted"> // https://github.com/google/go-genproto/blob/5fe7a883aa19554f42890211544aa549836af7b7/googleapis/cloud/vision/v1/image_annotator.pb.go#L37-L50
</code><code _ngcontent-c14="" class="ng-star-inserted"> if ssa.Adult >= pb.Likelihood_POSSIBLE ||
</code><code _ngcontent-c14="" class="ng-star-inserted"> ssa.Medical >= pb.Likelihood_POSSIBLE ||
</code><code _ngcontent-c14="" class="ng-star-inserted"> ssa.Violence >= pb.Likelihood_POSSIBLE ||
</code><code _ngcontent-c14="" class="ng-star-inserted"> ssa.Racy >= pb.Likelihood_POSSIBLE {
</code><code _ngcontent-c14="" class="ng-star-inserted"> return errors.New("upload: exceeds the prescribed likelihood")
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> return nil
</code><code _ngcontent-c14="" class="ng-star-inserted">}
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted">// distributionBucket is the distribution bucket.
</code><code _ngcontent-c14="" class="ng-star-inserted">// It's used for distributing all of passed files.
</code><code _ngcontent-c14="" class="ng-star-inserted">// TODO: This value MUST be updated before deploying this function.
</code><code _ngcontent-c14="" class="ng-star-inserted">const distributionBucket = "DISTRIBUTION_BUCKET"
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted">// UplaodImage validates the object and copy it into the distribution bucket.
</code><code _ngcontent-c14="" class="ng-star-inserted">func UploadImage(ctx context.Context, e GCSEvent) error {
</code><code _ngcontent-c14="" class="ng-star-inserted"> client, err := storage.NewClient(ctx)
</code><code _ngcontent-c14="" class="ng-star-inserted"> if err != nil {
</code><code _ngcontent-c14="" class="ng-star-inserted"> return fmt.Errorf("upload: failed to construct a client, error = %v", err)
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> defer client.Close()
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"> dst := client.Bucket(distributionBucket).Object(e.Name)
</code><code _ngcontent-c14="" class="ng-star-inserted"> _, err = dst.Attrs(ctx)
</code><code _ngcontent-c14="" class="ng-star-inserted"> // Avoid proceeding if the object has been copied to destination.
</code><code _ngcontent-c14="" class="ng-star-inserted"> if err == nil {
</code><code _ngcontent-c14="" class="ng-star-inserted"> log.Printf("upload: %s has already been copied to destination\n", e.Name)
</code><code _ngcontent-c14="" class="ng-star-inserted"> return nil
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> // Return retryable error as there is a possibility that object does not temporarily exist.
</code><code _ngcontent-c14="" class="ng-star-inserted"> if err != storage.ErrObjectNotExist {
</code><code _ngcontent-c14="" class="ng-star-inserted"> return err
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> src := client.Bucket(e.Bucket).Object(e.Name)
</code><code _ngcontent-c14="" class="ng-star-inserted"> if err := validate(ctx, src); err != nil {
</code><code _ngcontent-c14="" class="ng-star-inserted"> if xerrors.Is(err, retryableError) {
</code><code _ngcontent-c14="" class="ng-star-inserted"> return err
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> log.Println(err)
</code><code _ngcontent-c14="" class="ng-star-inserted"> return nil
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted"> // Returns an error if the copy operation failed.
</code><code _ngcontent-c14="" class="ng-star-inserted"> // Will retry the same processing later.
</code><code _ngcontent-c14="" class="ng-star-inserted"> if _, err := dst.CopierFrom(src).Run(ctx); err != nil {
</code><code _ngcontent-c14="" class="ng-star-inserted"> return err
</code><code _ngcontent-c14="" class="ng-star-inserted"> }
</code><code _ngcontent-c14="" class="ng-star-inserted">
</code><code _ngcontent-c14="" class="ng-star-inserted"> return nil
</code><code _ngcontent-c14="" class="ng-star-inserted">}</code>
</pre>
</div>
</div>
<br />
上記のソースコードにおける <code>UploadImage</code> という関数を Cloud Functions にデプロイするために、次のコマンドを実行します。<br />
<br />
<div class="h-c-grid">
<div class="uni-paragraph
h-c-grid__col h-c-grid__col--8 h-c-grid__col-m--6 h-c-grid__col-l--6
h-c-grid__col--offset-2 h-c-grid__col-m--offset-3 h-c-grid__col-l--offset-3">
<!----><!----><!----><article-code-block _nghost-c14="" class="ng-star-inserted"><!----></article-code-block><br />
<pre _ngcontent-c14=""> <!----><code _ngcontent-c14="" class="ng-star-inserted">gcloud functions deploy UploadImage --runtime go111 --trigger-resource [UPLOADABLE_BUCKET] --trigger-event google.storage.object.finalize --retry</code>
</pre>
</div>
</div>
<br />
--retry オプションを付けて実行することで、Cloud Functions や Cloud Storage の一時的なエラーに備えることができます。一方でリトライを有効化する際には、それを考慮してコーディングをする必要がある点に注意してください。また前出のソースコードについても、 Cloud Functions が at-least once の実行を保証することを考えれば、 Distribution Bucket へのコピーが一回以上行われる可能性を否定できないなど、冪等な実装になっているとは言えませんが、この場合は副作用はありません。<br />
<br />
<h3 dir="ltr">
ファイルをアップロードする</h3>
<br />
ここまでに設計し、実装してきたシステムに対して、実際にファイルをアップロードしてみましょう。テストは非常に簡単です。前述の署名付き URL を App Engine にリクエストし、そのURLに対してファイルをアップロードするために示したソースコードを実行します。<br />
<br />
Cloud Functions の実行が完了したら、Uploadable Bucket 内のオブジェクトが Distribution Bucket にコピーされていることを確認します。 Distribution Bucket へのアクセスを全体に対して公開していれば、コピーが完了した時点でそのオブジェクトはインターネットに公開されていることを意味します。なお、あなたが設計するシステムの要件によっては、Cloud Functions の処理は非同期に実行されるため、配信の開始を Push 通知などの方法でエンドユーザーに伝える必要があるかもしれません。もしくは、エンドユーザーからのリクエストを同期的に処理するシステムのデータベースの更新が必要となるかもしれません。マイクロサービス・アーキテクチャを採用しているならば、Cloud Functions から元のアプリケーションに HTTP リクエストを送信しても良いでしょう。<br />
<br />
本稿で提案したシステムをカスタマイズして、あなたの目的に合わせたファイルアップロード機能を開発することができるはずです。 Google Cloud Platform には、ここで紹介したコンポーネントや機能以外にも様々な選択肢があります。例えば、ファイルをアップロードする際の条件をより詳細に規定したい場合や、<a href="https://cloud.google.com/storage/docs/xml-api/post-object" target="_blank">POST Object</a> を使いたい場合には、<a href="https://cloud.google.com/storage/docs/xml-api/post-object#policydocument" target="_blank">署名付きポリシードキュメント</a>を署名付き URL の代わりに使用することができます。また、モバイルアプリや Web サービスの開発に <a href="https://firebase.google.com/" target="_blank">Firebase</a> を使用している場合には、ここで紹介した署名付き URL の代わりに <a href="https://firebase.google.com/products/storage/" target="_blank">Cloud Storage for Firebase</a> を使用することができます。<br />
<br />
本稿の内容があなたのアーキテクチャ設計の一助となれば幸いです。<br />
<br />
Google Cloud のエキスパートと繋がり、本稿で提案したアーキテクチャについてより深く学びたい方は <a href="https://cloud.google.com/consulting/" target="_blank">Google Cloud のコンサルティングサービス</a>を確認してください。<br />
<br />Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-49999244828447404462019-06-07T16:00:00.000+09:002019-06-10T09:41:05.805+09:002019 年 6 月 25 日(金):第 9 回 INEVITABLE ja night を開催します<div class="separator" style="clear: both; text-align: center;">
<a href="https://goo.gle/2K4NGNH" target="_blank"><img border="0" data-original-height="800" data-original-width="1440" height="354" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifr79DjMvHRIGqOhE12tcaqnqnrV-uRF46CyDUkU3agzuKg8DHC13iMOLWH71sGmyeh2bJPXwbb4xupc_P_JkSQIJTyVnpdAvg2juxmd88mXcZMzZb5vE6GeOI6TP-5fE3naUEvzY_qYoY/s640/INEVITABLE-Ja-Night-9_final.jpg" width="640" /></a></div>
<br />
Google Cloud に代表されるクラウド技術の進化が引き起こすその先の世界を、機械学習、VR / AR、IoT などの領域で活躍されているスタートアップの方々と一緒に議論するイベント「<a href="https://goo.gle/2K4NGNH" target="_blank">INEVITABLE ja night</a>」。<br />
<br />
第 9 回目となる今回は、「デベロッパーカンファレンスから読み解くテクノロジーの不可避な流れ」がテーマです。対談では、国内外のデベロッパーカンファレンスに数多く参加されている及川卓也さんをお迎えし、次々に登場する新しいテクノロジーがビジネスをどのように変えていくのか、その潮流について語っていただきます。<br />
<br />
また、Google からは、この 4 月、5 月に米国で開催された Cloud Next ‘19や Google I/O 2019で発表されたテクノロジーやビジネス事例を中心にご紹介します。<br />
<br />
講演会後には恒例の交流会も行います。参加者様同士の交流はもちろん、日頃の業務の課題や悩みについても、ご相談/共有いただける良い機会となります。<br />
<br />
本テーマにご関心のある方々のご参加をお待ちしています。<br />
<br />
<h3>
開催概要</h3>
<blockquote class="tr_bq">
イベント名 : INEVITABLE ja night - “インターネットの次にくるもの”<br />
第 9 回 デベロッパーカンファレンスから読み解く
テクノロジーの不可避な流れ<br />
日程 : 2019 年 6 月 25 日(金) 19:00 〜 21:00(開場 18:30 より)<br />
会場 : グーグル合同会社<br />
定員 : 200 名<br />
ハッシュタグ : #inevitableja</blockquote>
<br />
<h3>
プログラム</h3>
<blockquote class="tr_bq">
<strong>INEVITABLE 対談</strong><br />
スピーカー:及川 卓也 氏, Tably株式会社 代表取締役 Technology Enabler<br />
聞き手:小島 英揮 氏、Still Day One合同会社 代表社員 パラレルマーケター・エバンジェリスト
</blockquote>
<br />
<blockquote class="tr_bq">
<strong>Google テクノロジーアップデート</strong><br />
佐藤 一憲 グーグル合同会社 デベロッパーアドボケイト<br />
福田 潔 グーグル・クラウド・ジャパン合同会社 カスタマーエンジニア<br />
松田 白朗 (Hak) グーグル合同会社 デベロッパーアドボケイト</blockquote>
<br />
<h3>
申し込みサイト</h3>
<blockquote class="tr_bq">
<a href="https://goo.gle/2K4NGNH">https://goo.gle/2K4NGNH</a></blockquote>
<br />
多数のご参加をお待ちしております。<br />
<br />
<br />
<hr />
<br />
<h2>
■■■ INEVITABLE TV のご案内 ■■■</h2>
<br />
<a href="https://inthecloud.withgoogle.com/inevitable-brand-19/broadcast.html" target="_blank">INEVITABLE TV</a> では、イベントでは取り上げることができなかったこと、語り尽くせなかったことを中心に、「インターネットの次に来るもの」に関連する話題を深く掘り下げていきます。こちらもぜひご覧ください。<br />
<ul>
<li><a href="https://www.youtube.com/watch?v=_V7Q7liFtew" target="_blank">PWA (Progressive Web Apps) への不可避な流れ</a>(ゲスト:宇都宮 佑亮)</li>
<li><a href="https://www.youtube.com/watch?v=hbfGQMUeM9o&list=PL6JjkP52HWezQeUP5yhxDbkIlpSyctO5n&index=9&t=0s" target="_blank">CXO 視点で見る、エクスペリエンスとテクノロジーの関係</a>(ゲスト:深津 貴之 氏)</li>
</ul>
その他<br />
<ul>
<li><a href="https://youtu.be/gr6BQhNxf_Y" target="_blank">IoT 活用最前線、ソラコムに聞く事例 7 選</a>(ゲスト:玉川 憲 氏)</li>
<li><a href="https://www.youtube.com/watch?v=gOp70m4pU10" target="_blank">街×テクノロジーの不可避な流れ</a>(ゲスト:林 直孝 氏)</li>
<li><a href="https://youtu.be/3cI7mcYuS68" target="_blank">エンターテック最前線</a>(ゲスト :鈴木 貴歩 氏)</li>
<li><a href="https://youtu.be/mz65apjZ-qk" target="_blank">VUI の普及と進化の方向性 </a>(ゲスト : 岩佐 琢磨 氏)</li>
<li><a href="https://youtu.be/0K7sc3rAirY" target="_blank">TPU が拓く AI 活用の近未来</a>(ゲスト:佐藤 一憲)</li>
<li><a href="https://youtu.be/UiMHxurUBEw" target="_blank">AR のこれまでの歩みと今後の展望</a>(ゲスト:松田 白朗)</li>
</ul>
Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-8858575249021937312019-06-06T15:00:00.000+09:002019-06-06T15:00:06.055+09:00「GCP 認定資格チャレンジ - デベロッパー 編」キャンペーンをスタート<div class="separator" style="clear: both; text-align: center;">
<a href="https://goo.gle/2WkkwBl" target="_blank"><img border="0" data-original-height="560" data-original-width="1200" height="298" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9rCExS5MSGz_MYCsWQGOGOo4-bipF1Y9cumJHuamvu5_X02B5_nEVU33H4b7Z8RpWZ_dBnzQhtG4wS1nTOYEi5JFo1oLaIUlpoRNojYoVcH6aAqtJBlXZ0qAESSlEzBjDCvAP1yX0duui/s640/Learners_header_1200%25C3%2597560.jpg" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
クラウド テクノロジーが IT の主流となりつつある昨今、多くの企業にとって、クラウドのスキルを持つ技術者の確保が大きな課題となっています。一方で、オンプレミスなど従来からのテクニカル スキルを持つ技術者にとっては、クラウド テクノロジーを学ぶことが今後のキャリアに重要な価値をもたらします。<br />
<br />
こうした状況をふまえ、Google Cloud では今年 1 月に発表したように、クラウド スキルの向上支援を本年の重要項目として取り上げています。クラウドの成功に特に必要とされる人材の確保に直結するよう、認定資格のラインアップを増やすとともに、資格取得を支援するトレーニングの提供も推進しています。<br />
<br />
このたび、Google Cloud Japan では、今年新たに提供を開始した<strong>「Google Cloud 認定 Professional Cloud Developer」の認定資格を、日本語にて提供開始</strong>いたしました。<br />
<br />
また、本認定資格をより多くの方に取得いただけるよう、本日より「<a href="https://goo.gle/2WkkwBl" target="_blank">GCP 認定資格チャレンジ - デベロッパー編」キャンペーン</a>を開始いたします。<br />
<br />
本キャンペーンでは、認定資格取得に必要な知識を習得するための学習コースとして、Coursera が提供するオンデマンド トレーニングと、オンラインで GCP のハンズオンを行えるセルフペース ラボを、それぞれ 1 か月間無料で提供いたします。<br />
キャンペーン期間は、<strong>6 月 6 日(木)から 7 月 19 日(金)</strong>となりますので、お早めにお申込みください。<br />
キャンペーンの詳細およびご登録は、<a href="https://goo.gle/2WkkwBl" target="_blank">こちら</a>よりご確認いただけます。<br />
<br />
私たちは Google Cloud Platform をより多くの皆さまにお使いいただけるよう、引き続き学習プログラムの拡張を全力で推進してまいります。
皆さまもぜひご活用ください。Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-68228090548866423972019-06-06T11:00:00.000+09:002019-06-06T21:33:02.791+09:00Cloud OnAir 番組レポート : オンプレミスから GCP へのデータの移行<a href="https://goo.gl/kWM1J3" target="_blank">Cloud OnAir</a> は、Google Cloud の製品をわかりやすく解説し、最新の情報などをいち早く皆様にお伝えする Online 番組です。<br />
<br />
5 月 30 日の放送では、オンプレミスのデータを <a href="https://cloud.google.com/bigquery/?hl=ja" target="_blank">BigQuery</a> に移行する際のポイントを解説します。オンプレミスにあるデータを効率的に BigQuery に持っていくためには、技術面、運用面、組織面などから最適なアーキテクチャを探っていく必要があります。番組では、オンプレミスにあるデータを BigQuery に持ってくるために必要な技術要素を 3 つに取り上げ、よくあるケースとそれを実現するアーキテクチャについて解説します。<br />
<br />
<h3>
アーキテクチャを選択する</h3>
オンプレミスのデータを <a href="https://cloud.google.com/storage/?hl=ja" target="_blank">Google Cloud Storage</a> に効率よく移行するには、ネットワーク、ツール、パイプライン管理の 3 つの観点から、アーキテクチャを探っていくことが重要です。<br />
<br />
<strong>ネットワーク</strong><br />
オンプレミス環境と GCP を接続するネットワーク構成について紹介します。<br />
<br />
大別するとパブリック接続(インターネット経由)とプライベート接続があり、プライベート接続は、<a href="https://cloud.google.com/vpn/docs/?hl=ja" target="_blank">VPN</a>、<a href="https://cloud.google.com/interconnect/docs/concepts/partner-overview?hl=ja" target="_blank">Partner Interconnect</a>、<a href="https://cloud.google.com/interconnect/docs/concepts/dedicated-overview?hl=ja" target="_blank">Dedicated Interconnect </a>に分かれます。インターネット経由で Google Cloud Storage を使う場合は、オンプレミス環境と GCP 間は すべて HTTPS の暗号化通信となるため、十分なセキュリティを確保することができます。<br />
<br />
一方、セキュリティポリシー等により、VPN または Interconnect での接続が必要となる場合は、VPC 内のプロキシ経由で接続する事も可能です。さらに、DNS とルーティングの設定を追加することで通信経路全体をプライベートにすることができます。<br />
<br />
<strong>ツール</strong><br />
データ転送に使うツールです。オンプレ側で使うものと、GCP 側で使うツールに大別されます。<br />
<ul>
<li>オンプレ側で使う代表的なものとして、オープンソースのログ転送ツール <a href="https://www.fluentd.org/" target="_blank">Fluend </a>があります。ストリーミングでログデータを GCP 側に持っていく際に使います。</li>
<li>GCP 側では、<a href="https://beam.apache.org/" target="_blank">Apache Beam</a> のマネージドな実行エンジンである <a href="https://cloud.google.com/dataflow/?hl=ja" target="_blank">Cloud Dataflow</a>、ノンコーディングで ETL 処理とパイプライン管理が可能な <a href="https://cloud.google.com/data-fusion/?hl=ja" target="_blank">Cloud Data Fusion</a> がよく利用されます。</li>
<li>オンプレ側でも GCP 側でも使われるものが、Google Cloud Storage の コマンドラインツールである gsutil、オープンソースのバッチ転送ツールである embulk、GCP クライアントライブラリです。</li>
</ul>
<br />
<strong>全体のデータパイプラインの管理</strong><br />
GCP のサービスとして、<a href="https://cloud.google.com/composer/?hl=ja" target="_blank">Cloud Composer</a> と Cloud Data Fusion がパイプライン管理をサポートします。Cloud Composer は <a href="https://airflow.apache.org/" target="_blank">Amache Airflow</a> を基に構築された、フルマネージドのワークフロー オーケストレーション サービスです。クラウドとオンプレミス データセンターにまたがるパイプラインの作成、スケジューリング、モニタリングを実現します。Cloud Composer パイプラインは、Python を使用して有向非巡回グラフ(DAG)として構成でき、ユーザーの経験を問わずに簡単にワークフローを作成したり、スケジュールを設定したりできます。タスクの実行を司る Operator も充実していることも特徴です。なお、Airflow 以外のパイプライン管理ツールとしては、Digdag や Luigi というものもあります。<br />
<br />
<br />
<strong>ユースケースとサンプルアーキテクチャ</strong><br />
よくあるケースを例に、どのようなアーキテクチャが考えられるかを紹介します。ここでは、次の 3 つのユースケースを取り上げます。<br />
<br />
<ol>
<li>初めて BigQuery を使って自社データを分析するという、まずは、何ができるかを試してみたいというケースです。</li>
<li>1. に加えて、ネットワークをプライベート接続としたいケース。</li>
<li>オンプレミス環境上の DB を定期的にアクセス、データを転送して、分析するケース。日々の売上データを分析するといった場合です。 企業の重要情報を扱うため、DB への接続方式に制限があったり、セキュリティポリシー上、プライベート接続のみという場合もあります。</li>
</ol>
<br />
番組では、それぞれのケースにあった、GCP のサービスの選択と組み合わせ方、またそれらを利用する上での注意点を詳しく解説しています。<br />
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/UOeh2mt7XJE" width="560"></iframe>
</div>
<div style="text-align: center;">
<a href="https://cloudonair.withgoogle.com/events/cloud-onair-japan-q2-2019/watch?talk=tky_dw_q2" target="_blank">2019 年 5 月 30 日放送 </a></div>
<div style="text-align: center;">
<a href="https://cloudonair.withgoogle.com/events/cloud-onair-japan-q2-2019/watch?talk=tky_dw_q2" target="_blank">オンプレミスにあるデータを GCP で分析する前に知っておきたいアーキテクチャ</a></div>
<div style="text-align: center;">
<br /></div>
<br />
番組で説明した資料は<a href="https://www.slideshare.net/GoogleCloudPlatformJP/cloud-onair-gcp-2019530" target="_blank"><b>こちら</b></a>で公開しています。
<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/GtwOh1tvTg3mm" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe></div>
<div style="text-align: center;">
<a href="https://www.slideshare.net/GoogleCloudPlatformJP/cloud-onair-gcp-2019516" target="_blank"><b>オンプレミスにあるデータを GCP で分析する前に知っておきたいアーキテクチャ</b></a><b> </b>from<a href="https://www.slideshare.net/GoogleCloudPlatformJP/cloud-onair-gcp-2019530" target="_blank"> <b>Google Cloud Platform - Japan</b></a></div>
<div style="text-align: center;">
<br />
<br /></div>
<a href="https://goo.gl/kWM1J3" target="_blank">Cloud OnAir</a> では、各回 Google Cloud のエンジニアがトピックを設け、Google Cloud の最新情報を解説しています。過去の番組、説明資料、さらには視聴者からの質問と回答は<a href="https://goo.gl/kWM1J3" target="_blank">こちら</a>よりご覧いただけます。 最新の情報を得るためにもまずはご登録をお願いします。Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-7059269042453331282019-06-05T11:25:00.000+09:002019-06-05T11:30:41.499+09:00Google Cloud Next ’19 in Tokyo セッション登録を開始<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHGXF3cWqPxJBveRS34chQEZpU5t7s9Sk07cAeHfzR7tnHhWMqjTII3R9pTihuJL7wQhyphenhyphenXq04WElQkAc8IEhRvOvECZG1rFQmf9gEUB9aO7fHUqxzJpdAINtykOuYWV5TkFPqFXh8JeSYf/s1600/eDMbanner0528.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="452" data-original-width="1200" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHGXF3cWqPxJBveRS34chQEZpU5t7s9Sk07cAeHfzR7tnHhWMqjTII3R9pTihuJL7wQhyphenhyphenXq04WElQkAc8IEhRvOvECZG1rFQmf9gEUB9aO7fHUqxzJpdAINtykOuYWV5TkFPqFXh8JeSYf/s640/eDMbanner0528.jpg" width="640" /></a></div>
7 月 30 日(水)〜 8 月 1 日(木)の 3 日間にわたって開催する <a href="https://cloud.withgoogle.com/next/tokyo?utm_source=google&utm_medium=social&utm_campaign=FY19-Q3-apac-next-physicalevent-er-gen_reg_scl&utm_content=gsblog" target="_blank">Google Cloud Next '19 in Tokyo</a> まで 2 か月をきりました。本日より、イベントサイトに各セッションのスピーカーや詳細スケジュールを公開し、セッション登録をしていただけるようになりました。<br />
<br />
7 月 31 日(水)および 8 月 1 日(木)の午前中に開催する基調講演では、『かつてないクラウドを体験しよう』 をテーマに、20 年もの間 Google で活動する ウルス ヘルツル(テクニカル インフラストラクチャ部門 シニア バイス プレジデント)をはじめ、テクノロジーカンパニーとしてクラウドの活用を牽引する株式会社ディー・エヌ・エー 代表取締役会長 南場 智子 氏など多数のゲストスピーカーにご登壇いただく予定です。<br />
<br />
午後のブレイクアウト セッションでは、機械学習と AI、データ分析、DevOps・SRE、セキュリティやハイブリッドクラウドなど多岐にわたるカテゴリのセッションをご用意しています。ハンズオン ラボ や Bootcamp など、約 160 のセッションに、ぜひご参加ください。<br />
<br />
<div style="text-align: center;">
セッションページは<a href="https://cloud.withgoogle.com/next/tokyo/sessions?utm_source=google&utm_medium=social&utm_campaign=FY19-Q3-apac-next-physicalevent-er-gen_reg_scl&utm_content=gsblog" target="_blank">こちら</a></div>
<br />
<br />
ご自身の興味関心のあるテーマやレベルでフィルタリングして、選択が可能です。また、今年は担当部門に合わせたセッション パッケージもご用意しています。ぜひご活用ください。<br />
<ul>
<li>ビジネス部門 ご担当者様向け おすすめセッションは<a href="https://cloud.withgoogle.com/next/tokyo/sessions?filter=package-bizinesubu-men-xiang-ke&utm_source=google&utm_medium=social&utm_campaign=FY19-Q3-apac-next-physicalevent-er-gen_reg_scl&utm_content=gsblog" target="_blank">こちら</a></li>
<li>開発部門 ご担当者様向け おすすめセッションは<a href="https://cloud.withgoogle.com/next/tokyo/sessions?filter=package-kai-fa-bu-men-xiang-ke&utm_source=google&utm_medium=social&utm_campaign=FY19-Q3-apac-next-physicalevent-er-gen_reg_scl&utm_content=gsblog" target="_blank">こちら</a></li>
<li>情報システム部門 ご担当者様向け おすすめセッションは<a href="https://cloud.withgoogle.com/next/tokyo/sessions?filter=package-qing-bao-shisutemubu-men-xiang-ke&utm_source=google&utm_medium=social&utm_campaign=FY19-Q3-apac-next-physicalevent-er-gen_reg_scl&utm_content=gsblog" target="_blank">こちら</a></li>
<li>データ部門 ご担当者様向け おすすめセッションは<a href="https://cloud.withgoogle.com/next/tokyo/sessions?filter=package-detabu-men-xiang-ke&utm_source=google&utm_medium=social&utm_campaign=FY19-Q3-apac-next-physicalevent-er-gen_reg_scl&utm_content=gsblog" target="_blank">こちら</a></li>
</ul>
<br />
人気セッションは早期の満席が予想されますので、まずはイベント参加登録にお申込みいただき、ご希望のセッションへのご登録をお願いたします。<br />
<br />
<div style="text-align: center;">
<a href="https://cloud.withgoogle.com/next/tokyo?utm_source=google&utm_medium=social&utm_campaign=FY19-Q3-apac-next-physicalevent-er-gen_reg_scl&utm_content=gsblog" target="_blank">イベントお申し込み & セッション登録</a></div>
<br />
<br />
<h2>
イベント概要</h2>
<blockquote class="tr_bq">
イベント名: Google Cloud Next ’19 in Tokyo<br />
ウェブサイト:<a href="https://cloud.withgoogle.com/next/tokyo?utm_source=google&utm_medium=social&utm_campaign=FY19-Q3-apac-next-physicalevent-er-gen_reg_scl&utm_content=gsblog" target="_blank">https://cloud.withgoogle.com/next/tokyo</a><br />
日程: 2019 年 7 月 30 日(火)・7 月 31 日(水)・ 8 月 1 日(木)<br />
時間:<br />
<u>7 月 30 日(火)</u><br />
<blockquote class="tr_bq">
Bootcamp コース(有料) 9:30 〜 18:00(予定)<br />
DevDay 10:00 〜 20:00(予定)</blockquote>
<u>7 月 31 日(水)・ 8 月 1 日(木)</u><br />
<blockquote class="tr_bq">
開場 8:30 (予定)<br />
基調講演 9:30 〜 11:30 (予定)<br />
セッション 12:00 〜 18:00(予定)</blockquote>
会場: <a href="http://www2.princehotels.co.jp/parktower/access/" target="_blank">ザ・プリンス パークタワー東京</a> および<a href="http://www.princehotels.co.jp/tokyo/access/" target="_blank">東京プリンスホテル</a></blockquote>
注意事項<br />
<div style="line-height: 1.0;">
<span style="font-size: small;">※ 本カンファレンスは、Google Cloud の製品・サービス導入を検討されているエンドユーザー企業、団体、教育機関、政府自治体向けのイベントです。</span><br />
<span style="font-size: small;">※ 十分な座席数をご用意しておりますが、定員を超えた場合、エンドユーザー企業様優先の抽選とさせていただきます。</span><br />
<span style="font-size: small;">※ イベントの当日登録は承ることが出来ません。前もってご登録くださいますよう、お願いいたします。</span><br />
<span style="font-size: small;">※ ご不明な点は、FAQ をご確認ください。</span><br />
<span style="font-size: small;"><br /></span></div>
<hr />
お問い合わせ先<br />
Google Cloud Next Tokyo 運営事務局<br />
gc-nexttokyo-info@google.comGoogle for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-18574119306123501652019-05-31T09:00:00.000+09:002019-07-16T07:12:41.854+09:00ブラウザ翻訳システムを Cloud Translation API で構築 翻訳の精度やセキュリティ、専門用語に対応できる柔軟性で採用を決定<div style="text-align: center;">
<a href="https://lh3.googleusercontent.com/9bj5QOjXEjIIEoNwY0kXKyfcjQw5F6s6qrXeIjsuDAKlivKnE2cz4xTcWDiBhAn9nOeO2TyUFSxln9ORnW0fLi9FLNPX63HojROWFK53UJHRmK3LOj_bcKL1zA6Q8dn78M0uTXPV" imageanchor="1" target="_blank"><img border="0" height="416" src="https://lh3.googleusercontent.com/9bj5QOjXEjIIEoNwY0kXKyfcjQw5F6s6qrXeIjsuDAKlivKnE2cz4xTcWDiBhAn9nOeO2TyUFSxln9ORnW0fLi9FLNPX63HojROWFK53UJHRmK3LOj_bcKL1zA6Q8dn78M0uTXPV" width="624" /></a></div>
<br />
世界中の顧客に、「夢」や「感動」に溢れるサービスで、安全かつ高品質な空の旅を提供する全日本空輸株式会社(以下、ANA)。同社 CS推進部では、より一層の顧客満足度の向上を目的に、「ご意見・ご要望デスク」を運営しています。今回、グローバル対応の一環として開発したブラウザ翻訳システムのプラットフォームに GCP を採用。開発の中心となった ANA のキーマン 3 名と、開発をサポートしたトップゲートのエンジニア 1 名に話を伺いました。<br />
<h2 dir="ltr">
利用している Google Cloud Platform サービス</h2>
<blockquote class="tr_bq">
<a href="https://cloud.google.com/appengine/?hl=ja" target="_blank">Google App Engine</a>、<a href="https://cloud.google.com/datastore/?hl=ja" target="_blank">Cloud Datastore</a>、<a href="https://cloud.google.com/storage/?hl=ja" target="_blank">Google Cloud Storage</a>、<br />
<a href="https://cloud.google.com/translate/?hl=ja" target="_blank">Cloud Translation API</a>、<a href="https://cloud.google.com/natural-language/?hl=ja&utm_source=google&utm_medium=cpc&utm_campaign=japac-JP-all-ja-dr-bkws-all-all-trial-e-dr-1003987&utm_content=text-ad-none-none-DEV_c-CRE_285865410463-ADGP_Hybrid+%7C+AW+SEM+%7C+BKWS+~+T1+%7C+EXA+%7C+ML+%7C+M:1+%7C+JP+%7C+ja+%7C+Language+%7C+API+%7C+en-KWID_43700035494671792-kwd-314634322076&userloc_1028853&utm_term=KW_cloud%20natural%20language%20api&gclid=COH87tb0jeECFYFLvAodTEIOGw" target="_blank">Cloud Natural Language API</a></blockquote>
<br />
<h2>
写真右から</h2>
<ul>
<li>全日本空輸株式会社 CEマネジメント室 CS推進部 業務チーム 姫井 淳子氏</li>
<li>全日本空輸株式会社 CEマネジメント室 CE戦略部 顧客データ分析チーム 博士(情報学) マネジャー 長尾 若氏</li>
<li>全日本空輸株式会社 CEマネジメント室 CS推進部 CS教育推進チーム 魚住 晃之氏</li>
<li>株式会社トップゲート システムソリューション事業部 マネージャー 山本 昭弘氏</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqg67bf5Jp88NvxtAHDnvlrzxMEAISOWK-fC9RiafCAezkhHeXi11wRFPMJ0emZFYORuxpTZbl5xoiIaCzDnCaLUnbLnSRUUL6DvVETlGv_x_wGnZVYqbQ8GT9wfTrBaluM0P7mkEvDECK/s1600/Blog_logo_ANA.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="300" data-original-width="1500" height="128" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqg67bf5Jp88NvxtAHDnvlrzxMEAISOWK-fC9RiafCAezkhHeXi11wRFPMJ0emZFYORuxpTZbl5xoiIaCzDnCaLUnbLnSRUUL6DvVETlGv_x_wGnZVYqbQ8GT9wfTrBaluM0P7mkEvDECK/s640/Blog_logo_ANA.jpg" width="640" /></a></div>
<div style="text-align: center;">
<br /></div>
<br />
<h2>
<a href="https://www.ana.co.jp/group" target="_blank">全日本空輸株式会社</a></h2>
<blockquote class="tr_bq">
1952 年に、安全運航を第一に航空輸送事業を開始。2016 年には、国際線就航 30 周年を迎えています。現在、定期航空運送事業、不定期航空運送事業、航空機使用事業、その他附帯事業を展開。「安心と信頼を基礎に、世界をつなぐ心の翼で夢にあふれる未来に貢献します」という企業理念に基づいて、お客様満足と価値創造で世界のリーディング エアライングループを目指す取り組みを推進。航空運送事業を中核とする世界トップクラスのエアライン グループとして成長を遂げ、年間旅客数は 5,000 万人を突破しています。</blockquote>
<div style="text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsr0T90VAQWpvfIbzHXKDzvmWzAcEuhOOFnAWHvSpA2Ql5jawOx2YrvejGrw-GV5cqg1BtiIKlRa7nUI_V5pk8wHZ8nmJqkU_Funa8KaWDKczuB5MSrJycCjKLexy0nSTJ5sTWB28J2L79/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-07-16+7.11.57.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="340" data-original-width="1354" height="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsr0T90VAQWpvfIbzHXKDzvmWzAcEuhOOFnAWHvSpA2Ql5jawOx2YrvejGrw-GV5cqg1BtiIKlRa7nUI_V5pk8wHZ8nmJqkU_Funa8KaWDKczuB5MSrJycCjKLexy0nSTJ5sTWB28J2L79/s400/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2019-07-16+7.11.57.png" width="400" /></a></div>
</div>
<h2>
<a href="https://www.topgate.co.jp/" target="_blank">株式会社トップゲート</a></h2>
(Google Cloud Platform パートナー)<br />
<br />
<br />
<h3 dir="ltr">
GCP の採用で「ご意見・ご要望デスク」の業務効率化を推進</h3>
一貫した高品質なサービスの提供や、グローバル カスタマーのニーズを踏まえたサービス改善を継続的におこなっていることが高く評価されている ANA 。英国 ロンドンを本拠地とする航空業界の格付け会社である SKYTRAX 社の「ワールド・エアライン・スター・レーティング」において、世界最高評価の「5 スター」を獲得しています。<br />
<br />
サービス品質向上の取り組みの一環として ANA では、「ご意見・ご要望デスク」を運営しています。ご意見・ご要望デスクに寄せられるお客様の声は、国内はもちろん、海外からも届きます。たとえば、海外の空港に関する改善要望があった場合、その国の空港に情報共有する必要があります。<br />
<br />
このとき、まずは日本語でレポートを作成しますが、米国の空港の場合、英語でも共有が必要です。長尾さんは、「翻訳ができるスタッフに集中して負荷がかかることや、翻訳会社に依頼する場合、時間とコストがかかるため、情報をタイムリーに現地スタッフに共有できないことが課題でした」と話します。<br />
<br />
こうした背景から、ブラウザ翻訳システム「WACA(Words Advanced Communication Approach)」を構築することを決定。開発プラットフォームとして、Google Cloud Platform(GCP)が採用されています。GCP の採用に至った評価ポイントは、翻訳の精度とセキュリティ、航空業界特有の専門用語にも対応できる柔軟性でした。<br />
<br />
<h3 dir="ltr">
更なる業務改革に向け Cloud Speech-to-Text など GCP の充実したサービスにも期待</h3>
<br />
WACA の開発は、2017 年 4 月より検討を開始し、5 月に GCP の採用を決定。システム開発、運用、改善のサイクルを何度か繰り返し、12 月より本格的な運用を開始しています。システム構成としては、Cloud Datastore と Cloud Storage 上の単語辞書に登録された専門用語に基づいて、Cloud Translation API を介してブラウザ上で翻訳ができる仕組みを、Google App Engine(GAE)上に構築しています。翻訳精度を上げるために、最初に Cloud Natural Language API を通して、登録した辞書を利用し形態素解析をおこない、それから Cloud Translation API を通し翻訳をしています。<br />
<div style="text-align: center;">
<a href="https://lh5.googleusercontent.com/aNSH-N63JLHr6e8VjxKmPkQwjahBDfiuwEnl1GGcxnTjAe358qdBgQ4JRrWM2FJ-LOrFgyb8jOliM0KQYMO83bEsk00RpML97HWJtK7hzkhsaxlDZ1475CoLMLHVH6Xjm4UleaaC" imageanchor="1" target="_blank"><img border="0" height="382.88130577349915" src="https://lh5.googleusercontent.com/aNSH-N63JLHr6e8VjxKmPkQwjahBDfiuwEnl1GGcxnTjAe358qdBgQ4JRrWM2FJ-LOrFgyb8jOliM0KQYMO83bEsk00RpML97HWJtK7hzkhsaxlDZ1475CoLMLHVH6Xjm4UleaaC" width="624" /></a></div>
<br />
また、Chrome の拡張機能を利用することで右クリックにより翻訳ができる操作性を実現しています。魚住さんは、「Chrome 上で翻訳したいテキストを選択し、右クリックをすると翻訳メニューが開くので、現在、登録されている 9 か国語から、翻訳したい言語を選べば翻訳ができます。翻訳が自動化されたので、手作業による翻訳の負荷が削減されました」と話します。<br />
<br />
一般的なウェブサイトの翻訳ツールでは、翻訳したい文書をコピーして、翻訳窓にペーストし、翻訳ボタンをクリックするという 3 ステップが必要でした。WACA では、右クリックのみの 1 ステップで翻訳できるので、作業工数の削減にもつながります。また、WACA は社内システムなので、情報が外部に漏れず、セキュリティを意識することなく利用できます。<br />
<br />
翻訳精度の向上で、1 点だけ課題となったのは、航空会社には略語などの専門用語が多く、それに対応することでした。たとえば、それらの専門用語を翻訳すると不自然な表現になり、文章として成立しません。GCP では、専門用語を登録するための単語辞書の仕組みの実現など、カスタマイズにも柔軟に対応できることが高く評価されています。<br />
<br />
辞書登録について姫井さんは、次のように話します。「辞書登録は、ご意見・ご要望デスクのスタッフから登録したい用語を募り、一括して csv で Cloud Datastore に登録しています。辞書登録をすることで、より精度の高い翻訳が可能になりました。辞書登録をすることで、翻訳精度が格段に上がり問い合わせ対応業務の効率化につながっています。翻訳精度の向上とともに、ご意見・ご要望デスクのスタッフにも、WACA はかなり浸透してきました。」<br />
<br />
今後は、人工知能(AI)や画像認識などの活用による翻訳精度のさらなる向上や、Dialogflow による問い合わせに迅速かつ簡単に対応できるチャットボットの構築など、より一層の業務効率化を実現できる仕組みを検討していく予定です。<br />
<br />
<h3 dir="ltr">
Google Cloud Platform パートナーのサポート</h3>
<br />
今回、WACA の開発をサポートしたトップゲートを選定した理由を長尾さんは、次のように話します。「Google Cloud の担当者に紹介いただいた複数のパートナーへ連絡をしてみたところ、レスポンスが早かったことや、以前、別のシステム開発をサポートしてもらった実績を評価し決めました。」<br />
<br />
WACA の開発で、特にこだわったのは、翻訳の精度とセキュリティです。お客様の声には、個人情報が含まれる場合もあるので、ウェブサイトの翻訳サービスは利用できません。セキュリティを担保しながら、航空業界の特別な用語にも対応した、精度の高い翻訳をいかに実現できるかが最大のポイントでした。<br />
<br />
山本さんは、「苦労したのは、専門用語をいかに高精度で翻訳するかです。Cloud Translation API のドキュメントをひたすら読み、特性を想像しながらトライ&エラーを繰り返しました。セキュリティに関しては、G Suite のアカウントでログインすることで、G Suite の権限設定を生かし、セキュアなブラウザ翻訳システムへのアクセスを可能にしています。G Suite と GCP は相性がいいので、セキュリティを担保できました」と話します。<br />
長尾さんは、「仕様策定の初期の段階から、非常に丁寧にサポートしてもらっています。操作性の検討時にも、A 案、B 案を図解によりわかりやすく説明してもらえました。CS推進部でも、まだまだできることはたくさんあります。今後もトップゲート様には、お客様視点での改善に生かすことができる提案を期待しています」と話しています。<br />
<br />
<br />
全日本空輸株式会社の導入事例 PDF は<a href="https://lp.google-mkto.com/rs/248-TPC-286/images/Google_GCP_ANA.pdf" target="_blank">こちら</a>をご覧ください。<br />
その他の導入事例は<a href="https://cloud.google.com/customers/#/" target="_blank">こちら</a>をご覧ください。Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-18243656299440707092019-05-30T16:00:00.000+09:002019-05-31T08:11:14.475+09:00Kubernetes アプリケーションを GCP Marketplace で提供することの意義<div class="separator" style="clear: both; text-align: center;">
<a href="https://storage.googleapis.com/gweb-cloudblog-publish/images/Kubernetes.max-2200x2200.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="333" data-original-width="800" height="266" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/Kubernetes.max-2200x2200.png" width="640" /></a></div>
※この投稿は米国時間 2019 年 5 月 16 日に Google Cloud blog に<a href="https://cloud.google.com/blog/products/containers-kubernetes/launching-kubernetes-apps-on-gcp-marketplace-for-gke-anthos-and-beyond" target="_blank">投稿</a>されたものの抄訳です。<br />
<br />
コンテナを介したアプリケーションのモダナイゼーションは、デジタル トランスフォーメーションで特に注目を集めているポイントの 1 つです。Forrester Research が最近実施した調査(Google が委託)<sup>1</sup> によると、企業におけるアプリケーション開発リーダーの 75 % は、カスタム アプリケーション構築の生産性とリリース サイクルを上げるために、利用しているアプリケーションのコンテナ化を進めています。<br />
<br />
商用ソフトウェアとオープンソースのどちらを使用する場合でも、企業アプリケーションのモダナイゼーションを促進するための優れた方法は、<a href="https://cloud.google.com/kubernetes-applications/?hl=ja" target="_blank">Kubernetes アプリケーション</a>(どの Kubernetes 環境でも実行できてデプロイしやすい、エンタープライズ対応のコンテナ化アプリケーション)を使用することです。私たちは Google Cloud Next '19 において、そうした Kubernetes アプリケーションを GCP Marketplace で一般提供することを発表しました。この投稿では、その詳細についてご紹介します。<br />
<br />
<h3>
Kubernetes アプリケーション : お客様の声に応えた設計</h3>
コンテナと Kubernetes を用いたアプリケーション開発は、混乱を招くことがあります。実際、私たちのもとには、「Kubernetes アプリケーションは、もっと簡単に使用できて生産性も向上するようなものにならないのか」という問い合わせが数多く寄せられています。そこで私たちは、あらゆる開発者のエクスペリエンスをもっと高めるべく、アプリケーションとそのコンポーネントの表示や管理を容易にする「アプリケーション リソース」を GKE に導入しました。このメカニズムは、Helm Charts などの一般的なパッケージング形式をサポートし、デプロイが容易で、かつ今日の GCP Marketplace で配布可能なエンタープライズ対応の製品を開発できるようにします。<br />
<br />
Kubernetes アプリケーションは単なるコンテナ イメージではありません。アプリケーション リソースの標準化により、Kubernetes アプリケーションは、個々のコアやワークロード リソースとしてだけでなく、1 つのまとまったユニットとして扱えるようになりました。さらには、このデプロイ テンプレートを認識するデプロイ ツールもサポートしています。現在では、Kubernetes をベースとするアプリケーションのデバッグ、モニタリング、デプロイにおける複雑さはかなり緩和されています。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://storage.googleapis.com/gweb-cloudblog-publish/images/Kubernetes_application.max-900x900.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="188" data-original-width="800" height="150" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/Kubernetes_application.max-900x900.png" width="640" /></a></div>
<h3>
アプリケーション環境のモダナイゼーション</h3>
アプリケーション開発が 1 つの環境だけに限定されることはありません。Kubernetes アプリケーションも開発チームと同じくらい動的に構築されています。さほど複雑ではないプロジェクトの場合は GKE Standard を、大企業レベルのコンテナ オーケストレーションや金融データ対応の SLA が必要なプロジェクトの場合は <a href="https://cloudplatform-jp.googleblog.com/2019/04/introducing-gke-advanced-enhanced-reliability-simplicity-and-scale-for-enterprise-workloads.html" target="_blank">GKE Advanced</a> を選ぶことができます。<br />
<br />
大企業ではクラウドへの移行前にオンプレミスでアプリケーションをコンテナ化することが一般的になっており、<a href="http://cloud.google.com/anthos?hl=ja" target="_blank">Anthos</a> 上で実行される Kubernetes アプリケーションは、このシナリオをサポートします。Anthos により、環境の違いを越えて動作する新しいハイブリッド アプリケーションの構築や管理が可能になりました。GCP Marketplace には、Anthos をサポートする Kubernetes アプリケーションの第一陣が登場し、その数は増えつつあります。<br />
<br />
クラウドネイティブなアプリケーションを Anthos ベースの Kubernetes アプリケーションで構築する方法については、Next'19 での<a href="https://www.youtube.com/watch?v=8ieMU_evObc&" target="_blank">私たちのプレゼンテーション</a>をご覧ください。また、Istio と Stackdriver をサポートする、完全な Anthos エクスペリエンスの Kubernetes アプリケーションも増えてきています。<br />
<br />
<h3>
オープンソースと商用ソフトウェアの強力なエコシステム</h3>
企業アプリケーションの開発には堅牢なエコシステムが必要不可欠です。Kubernetes アプリケーションの種類は、セキュリティ、データベース、開発ツール、モニタリング システムなど多岐にわたります。また、PostgreSQL、RabbitMQ、Airflow といった人気の高いオープンソース ソフトウェアの Google パッケージ版もあります。さらに、私たちはパブリック クラウドとしては初めて、Aerospike、Aqua Security、Galactic Fog、Kasten、ManagedKube、Portworx、Robin.io の商用 Kubernetes アプリケーションを提供します。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://storage.googleapis.com/gweb-cloudblog-publish/images/kubernetes_ecosystem1.0480027009600540.max-900x900.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="432" data-original-width="800" height="344" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/kubernetes_ecosystem1.0480027009600540.max-900x900.png" width="640" /></a></div>
<blockquote class="tr_bq">
「クラウドネイティブな最新アプリケーションのデリバリを、使いやすい CI/CD ソリューションによって自動化したいお客様との間に接点ができることは、私たちにとってうれしいことです。Jenkins ベースの CI/CD Kubernetes アプリケーションである CloudBees Core を使用すれば、GCP Marketplace からオンプレミスにもクラウドにもデプロイできます。」<br />
―― <strong>Rob Davies 氏、CloudBees の技術担当 VP</strong></blockquote>
<br />
<h3>
セキュリティ強化の手段、企業が購入しやすい場としての GCP Marketplace</h3>
Kubernetes アプリケーションの購入を希望する企業を支援するため、私たちは、パートナーとお客様との間の特別な料金設定や、年間サブスクリプション(現時点ではベータ)、GCP Marketplace のソリューションと GCP サービスの一括請求(GCP Marketplace で販売している他のプロダクトと同様のもの)をサポートします。<br />
<br />
前述した Forrester の調査によると、アプリケーション開発リーダーの 62 % は、コンテナ化アプリケーションをベンダーから直接入手するよりもマーケットプレイスから購入するほうを選ぶ、と回答しています。クラウド ソフトウェア開発ツールのサポートのためにマーケットプレイスを利用するメリットについては、彼らの 45 % がセキュリティの強化を挙げています。<br />
<br />
GCP Marketplace で提供されているソリューションは、Kubernetes アプリケーションを含めて、すべて提供前に私たちがセキュリティ上の脆弱性をチェックしています。また、回答者の 75 % が購入前の試験運用を望んでいることから、Kubernetes アプリケーションについても、私たちは仮想マシンや SaaS プロダクトと同様に無料で試用できるようにします。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://services.google.com/fh/files/misc/google_gcp_marketplace_infographic.pdf?utm_source=k8sappsga&utm_medium=infographic&utm_campaign=popout" target="_blank"><img border="0" data-original-height="800" data-original-width="617" height="640" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/Forrester_report.0409052808151056.max-900x900.png" width="492" /></a></div>
<h3>
今すぐ始めましょう</h3>
スタート地点がオンプレミスであれ、クラウドであれ、アプリケーションのモダナイゼーションを支援できることを、私たちはうれしく思います。Kubernetes アプリケーションは、オープンソースおよび商用製品をコンテナ環境に組み込むためのシンプルで統一された方法を提供します。<a href="https://console.cloud.google.com/marketplace/browse?filter=solution-type%3Ak8s&utm_source=k8sappsga&utm_medium=sitelink&utm_campaign=k8sapps&_ga=2.135252721.-1784288694.1541379221" target="_blank">今すぐ使ってみてください</a>。また、お気に入りのパートナー企業にも、GCP Marketplace で Kubernetes アプリケーションを提供するよう勧めてください。<br />
<br />
加えて、私たちは GCP Marketplace を GKE Connect(現時点ではアルファ)と統合し、オンプレミスや他社クラウドで実行されている GKE 以外の Kubernetes クラスタと GCP プロジェクトとを接続できるようにしました。これにより、接続されたすべてのクラスタで Kubernetes ワークロードを表示したり、ログインして操作したりすることができます。GCP パートナーがアプリケーションを一度ビルドすれば、お客様はそれをオンプレミスであれクラウドであれ、好きな環境で実行できます。GKE Connect のアルファ プログラムに参加を希望される方は、<a href="https://forms.gle/GGoRa8ob1R2yNS1n9" target="_blank">こちら</a>からサインアップをお願いします。<br />
<br />
<h3>
私たちとともに</h3>
コンテナ化アプリケーション開発と Anthos を支えるパートナーのエコシステムにぜひご参加ください。Kubernetes アプリケーションは、あなたのソリューションを GCP Marketplace で販売するというユニークな機会を提供し、オンプレミスや GCP、その他のクラウドにおいて顧客がデプロイすることを可能にします。詳細は<a href="https://cloud.google.com/marketplace/sell/?hl=ja" target="_blank">こちらのページ</a>をご覧ください。<br />
<br />
<div style="line-height: 1.0;">
<span style="font-size: small;">1 方法 : Forrester は、この調査のために 7 か国 466 社にオンライン調査票を送り、ソフトウェア開発で必要なアプリケーション、ツール、サービスをクラウド マーケットプレイスから調達することについて、そのニーズなどを評価しました。</span><br />
<span style="font-size: small;">出典 : A commissioned study conducted by Forrester Research on behalf of Google, November 2018.</span><br />
<span style="font-size: small;">調査対象者 : グローバル企業の IT および開発部門で開発やデリバリの責任者を務める 466 人</span><br />
<br /></div>
<i>- By Kavitha Radhakrishnan, Senior Product Manager</i>Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-45644988521681698162019-05-24T09:00:00.000+09:002019-05-24T09:00:07.547+09:00Google Cloud INSIDE FinTech を初開催:2019 年 6 月 10 日(月)<div style="text-align: center;">
<span id="docs-internal-guid-f7dd60c2-7fff-a877-cb25-eab260ace635"><span style="font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 239px; overflow: hidden; width: 624px;"><img height="239" src="https://lh4.googleusercontent.com/fPmQZgqaBKrAs95HDQnsaAOPauCRqy2yyZqo3WdNQLcAZIks0uYgUayssys1iNQokZ8XU07mSzc9ShAe43iN_a4xbXocXm1bSoS-nTGeBhrnff91kOibKO3ldx0L2JhYzcJSur7b" style="margin-left: 0px; margin-top: 0px;" width="624" /></span></span></span></div>
Google Cloud では、2019 年 6 月 10 日(月)に <a href="https://goo.gle/2QiJ5Zf" target="_blank">Google Cloud INSIDE FinTech</a> を初開催いたします。<br />
<br />
初開催のテーマは『 FinTech 業界の勢いを支える最新技術』。あらゆる業界でのデジタルトランスフォーメーションが進むなか、とりわけ先進技術の導入が進む FinTech 業界。FinTech 業界をリードする方々をスピーカーに迎え、金融業界を取り巻く環境の変化や企業トレンドの解説、そして新しい技術のナレッジシェア、さらに様々な導入事例紹介を行います。<br />
<br />
セミナー終了後は、軽食付きの懇親会を予定しています。ぜひこの機会に、Google Cloud のエキスパートや、参加者、登壇者との交流を深めてください。この Google Cloud INSIDE FinTech でのナレッジシェア をきっかけに、新しいサービスやプロダクトが生まれるような会にしていきます。ぜひ " Google Cloud INSIDE FinTech " にご参加ください。 <br />
<br />
<h3 dir="ltr">
参加登録</h3>
<blockquote class="tr_bq">
<a href="https://goo.gle/2QiJ5Zf" target="_blank">https://goo.gle/2QiJ5Zf</a><br />
<br />
※ 申し込み締切:5 月 31 日(金)</blockquote>
<h3 dir="ltr">
プログラム</h3>
<ul>
<li>14:30 開場</li>
<li>15:00 – 15:05 オープニング</li>
<li>15:05 – 15:35 「Google Cloud と機械学習が切り拓く、IT 開発の新しい潮流」<br />
グーグル合同会社 デベロッパー アドボケイト 佐藤 一憲</li>
<li>15:35 – 16:05 「リスクを抑えながらアジリティを上げる!<br />
Google Cloud で実現するシステム運用」<br />
Google Cloud カスタマーエンジニア セブラン フェラン</li>
<li>16:05 – 16:25 休憩</li>
<li>16:25 – 16:55 「金融庁から見た FinTech Landscape<br />
- AI 、ブロックチェーン、API の観点から」<br />
金融庁 フィンテック室長 三輪 純平 氏</li>
<li>16:55 – 17:25 事例紹介<br />
株式会社 Ginco 高妻 智一 氏</li>
<li>17:25 – 17:55 「マネーフォワードにおける CDN ログ基盤」<br />
株式会社マネーフォワード CTO 室 エンジニア 鈴木 陽介 氏</li>
<li>17:55 – 18:25 「マネックス証券 API : 金融のオープン API を支える Apigee」<br />
マネックス証券株式会社 法貴 大輔 氏</li>
<li>18:25 – 19:25 懇親会(軽食付)</li>
</ul>
<h3 dir="ltr">
開催概要</h3>
<ul>
<li>イベント名 Google Cloud INSIDE FinTech</li>
<li>日 程 2019 年 6 月 10 日(月)</li>
<li>時 間 15:00 - 19:25 / 受付開始 14:30</li>
<li>会 場 JPタワー ホール&カンファレンス<br />
〒100-7004 東京都千代田区丸の内二丁目 7 番 2 号 KITTE 4, 5 階
</li>
<li>対 象 FinTech 業界や金融・保険・証券業界で働くインフラエンジニア、 サーバーアプリケーションエンジニア、テクニカルリーダー</li>
<li>定 員 300 名</li>
<li>参加費 無料(事前登録制)</li>
<li>登 録 <a href="https://goo.gle/2QiJ5Zf">https://goo.gle/2QiJ5Zf</a></li>
</ul>
<br />
<div style="line-height: 1.0;">
<span style="font-size: small;">※ 企業のお客様が対象となりますので、学生の方のご参加はご遠慮いただいております。予めご了承くださいませ。 </span><br />
<span style="font-size: small;">※ 競合他社様、パートナー企業様からのお申し込みはお断りさせていただくことがございます。 </span><br />
<span style="font-size: small;">※ 報道関係者のご参加はお断りさせていただきます。 </span><br />
<span style="font-size: small;">※ 定員は 300 名です。早期に定員に達した場合、お申し込みを締め切らせていただく場合がございます。 </span>
</div>
Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-92089266929398940442019-05-23T21:33:00.000+09:002019-06-06T21:39:20.166+09:00Cloud OnAir 番組レポート : GCP で始めるデータドリブン マーケティング<a href="https://goo.gl/kWM1J3" target="_blank">Cloud OnAir</a> は、Google Cloud の製品をわかりやすく解説し、最新の情報などをいち早く皆様にお伝えする Online 番組です。<br />
<br />
5 月 16 日の放送では、データに基づくマーケティングの実践方法を解説しました。データに基づいた意思決定を行うには、必要なデータを活用できる状態にしておく必要があります。そもそもマーケティングとはなにか? 広告とは何が違うのかを整理しながら、データを活用するために行うべきことを詳しく説明します。<br />
<br />
マーケティングとは製品やサービスが売れる仕組みをつくることです。この仕組みを作る上で、カスタマージャーニーを見極めて適切なメッセージを適切なタイミングで適切なユーザーに届けることが重要です。広告はこのマーケティングの一つの手段ですが、オンライン、オフラインにかかわらず広告の効果を分析し、最適な方法を探ることが課題となっています。<br />
<br />
<h3>
データドリブン マーケティング 基盤を作る</h3>
企業内に存在するさまざまなデータを統合、管理、利用するための基盤の存在はデータドリブン マーケティングには欠かせません。社内システムとのシームレスなデータ連携、増え続けるログを格納できる十分なストレージ、分析を高速に実施するためのコンピューティングリソース、通常の集計やレポーティングだけでなく、機械学習機能も含めたデータ分析、こうした要求に対応できる基盤が今求められています。<br />
<br />
<br />
<strong>マーケティング関連のサービス</strong><br />
4 月に開催された Cloud Next ‘19 サンフランシスコでは、データドリブン マーケティングに関連する新しいサービスや機能が数多く発表されました。<br />
<br />
<ul>
<li><a href="https://cloud.google.com/blog/products/data-analytics/google-cloud-smart-analytics-accelerates-your-business-transformation" target="_blank">BigQuery Connected Sheets</a> - G Suite のスプレッドシートから数十億件のデータを扱うことが可能です。何回かクリックするだけで、データをスプレッドシート上のダッシュボードとして可視化し、セキュアに組織内で共有が可能です。</li>
<li><a href="https://cloud.google.com/blog/products/data-analytics/google-cloud-smart-analytics-accelerates-your-business-transformation" target="_blank">BigQuery ML</a> - k-means クラスタリング、強調フィルタリングなど顧客のセグメンテーションやプロダクトレコメンデーションを行うための複数の新しいモデルの生成をサポートします。</li>
<li><a href="https://cloud.google.com/automl-tables" target="_blank">AutoML Tables</a> - 最先端の機械学習モデルを自動的にビルドして、構造化データに対してデプロイできます。Google Brain が提供する最先端モデルも含むさまざまな機械学習モデルを利用可能です。実際の適用例を番組内で紹介しています。</li>
</ul>
<br />
<br />
<div style="text-align: center;">
<iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/sfPd5TLnb5g" width="560"></iframe><br />
<a href="https://cloudonair.withgoogle.com/events/cloud-onair-japan-q2-2019/watch?talk=tky_hpc_q2&reg=" target="_blank">2019 年 5 月 16 日放送 GCP で始めるデータドリブン マーケティング</a></div>
<div style="text-align: center;">
<br />
<br /></div>
番組で説明した資料は<a href="https://www.slideshare.net/GoogleCloudPlatformJP/cloud-onair-gcp-2019516" target="_blank"><b>こちら</b></a>で公開しています。<br />
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/GtwOh1tvTg3mm" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe> </div>
<div style="margin-bottom: 5px;">
<div style="text-align: center;">
<strong> <a href="https://www.slideshare.net/GoogleCloudPlatformJP/cloud-onair-gcp-2019516" target="_blank" title="[Cloud OnAir] GCP で始めるデータドリブン マーケティング 2019年5月16日 放送">[Cloud OnAir] GCP で始めるデータドリブン マーケティング 2019年5月16日 放送</a> </strong> from <strong><a href="https://www.slideshare.net/GoogleCloudPlatformJP" target="_blank">Google Cloud Platform - Japan</a></strong> </div>
</div>
<br />
<a href="https://goo.gl/kWM1J3" target="_blank">Cloud OnAir</a> では、各回 Google Cloud のエンジニアがトピックを設け、Google Cloud の最新情報を解説しています。過去の番組、説明資料、さらには視聴者からの質問と回答は<a href="https://goo.gl/kWM1J3" target="_blank">こちら</a>よりご覧いただけます。 最新の情報を得るためにもまずはご登録をお願いします。Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-28799835569971298562019-05-22T09:00:00.000+09:002019-05-22T09:00:02.507+09:00Compute Engine への VM 移行時に役立つヒント&ベスト プラクティス<div class="separator" style="clear: both; text-align: center;">
<a href="https://storage.googleapis.com/gweb-cloudblog-publish/images/WorkplaceTransformation-01_2FYra9X.max-1000x1000.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="444" data-original-width="800" height="354" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/WorkplaceTransformation-01_2FYra9X.max-1000x1000.png" width="640" /></a></div>
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">※この投稿は米国時間 2019 年 5 月 9 日に Google Cloud blog に<a href="https://cloud.google.com/blog/products/cloud-migration/tips-and-best-practices-for-moving-your-vms-to-compute-engine" target="_blank">投稿</a>されたものの抄訳です。</span><br />
<br />
クラウドへの移行で重要なのは、移行は一度限りの大規模な変更ではないということを肝に銘じておくことです。クラウドへの移行は、細かいステップをいくつも重ねて進む長い道のりにほかなりません。<a href="https://cloud.google.com/?hl=ja" target="_blank">Google Cloud Platform</a>(GCP)では、<a href="https://cloud.google.com/solutions/best-practices-migrating-vm-to-compute-engine?hl=ja" target="_blank">仮想マシン(VM)を GCP に移行する場合のガイダンスとベスト プラクティス</a>をまとめました。このブログ投稿ではその内容を簡単にご紹介します。なお、このガイドと本稿では、VM の Compute Engine への移行に焦点を当てています。それでは、GCP のメリットから見ていくことにしましょう。<br />
<h3 dir="ltr">
Compute Engine に移行する理由</h3>
ご存じのように、移行後の VM でアプリケーションを動かすには、データベース、メッセージング、アナリティクスなどのサービスと共にコンピューティング リソースが必要です。VM の実行環境として考えた場合、<a href="https://cloud.google.com/compute/?hl=ja" target="_blank">Compute Engine</a> 上で実行することの主なメリットは次のとおりです。<br />
<br />
<ul>
<li><strong>コストの削減 :</strong> <a href="https://cloud.google.com/compute/docs/sustained-use-discounts?hl=ja" target="_blank">継続利用割引</a>が適用される Compute Engineは、従来型のデータセンターでハードウェアや VM を管理する場合と比べて大幅に割安です。継続利用割引は、ほかのクラウドから GCP に移行するときにも大きなメリットとなります。</li>
</ul>
<ul>
<li><strong>機敏性 :</strong> リソースの確保やプロビジョニングを待つことなく、ほとんど瞬間的に VM を立ち上げられるようになるので、お客様の多くは移行と同時に機敏性が向上します。新しいアプリケーションをすばやく立ち上げて試用し、必要に応じてオフにすることができます。</li>
</ul>
<ul>
<li><strong>オーバーヘッドの削減 :</strong> データセンターの運営では通常、それぞれ独自の窓口、課金モデル、契約内容を持つさまざまなベンダーとの取引が必要です。クラウドに移行すれば、そのオーバーヘッドが大幅に削減されます。これにより、担当スタッフはデータセンターの運用にまつわる雑用に振り回されることがなくなり、ビジネスの成功に必要な業務に集中できます。</li>
</ul>
<br />
移行先として Compute Engine を選択したら、移行の際にどのようなことに留意すべきでしょうか。その一部を簡単に説明します。<br />
<br />
<h3 dir="ltr">
コストの計算</h3>
移行に取りかかる前に、移行のコストを計算しましょう。これは、現状のデータセンターや既存のクラウド環境で実行しているもののコストを評価することを意味します。GCP の <a href="https://cloud.google.com/vm-migrate/?hl=ja" target="_blank">VM 移行支援センター</a>でコスト管理の方法を学び、ニーズに最もマッチするパートナーを選んでください。<br />
<br />
<h3 dir="ltr">
移行対象 VM の評価</h3>
移行コストの評価後は、移行する VM の検討を開始します。現代の企業はさまざまな種類のアプリケーションを VM で運用しており、それらすべてを同時にクラウドに移行することは通常はありえません。移行をうまく進めるには<a href="https://inthecloud.withgoogle.com/tco-assessment-19/form.html" target="_blank">徹底的な評価</a>が必要ですが、GCP であれば、そうした評価を無料で行うことができます。<br />
<br />
<h3 dir="ltr">
移行の設計</h3>
移行する VM を決めたら、移行を始める前にクラウド環境を設計する必要があります。その最初のステップは、現在の環境と GCP との違いを明らかにすることです。そして次に、GCP 上の新しいクラウド環境をどのような形にすべきかを検討します。以下の各項では、移行に先立って検討すべきことを説明します。<br />
<br />
<h3 dir="ltr">
ガバナンスの確立</h3>
クラウド リソースの作成、アクセス、変更、破棄に関するパーミッションを誰に与えるかを明確にする必要があります。また、リソース コストの支払い方法も決めなければなりません。それには、<a href="https://cloud.google.com/iam/docs/concepts?hl=ja#header_2" target="_blank">IAM のベスト プラクティスに関するドキュメント</a>が参考になります。<br />
<br />
<h3 dir="ltr">
ネットワークの作成</h3>
移行後に使用するネットワークは、VM の移行前に存在していなければなりません。アプリケーションの稼働後にネットワークを設定するのは難しいため、パーミッションやアカウントと同様に、事前に作成しておくことが重要です。<br />
<br />
<h3 dir="ltr">
運用計画の策定</h3>
クラウドで VM を稼働するようになれば、システムの常として、VM のモニタリングやロギング、運用上の管理が必要になります。移行後に慌てることがないよう、運用管理については事前の計画段階で考慮に入れておくべきです。<br />
<br />
<h3 dir="ltr">
クラウドへの VM の移行</h3>
こうした準備を整えてから最初の VM の移行に取りかかります。最初の移行は、将来の移行のテンプレートになります。移行を重ねるうちにプロセスは改善されていくはずですが、最初の移行では特にあらゆることを記録することが重要です。<br />
<br />
Google Cloud の移行ツールである Velostrata を使用すれば、VM の GCP への移行を迅速かつ安全に、そして大規模に行うことができます。Velostrata は、ストリーミング技術を使用して移行にかかる時間を短縮すると共に、適切なインスタンス タイプを選びやすくするために推奨サイズを提示してくれます。また、組み込みテスト機能とロールバック(必要な場合)も提供します。GCP に移行するお客様は Velostrata を無料で利用できます。<br />
<br />
以上、VM をクラウドに移行する前に検討すべき項目を駆け足で見てきました。もっと詳しく知りたい方は<a href="https://cloud.google.com/solutions/best-practices-migrating-vm-to-compute-engine?hl=ja" target="_blank">こちらのドキュメント</a>をご覧ください。<br />
<br />
<i>- By Ron Pantofaro, Cloud Solutions Architect, Google Cloud Platform and Tom Nikl, Product Marketing Manager</i>Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-59947693575441478872019-05-20T09:30:00.000+09:002019-05-20T10:36:21.505+09:00Google Cloud で実践する Web アプリ開発 開催のお知らせ<div style="text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<img border="0" data-original-height="460" data-original-width="1200" height="244" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyJFk7BQLqjKBnQGs9B2eIERVl35n_WgVpTTteo8rTwQI_ByFp14pDxKGENojMHI-0TYwtnAfmFi5Roo2F4aIh6HwWQtXTXI-C3QUbB9BZTvG3YVpEJZHdTNz2sleJ9sD4_0wau9LbjbkI/s640/banner1200_460.jpg" width="640" /></div>
<br /></div>
Google Cloud は、開発エンジニア、インフラエンジニア向けに「<a href="https://goo.gle/2HfzwGs" target="_blank">Google Cloud で実践する Web アプリ開発</a>」を開催いたします。実際にアプリやサービスのフロントエンド開発に携わる先進的な企業を迎え、アプローチの方法やポイント、バックエンドとの連携などについてお話しいただきます。また、深い専門知識をもつ Google Cloud のエンジニアが、Firebase、Cloud Functions、Google App Engine、Google Kubernetes Engine をはじめとした Google Cloud Platform を利用し、どのように Web アプリ開発、運用を行うのかについて解説します。<br />
<h3>
開催概要</h3>
<ul>
<li>名 称:Google Cloud で実践する Web アプリ開発</li>
<li>日 時: 2019 年 6 月 3 日 (月) 18 : 00 - 21 : 30 </li>
<li>会 場:グーグル・クラウド・ジャパン合同会社<br />〒106‐6108 東京都港区六本木6-11-10 六本木ヒルズ森タワー</li>
<li>スピーカー</li>
<ul>
<li>株式会社リクルートテクノロジーズ 新井 智士 氏</li>
<li>株式会社Ginco 西川 達哉 氏</li>
<li>グーグル合同会社 宇都宮 佑亮</li>
<li>グーグル・クラウド・ジャパン合同会社 篠原 一徳</li>
</ul>
<li>プログラム</li>
<ul>
<li>17:30 受付開始</li>
<li>18:00 ~ 18:05 オープニング</li>
<li>18:05 ~ 18:35 Web フロントエンド開発最新動向<br />グーグル合同会社 宇都宮 佑亮</li>
</ul>
</ul>
<ul><ul>
<li>18:35 ~ 19:05 GCP のサーバーレスサービス紹介<br />グーグル・クラウド・ジャパン合同会社 篠原 一徳 </li>
</ul>
</ul>
<ul><ul>
<li>19:05 ~ 19:20 休憩 </li>
<li>19:20 ~ 19:50 リクルートにおけるWebパフォーマンス改善の取り組み<br />株式会社リクルートテクノロジーズ 新井 智士 氏</li>
</ul>
</ul>
<ul><ul>
<li>19:50 ~ 20:20 インフラ管理不要の Firebase と GKE で実現するモバイルアプリ開発<br />株式会社Ginco 西川 達哉 氏</li>
</ul>
</ul>
<ul><ul>
<li>20:20 ~ 20:30 クロージング</li>
<li>20:30 ~ 21:30 懇親会</li>
</ul>
<li>参加費:無料 (事前登録制)</li>
<li>主 催:グーグル・クラウド・ジャパン合同会社</li>
<li>定員:200 名</li>
</ul>
<h3>
参加申し込み</h3>
<blockquote>
<a href="https://goo.gle/2HfzwGs" target="_blank">https://goo.gle/2HfzwGs</a><br />
上記リンクからお申し込みください。</blockquote>
<div style="line-height: 1.0;">
<span style="font-size: small;">※ 競合他社様、パートナー企業様からのお申し込みはお断りさせていただくことがございます。</span><br />
<span style="font-size: small;">※ 報道関係者のご参加はお断りさせていただきます。 </span><br />
<span style="font-size: small;">※ ビジネス向けのイベントとなっております。学生の方のご参加はご遠慮ください。</span><br />
<span style="font-size: small;">※ お申し込み多数の場合は抽選を行います。参加いただける方には、後日、ご登録されたメールアドレスに参加のご案内をお送りします。</span>
</div>
Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-29233090413753202472019-05-16T09:30:00.000+09:002019-05-16T09:38:59.327+09:003 つのユース ケースで学ぶ GCP のサービス アカウント<span style="font-size: small;">※この投稿は米国時間 2019 年 4 月 10 日に Google Cloud blog に<a href="https://cloud.google.com/blog/products/identity-security/understanding-gcp-service-accounts-three-common-use-cases" target="_blank">投稿</a>されたものの抄訳です。</span><br />
<br />
<a href="https://cloud.google.com/?hl=ja" target="_blank">Google Cloud Platform</a>(GCP)上でアプリケーションを構築している方であれば、<a href="https://cloud.google.com/iam/docs/service-accounts?hl=ja" target="_blank">サービス アカウント</a>のことはよくご存じでしょう。これはアプリケーションか仮想マシン(VM)に属する特殊な Google アカウントで、ID として、もしくはリソースとして扱うことができます。サービス アカウントでは、管理方法やリソースへのアクセス権限の付与方法がユース ケースによって異なります。この投稿ではサービス アカウントの一般的なユース ケースをいくつか取り上げますので、サービス アカウント管理の適切な運用モデルを決定するうえで参考にしていただきたいと思います。<br />
<br />
<h3 dir="ltr">
ユース ケース 1 : GCP リソースにアクセスするウェブ アプリケーション</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://storage.googleapis.com/gweb-cloudblog-publish/images/Web_application_accessing_GCP_resources.max-1100x1100.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="443" data-original-width="800" height="354" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/Web_application_accessing_GCP_resources.max-1100x1100.png" width="640" /></a></div>
<br />
ユーザーが <a href="https://cloud.google.com/iap/docs/concepts-overview?hl=ja" target="_blank">Cloud Identity-Aware Proxy(IAP)</a>から認証を受けてウェブ アプリケーションにアクセスしているとします。GCP リソースを利用するウェブ アプリケーションにアクセスできるユーザーの場合は、GCP リソースに対する直接的なアクセス権限を持つ必要はありません。こうしたウェブ アプリケーションは、Cloud Datastore といった GCP サービスへのアクセス権限を、サービス アカウントを使って獲得します。この場合、サービス アカウントはウェブ アプリケーションと一対一で対応します。つまり、サービス アカウントはウェブ アプリケーションの ID なのです。最初に、ウェブ アプリケーションをホスティングする GCP プロジェクトでサービス アカウントを作成します。次に、GCP リソースへのアクセスに必要な権限を、そのサービス アカウントに付与します。そして最後に、<a href="https://cloud.google.com/docs/authentication/production?hl=ja#obtaining_credentials_on_compute_engine_kubernetes_engine_app_engine_flexible_environment_and_cloud_functions" target="_blank">サービス アカウントの認証情報</a>を使用するようにウェブ アプリケーションを設定します。<br />
<br />
<h3 dir="ltr">
ユース ケース 2 : 複数のコスト センターに対する BigQuery 使用料の請求</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://storage.googleapis.com/gweb-cloudblog-publish/images/Cross-charging_BigQuery_usage_to_different_c.max-700x700.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="654" data-original-width="700" height="372" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/Cross-charging_BigQuery_usage_to_different_c.max-700x700.png" width="400" /></a></div>
<br />
このシナリオでは、部門のユーザーはカスタムビルドのアプリケーションを使用して、BigQuery の共有データセットにクエリを送ります。このとき、クエリによって発生する料金は、ユーザーが所属するコスト センターに請求する必要があるため、VM 上で実行されるアプリケーションに対しては、BigQuery データセットへのクエリ発行権限を有するサービス アカウントが与えられます。<br />
<br />
プロジェクトで使用されるリソースが請求書に反映されるようにするため、各部門の一連のプロジェクトにはラベルを付与します。また各部門は、部門に割り当てられたプロジェクトからアプリケーションを実行する必要があります。これにより、<a href="https://cloud.google.com/bigquery/pricing?hl=ja#how_charges_are_billed" target="_blank">BigQuery に対するクエリ料金が、その部門に適切に請求される</a>ようになります。<br />
<br />
クエリを発行する各部門のプロジェクトにこのシナリオを適用するには、BigQuery データセットへのクエリ発行に必要な <a href="https://cloud.google.com/bigquery/docs/access-control?hl=ja#predefined_roles_details" target="_blank">IAM 権限</a>を、アプリケーションのサービス アカウントに割り当てます。<br />
<br />
このシナリオによる権限設定の詳細は<a href="https://cloud.google.com/bigquery/docs/access-control?authuser=0#read_access_to_data_in_a_different_project" target="_blank">こちら</a>をご覧ください。<br />
<br />
<h3 dir="ltr">
ユース ケース 3 : 運用、管理作業で使われるサービス アカウントの管理</h3>
GCP 環境の管理を担当するシステム管理者やオペレーターであれば、環境のプロビジョニングや監査などの共通操作を GCP 環境全体にわたって一元管理したいと考えるでしょう。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://storage.googleapis.com/gweb-cloudblog-publish/images/Managing_service_accounts_used_for_operati.max-1300x1300.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="324" data-original-width="800" height="258" src="https://storage.googleapis.com/gweb-cloudblog-publish/images/Managing_service_accounts_used_for_operati.max-1300x1300.png" width="640" /></a></div>
<br />
この場合、さまざまなタスクを実行できるようにするため、適切な権限を持つサービス アカウントを複数作る必要があります。これらのサービス アカウントは、上位の特権を持ち、階層内の適切なレベルで権限を付与されているはずです。そして、他のサービス アカウントと同様に、権限のないユーザーに情報が漏れることのないよう、<a href="https://cloudplatform-jp.googleblog.com/2017/08/help-keep-your-Google-Cloud-service-account-keys-safe.html" target="_blank">ベスト プラクティス</a>に従う必要があります。たとえば、こういった運用のためにサービス アカウントを作成したプロジェクトでは、サービス アカウントが誤って削除されないようにするため、<a href="https://cloud.google.com/resource-manager/docs/project-liens?hl=ja" target="_blank">プロジェクト リーエン</a>を追加すべきです。<br />
<br />
<h3 dir="ltr">
サービス アカウントの奥の深さ</h3>
上記のユース ケースからおわかりいただけるように、1 つのモデルではすべてのケースに対応しきれないので、ユース ケースに応じて運用モデルを選ぶ必要があります。今回は 3 つのユース ケースを紹介しましたが、サービス アカウントを論理的にどこに配置すべきかを検討するうえで参考になれば幸いです。サービス アカウントの詳細については、次のチュートリアルのどれかをお試しいただき、選択した GCP コンピューティング サービスのもとでサービス アカウントの認証情報をどのように使用するべきかを学んでください。<br />
<ul>
<li><a href="https://cloud.google.com/kubernetes-engine/docs/tutorials/authenticating-to-cloud-platform?hl=ja" target="_blank">サービス アカウントを使用した Cloud Platform への認証</a></li>
<li><a href="https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances?authuser=0#authenticating_applications_using_service_account_credentials" target="_blank">サービス アカウントの認証情報を使用したアプリケーションの認証</a></li>
<li><a href="https://cloud.google.com/appengine/docs/standard/python/access-control?hl=ja#service_account_for_app_engine" target="_blank">AppEngine におけるサービス アカウント</a></li>
</ul>
<br />
<i>- By Grace Mollison, Cloud Solutions Architect</i>Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-52476919459898139942019-05-15T14:00:00.000+09:002019-05-16T14:02:00.059+09:00Google Cloud Platform トレーニング イベント | Cloud OnBoard - 大阪 スペシャルバージョン 6 月 4 日(火)開催<div style="text-align: center;">
<img height="327" src="https://lh6.googleusercontent.com/0S9hIdvlPOarGPVvT_rJo3HUt8C-znZQka40fP6DJg79qj4zR-xN1aLAwWAe9ND5DwYjaEM73AgGXDBkr1GIlTUBIQNCPhlaKxinXfAK-V9btKpPyfwBGiBNmIfLtW_x44AEhUMs" style="border: none;" width="624" /></div>
Cloud OnBoard は、GCP 認定トレーナーによる Google Cloud Platform (GCP) トレーニングイベントです。2016 年の開催以来、毎回多くのお客様にお越しいただき、トレーニングを実施してまいりました。 このたび『<a href="https://goo.gle/2WLlfI8" target="_blank">Cloud OnBoard - 大阪</a>』では、大阪初のスペシャル企画として、4つの講座を同時開催いたします。<br />
<br />
まずは GCP に興味がある・理解したいと考えているお客様のはじめの一歩となる<strong>入門編トレーニング</strong>、そして、<strong>機械学習、BigData の集中トレーニング講座</strong>、更に GCP 製品の賢い組み合わせ方法をお話する <strong>アーキテクトデザイン講座</strong>も開催いたします。各トレーニングでは、スペシャル トレーナーが各製品の利点、特徴、ユースケースをお話し、さらに GCP エキスパートが皆さまの疑問にお答えいたします。<br />
<br />
セミナー終了後は、Qwiklabs 演習をセルフラーニング形式で実施予定です。時間は 1 時間程度で、ご希望の方はどなたでもご参加いただけます。ノート PC をご持参の上、ぜひご参加ください。<br />
<br />
IT マネージャ、システムエンジニア、ソリューション デベロッパー、ソリューション アーキテクト、オペレーター、ビジネスリーダーまたは Google Cloud Platform に初めて触れる方、更に知見を広めたい方のために構成されたトレーニングです。ぜひ、同僚の方々とお誘い合わせの上、ご参加ください。<br />
<br />
<br />
<hr />
<h3>
Cloud OnBoard | 大阪 スペシャルバージョン</h3>
講座:<br />
<ul>
<li>Google Cloud Platform 入門編トレーニング「初めての Google Cloud Platform」</li>
<li>Big Data 講座「GCP を活用した効率的なビッグデータの利活用方法」</li>
<li>アーキテクトデザイン講座「アーキテクチャ原則とパターンで学ぶ、実践的な GCP 使いこなし講座」</li>
<li>機械学習講座「エンドツーエンドで学ぶ GCP を活用した機械学習モデルの構築」</li>
</ul>
日時: 2019年6月4日(火) 9:30 - 17:30(受付開始 8:30~)<br />
会場: ハービスホール<br />
〒530-0001 大阪市北区梅田2-5-25 ハービスOSAKA B2F<br />
参加費: 無料(事前登録制)<br />
<br />
お申し込みは<a href="https://goo.gle/2WLlfI8" target="_blank">こちら</a>Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-39693115401667254582019-05-14T11:00:00.000+09:002019-05-16T14:36:42.274+09:00大阪 GCP リージョンの正式運用を開始します<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFkljhEj1AGsIUKU38pLGAUgFz29t64NZGM6q6VjlU-GgafptqEOeP6xtawtukFJfanaPFV-PdtWMJwK6X5owhdyz48ZTjr5RgfRgqbMM6L9vinCzq-Ym5XoSyN8Gjb-5EUamOFL03uI6A/s1600/Blog-header-TK.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="700" data-original-width="1200" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFkljhEj1AGsIUKU38pLGAUgFz29t64NZGM6q6VjlU-GgafptqEOeP6xtawtukFJfanaPFV-PdtWMJwK6X5owhdyz48ZTjr5RgfRgqbMM6L9vinCzq-Ym5XoSyN8Gjb-5EUamOFL03uI6A/s640/Blog-header-TK.jpg" width="640" /></a></div>
<span style="font-size: small;">Posted by Google Cloud CEO トマス キュリアン</span><br />
<br />
Google Cloud は、本日より、大阪 GCP リージョンの正式運用を開始したことをお知らせいたします。<br />
<br />
大阪 GCP リージョンは、2016 年に運用を開始した 東京 GCP リージョンに続く、日本国内で 2 か所目のクラウド拠点です。同リージョンの提供開始にともない、アジア太平洋地域では 7 か所、グローバルでは 20 拠点が利用できるようになります。大阪 GCP リージョンは、急速に拡大する日本の顧客層をサポートするだけでなく、お客様における事業継続性を高めるほか、可用性の向上に寄与します。<br />
<br />
Google Cloud は、セキュアで信頼性の高い<strong>グローバル インフラストラクチャ</strong>、大規模データを管理する<strong>デジタル トランスフォーメーション プラットフォーム</strong>、新しいデジタル機能をもたらす<strong>業種特化型ソリューション</strong>の提供を通じ、ビジネスの発展を支援することを、そのミッションに掲げています。<br />
<br />
Google では過去 3 年間、グローバル インフラストラクチャに対し 470 億ドルを超える投資を行ってきました。こうした継続的な投資と、グローバルなパートナー エコシステム、Go-To-Market 部門の拡充等を通じ、Google Cloud は世界的なリーディングカンパニーとの戦略的パートナーシップを構築してきました。日本では、2016 年の東京 GCP リージョン公開以降、小売、ゲーム、金融サービス、製造を中心とする様々な業界において Google Cloud のテクノロジー ソリューションの採用が進んでいます。<br />
<br />
今回、大阪 GCP リージョンの公開にあわせ <a href="https://www.asahigroup-holdings.com/" target="_blank">アサヒグループホールディングス</a>や、<a href="https://www.kccs.co.jp/" target="_blank">京セラコミュニケーションシステム</a>等の日本のリーディングカンパニーが、それぞれの業種におけるデジタル トランスフォーメーションのために Google Cloud を選択されました。<br />
<br />
<blockquote class="tr_bq">
<i>「GCP 大阪リージョンの正式運用開始心待ちにしておりました。弊社は以前より BigQuery を始めとした GCP のサービスを活用して参りました。大阪リージョンの開設により、さらなるシステムの可用性向上、ビジネスの継続性実現に取り組んでいきたいと考えています。」</i><br />
―― アサヒグループホールディング株式会社 執行役員 IT部門 ゼネラルマネジャー 知久 龍人 氏</blockquote>
<br />
<blockquote class="tr_bq">
<i>「京セラコミュニケーションシステム株式会社は GCP 大阪リージョンの正式運用開始を心より歓迎いたします。弊社の IoT トータルソリューションにおいて App Engine や BigQueryを始めとした GCP のサービスを以前から活用してきました。大阪リージョンの開設に伴い、2 リージョンを利用したシステムの可用性向上、ビジネス継続性の実現に取り組み、今後さらにサービス品質を高めて参ります。」</i><br />
―― 京セラコミュニケーションシステム株式会社 代表取締役社長 黒瀬 善仁 氏</blockquote>
<br />
お客様の成功を後押しするために、パートナー各社との協力は不可欠です。この度、<a href="https://www.nttsmc.com/" target="_blank">NTTスマートコネクト</a>および<a href="https://www.softbank.jp/" target="_blank">ソフトバンク</a>と協力できることを、私たちは嬉しく思っています。<br />
<blockquote class="tr_bq">
<i>「大阪 GCP リージョンの正式運用開始を歓迎します。東京に続く日本で 2 ヶ所目となるリージョンの運用開始により、当社が提供する GCP との閉域接続サービスを活用することで、日本国内でのディザスタリカバリにも対応したより堅牢な GCP 環境の提供が可能となります。」</i><br />
―― ソフトバンク株式会社 常務執行役員 法人事業統括 副統括担当 佐藤 貞弘 氏</blockquote>
<br />
<blockquote class="tr_bq">
<i>「この度、GCP 大阪リージョンの提供開始を心より歓迎いたします。今回の GCP 大阪リージョンの開設により、大阪市内を中心に提供している弊社ハウジング・クラウドサービスと GCP 大阪リージョンを閉域で接続できるサービス『クラウド クロス コネクト』で組み合わせ、低遅延でセキュアなハイブリッド クラウド環境の提供を実現します。」</i><br />
―― エヌ・ティ・ティ・スマートコネクト株式会社 代表取締役社長 白波瀬 章 氏</blockquote>
<br />
Google Cloud では、2020 年上半期に運用を開始するソウル、ソルトレイクシティ、ジャカルタをはじめとし、引き続き、新しいリージョンを順次開設して参ります。大阪 GCP リージョンの詳細は以下をご参照ください。<br />
<br />
<ul>
<li>3 つのゾーンと、Compute Engine、App Engine、Google Kubernetes Engine、Cloud Bigtable、Cloud Spanner、BigQuery など一連の標準<a href="https://cloud.google.com/about/locations/?hl=ja#global-products" target="_blank">プロダクト</a>を提供する <a href="https://cloud.google.com/?hl=ja" target="_blank">Google Cloud Platform</a> リージョンです。先ごろリリースした Anthos と組み合わせることで、オンプレミスと任意のパブリック クラウドを自由に選択し、どんなインフラストラクチャのワークロードも管理できる柔軟性が得られます。</li>
</ul>
<ul>
<li>ディザスタ リカバリでの IT およびビジネス要件に不可欠なセキュアな分散インフラストラクチャにより、従来よりも強固な事業継続計画を策定できます。</li>
</ul>
<ul>
<li><a href="https://cloud.google.com/partners/directory/?hl=ja" target="_blank">日本国内の強力なパートナー エコシステム</a>により、充実したサポートとサービスを提供します。</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://lp.google-mkto.com/rs/248-TPC-286/images/new-region-osaka-04AR-JP.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="360" src="https://lp.google-mkto.com/rs/248-TPC-286/images/new-region-osaka-04AR-JP.gif" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
大阪 GCP リージョンについては<a href="https://cloud.google.com/about/locations/japan/?hl=ja" target="_blank">こちらのページ</a>を、新規のサービスやリージョンの提供については<a href="https://cloud.google.com/about/locations/?hl=ja" target="_blank">ロケーション ページ</a>をご覧ください。<br />
<br />
また、今回 Gartner の Magic Quadrant で Google Cloud が、日本のクラウド インフラストラクチャ分野におけるリーダーに選出されたことをお知らせします。この栄誉は、業界最高品質のクラウド サービスをお客様に提供する努力が認められたものであると考えています。私たちは、今後とも、日本をはじめ世界のお客様に価値あるサービスをお届けすべく、一同尽力して参ります。<br />
<br />
- By Thomas Kurian, CEO, Google CloudGoogle for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-12412027085037806282019-05-07T16:00:00.000+09:002019-05-07T20:34:32.032+09:00Cloud OnAir 番組レポート : GCP で実現するバックアップ・ディザスタリカバリのベストプラクティス<a href="https://goo.gl/kWM1J3" target="_blank">Cloud OnAir</a> は、Google Cloud の製品をわかりやすく解説し、最新の情報などをいち早く皆様にお伝えする Online 番組です。<br />
<br />
4 月 25 日の放送は、システムバックアップやディザスタリカバリ(DR)など、GCP の機能を利用した可用性の高いシステムの構築について解説します。<br />
<br />
<h3>
Compute Engine のバックアップ</h3>
Compute Engine の永続ディスクをバックアップする方法には大きく分けて、スナップショット、イメージ、Cloud Storage にコピーするの 3 種類があります。<br />
<ul>
<li><b>イメージ </b>: 永続ディスクをまるごとバックアップする方法です。インスタンスやインスタンステンプレートの作成時に用います。常にフルバックアップを行うので、保存サイズは一般的に大きくなります。</li>
<li><b>スナップショット </b>: こちらも永続ディスクをまるごとバックアップする方法です。フルバックアップの後は増分のみを保存します。データは圧縮されるため、保存時のサイズも小さくなります。永続ディスク上のデータをバックアップする場合はこちらを利用します。また、スナップショットは別リージョンに保存可能です(データ転送料は不要)。さらに、スナップショットを定期的に実行する<a href="https://cloud.google.com/compute/docs/disks/scheduled-snapshots" target="_blank">スケジュール機能</a>も提供されています(現在、ベータ提供)。</li>
<li><b>Cloud Storage にコピー </b>: ファイル単位でバックアップを行うための方法です。<a href="https://cloud.google.com/storage/?hl=ja" target="_blank">Cloud Storage</a> は Restful API でオブジェクトを操作するオブジェクトストレージサービスで、高い耐久性を備えています。オブジェクトのバージョニング(世代管理)に対応し、ライフサイクル管理機能も備えています。</li>
</ul>
<br />
<h3>
Cloud SQL のバックアップ</h3>
フルマネージドなデータベースサービスである、Cloud SQL のバックアップについて解説します。2 種類のリストアの方法を取り上げて、それぞれのメリット、デメリットを整理します。<br />
<br />
<h3>
ディザスタリリカバリをクラウドで実現</h3>
自然災害などでサービスやシステムが深刻な被害を受けたときに、損害を軽減したり、機能を維持あるいは回復・復旧する方法や措置です。一般に、ディザスタリカバリを実現するには、<br />
<ul>
<li>本番のデータをリアルタイムもしくは定期的に同期する仕組み</li>
<li>本番環境と DR 環境を高速で接続するネットワーク</li>
<li>本番環境と同じ機能が提供できるサーバーやネットワーク機器 </li>
<li>(公開サービスの場合)インターネット接続</li>
<li>電力や空調、スペースなどのファシリティなど</li>
</ul>
が求められます。<br />
<br />
番組では、こうした要求に対して、GCP がどのようなサービスを提供しているのか、またそれらをどのように使えば良いかのポイントを解説します。<br />
<br />
さらに、一連の復旧作業をテンプレート化する方法として、<a href="https://cloud.google.com/deployment-manager/?hl=ja" target="_blank">Cloud Deployment Manager </a>を紹介します。Cloud Deployment Manager では、アプリケーションに必要なすべてのリソースを宣言的に記述することができます。Python テンプレートや Jinja2 テンプレートを使い、構成内容をパラメータ化し、負荷分散や自動スケーリング インスタンス グループなど、共通のデプロイ計画を何度も使用することができます。<br />
<br />
オンプレミス環境の DR 対策は、ファシリティ(データセンター)の冗長化も含めた対策が求められるため、クラウドに移行済みの環境に比べて解決すべき課題が広範囲におよびます。そこで、データのバックアップなど部分的にクラウド化することで、安価かつ堅牢なバックアップ環境を構築することが可能です。オンプレミスから GCP へのデータバックアップをサポートするサードパーティ製品を活用すれば、データ移行もより容易になります。<br />
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/gjrMaeBvRfA" width="560"></iframe>
</div>
<div style="text-align: center;">
<a href="https://cloudonair.withgoogle.com/events/cloud-onair-japan-q2-2019/watch?talk=tky_bu_q2&reg=" target="_blank">2019 年 4 月 25 日放送 GCP で実現するバックアップ・ディザスタリカバリーのベストプラクティス</a></div>
<br />
番組で説明した資料は<a href="https://www.slideshare.net/GoogleCloudPlatformJP/cloud-onair-next-19-gcp-2019411/GoogleCloudPlatformJP/cloud-onair-next-19-gcp-2019411" target="_blank"><b>こちら</b></a>で公開しています。<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/gz0AeFpIOuvZw9" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe> </div>
<div style="margin-bottom: 5px;">
<div style="text-align: center;">
<strong> <a href="https://www.slideshare.net/GoogleCloudPlatformJP/cloud-onair-google-cloud-2019425" target="_blank" title="[Cloud OnAir] Google Cloud で実現するバックアップ ディザスタリカバリのベストプラクティス 2019年4月25日 放送">[Cloud OnAir] Google Cloud で実現するバックアップ ディザスタリカバリのベストプラクティス 2019年4月25日 放送</a> </strong> from <strong><a href="https://www.slideshare.net/GoogleCloudPlatformJP" target="_blank">Google Cloud Platform - Japan</a></strong> </div>
</div>
<br />
<br />
<a href="https://goo.gl/kWM1J3" target="_blank">Cloud OnAir</a> では、各回 Google Cloud のエンジニアがトピックを設け、Google Cloud の最新情報を解説しています。過去の番組、説明資料、さらには視聴者からの質問と回答は<a href="https://goo.gl/kWM1J3" target="_blank">こちら</a>よりご覧いただけます。 最新の情報を得るためにもまずはご登録をお願いします。Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0tag:blogger.com,1999:blog-4463193508179451776.post-71759711675422076832019-05-07T14:43:00.000+09:002019-05-09T13:37:44.919+09:00Google Cloud Platform - サポート体制拡充に関するお知らせ2012 年に Google Cloud Platform サポートを開始して以来、グローバルで多くのお客様に Google Cloud Platform サポートをご利用いただいてきました。多くのお客様に Google Cloud Platform をご利用いただく中で、お客様が利用される言語でサポートさせていただくことの大切さを実感してまいりました。また、お客様のご要望にお応えするため、私たちはグローバルでサポート体制の強化に努めてきました。そして、この度、以下の言語を新たにサポート、拡張することになりました。<br />
<ul>
<li>中国語 (標準語) による営業時間 (中国標準時) でのサポート</li>
<li>韓国語による営業時間 (韓国時間) でのサポート</li>
<li>日本語による 24 時間 365 日サポート (Platinum / Enterprise のお客様向け) </li>
</ul>
この変更により、Gold/ Production と Platinum/ Enterprise のお客様は、中国語と韓国語によるサポートをご利用いただくことができるようになりました。韓国語でのサポートへのお問い合わせは<a href="https://cloud.google.com/support-hub/?hl=ko" target="_blank">こちらのぺージから</a>、中国語 (簡体字) でのサポートへのお問い合わせは<a href="https://cloud.google.com/support-hub/?hl=zh-cn" target="_blank">こちらのページ</a>から、中国語 (繁体字) でのサポートへのお問い合わせは<a href="https://cloud.google.com/support-hub/?hl=zh-tw" target="_blank">こちらのページ</a>からご利用いただけます。中国語、韓国語でのサポートは、現地時間の平日午前 9 時から午後 5 時までの営業時間でのご案内となります。
<br />
また、サポートのサービスレベルが Platinum、もしくはサポートロールが Enterprise のお客様は、日本語による 24 時間 365 日サポートをご利用いただくことができるようになりました。緊急対応が必要な時には、24 時間 365 日お問い合わせいただくことができます。<br />
<br />
詳細は <a href="https://cloud.google.com/terms/tssg/" target="_blank">Technical Support Services Guidelines</a> (英語) にてご確認いただけます。Google Cloud Platform をご利用いただいている皆様からの様々なフィードバックをお待ちしております。<br />
どうぞこれからも <a href="https://cloud.google.com/support/?hl=ja" target="_blank">Google Cloud Platform サポート</a>をご利用ください。<br />
<br />Google for Work Japanhttp://www.blogger.com/profile/14476550817511199539noreply@blogger.com0