[Cloud102]#2-2 GCPを始めよう(後半:GAE編)

このコンテンツは「後半」です。「前半」は以下を参照してください。
http://qiita.com/nagahisa/items/d491da7099c1229d42d2

# AGENDA
(0.はじめに)
(1.GCP利用開始)
(2.CGEとは?)
(3.GCE使ってみる)
4.GAEとは?
5.GAE使ってみる
6.Cloud Datastoreとは？
7.Cloud Datastoreってみる
8.Cloud Storageとは?
9.Cloud Storage使ってみる

#4.GAEとは?
前半のGCEは"IaaS"なので、PCのインストールやったことのある人であれば概念は比較的理解しやすく簡単だったと思いますが、GAEは"PaaS"なので、ちょっと事前説明が必要です。
最近は"PaaS"という言葉はあまり流行ってませんが、まずはPaaSって何の為のものか？から見ていきましょう。

(1)PaaSとは?

http://gihyo.jp/admin/serial/01/cloud_career/0004

```
「クラウドコンピューティング」を大きく分けるとIaaS，PaaS，SaaSと大きく3つに分けられます。
連載の最初で私はIaaSは「サーバ」や「回線」などのインフラを仮想的に提供するサービス，SaaSはソフトウェアを提供するサービス，PaaSは「開発環境」を提供するものと説明しました。
しかし，「開発環境を提供する」と一口に言っても人によっては色々な意味合いが出てきます。
単に「開発環境を提供する」という事であれば，別にIaaSでもOSのインストールなどを行えば開発環境ができますし，
1枚のWebページを公開するだけであればSaaS的なサービスでもWebサイトやブログを構築できるサービスはあります。
それではPaaSは，どのような「開発環境」を提供するものになるのでしょうか？ 
PaaSによって，提供形態に違いはありますが，PaaSは一般的にはプログラムの実行環境を提供するものと言われています。
```

・PaaS=「プログラムの実行環境を提供するもの」
なので
・「PaaSを使えば、(VMとかOSとかミドルとか用意しなくても）プログラムが実行できる」
ってことです。とっても便利そうですよねー。

ここの説明の図がわかりやすいかも。
https://www.cloud-ace.jp/report/detail01/

そもそもGCPは、2009年2月に正式サービス開始されたGAEから始まりました。そのころ Googleは「これからはPaaS！」といってGAEを提供し、GCEのようなIaaSは提供して来ませんでした。
https://ja.wikipedia.org/wiki/Google_App_Engine

でも、そのころのPublic PaaSはherokuなどが一部の開発者の間で盛り上がったものの、結局流行らなかったんです。同時期にVMwareからCloud Foundry(CF)というPaaS基盤ソフトも出て来たのですが同様でした。「PaaS制約」のためPaaS自体が流行らなかった、と言えると思います。

Public PaaSはプロバイダがプログラム実行環境を提供する＝ユーザ側がプログラム実行環境を変更できません。Public PaaSプロバイダが用意した、開発言語や Http Serverや DBなどのサービスを使うしかないわけです。最初のGAEやCFは用意されているサービスが少ない、つまり、開発者にとっては「開発言語やミドルの選択肢が少ない・使いたいミドルが入れられない」という制約になってしまったのです。
http://blog.cloud66.com/its-official-public-paas-is-dead/

でも最近はPaaSのコンセプト「プログラムの実行環境を提供する」が見直されてきています。
CFもIBM PaaSのBluemixだけでなく、SAP HANA/GE Predixの開発基盤などにも使われ始めてきています。
http://cf-api-version.mybluemix.net/

個人的には、今流行りのServerless Computingも一種のPaaSと言ってもいいのではと思っています。
https://en.wikipedia.org/wiki/Serverless_computing

(2)Git,GitHubとは?

ハンズオンで使うので説明が必要なんですが、、、、
・Git = みんなで使えるバージョン管理ツール
・GitHub = みんなでGit編集できる場所
ってな感じでゴマカスので(:sweat:)、ググって調べててみてください。

https://github.com/
![100.JPG](http://qiita-image-store.s3.amazonaws.com/0/79389/c8bca753-41ec-fc89-9dcb-c659650f452b.jpeg)

ハンズオンでは、PaaS上で動かすプログラムのソースコードを取ってくる時に使います。

(3)memcacheとは？

これもハンズオンで使うので説明が必要なんですが、、、、
・DBやファイル（永続記憶）ではなく、メモリ上のキャッシュ（揮発記憶）
ってな感じでゴマカスので(:sweat:)、ググって調べててみてください。

ざっくり言うと、Keyとその値(Key-Value)という形式で値を入出力できる揮発性の外部記憶です。

http://memcached.org/
![102.JPG](http://qiita-image-store.s3.amazonaws.com/0/79389/33ab092d-ee24-73ea-7f79-cccc438093f1.jpeg)


ハンズオンでは、PaaS上で動かすプログラムの最初のバージョンでユーザが入力した文字列を保持するところにに使います。

(4)やっとGAEとは？

はい、GCPのPaaSです:grin:
https://cloud.google.com/appengine/
![101.JPG](https://qiita-image-store.s3.amazonaws.com/0/79389/9c027d67-b1c5-36d8-9fad-5de34051d188.jpeg)


GAEには、standard environment(SE) と flexible environment (FE)があります。
flexible environment使うと「PaaS制約」を飛び越えたりできるようですが、今回はstandard environmentを触るだけです。
https://cloud.google.com/appengine/docs

#5.GAE使ってみる

このハンズオンでは、Pythonで書かれたWebアプリケーションを、以下の３つのパターンで順番に動かしていきます。
- memcache版：      入力データ保持にmemcacheを使うWebアプリケーションです。
- Datastore版：     入力データ保持にDatastoreを使う同じWebアプリケーションです。
- Cloud Storage版： 入力データをCloud Storageにも保存するようにした同じWebアプリケーションです。

GAEはPaaSですので、基本的には
- Webアプリケーションのプログラム(ソースコード)を用意する
- GAEにデプロイする
だけで、Webアプリケーションを動かすことができます。

では早速、memcache版のプログラムを用意して、GAEにデプロイしてみましょう。

##(0)Cloud Shell起動

プログラムを自分のPCに用意して、自分のPCからGAEにデプロイすることも出来ますが、準備が面倒なので、"Cloud Shell"を作業場所に使います（"Cloud Shell"とっても便利:grin:)

・"Cloud Shell"アイコンクリックするだけ
![001.png](http://qiita-image-store.s3.amazonaws.com/0/79389/707434d1-1415-67ac-7b11-0902dc516bf8.png)

##(1)memcache版のプログラムを用意

今回のプログラムは実はGoogleがトレーニング用に用意してくれています。

・GCP TrainingのGitHubレポジトリ
https://github.com/GoogleCloudPlatformTraining
![002.png](http://qiita-image-store.s3.amazonaws.com/0/79389/38add3ea-2b34-9c91-bfbf-ce35d651c4c2.png)

・今回使うmemcache版
https://github.com/GoogleCloudPlatformTraining/cp100-appengine-memcache-python
![003.png](http://qiita-image-store.s3.amazonaws.com/0/79389/5fb2a49a-b404-3a5a-3f91-7b39cf9fbfa2.png)

・"Cloud Shell"上で以下のコマンドを入力してmemcache版のプログラムを入手(git clone)します。

```
git clone https://github.com/GoogleCloudPlatformTraining/cp100-appengine-memcache-python.git
```
![010.png](http://qiita-image-store.s3.amazonaws.com/0/79389/4dc38d7a-e643-99dc-79bd-20489a71ea73.png)

##(２)memcache版プログラムをデプロイ

・デプロイは、git cloneされたディレクトリにある appcfg.py コマンド実行で行います。

```
cd cp100-­appengine-­memcache-­python
appcfg.py -A $DEVSHELL_PROJECT_ID update .
```
![011.png](http://qiita-image-store.s3.amazonaws.com/0/79389/a37b44f7-a265-75f7-e179-bf837eb60a3e.png)

・色々表示されますが、最後に"Completed update of app:..."って表示されるとデプロイ成功です。
![012.png](http://qiita-image-store.s3.amazonaws.com/0/79389/d53e78df-b6eb-91ad-e0a1-90cd4c597865.png)

・ここで "Completed update of app:cp100-xxxxx (上記キャプチャでは cp100-148305")って表示されていますが、これがアプリケーション名(Project_ID)です。

アプリケーション名はGAEの世界の中でユニークに設定する必要がありますが、なんと"Cloud Shell"は、自動的にユニークな名前を割り振って、$DEVSHELL_PROJECT_ID という環境変数に入れてくれてます。
（appcfg.py コマンドの "-A" 引数に指定するのがアプリ名です）

##(3)memcache版アプリの動作確認

このアプリ(Webアプリ）のURLは、http://<アプリ名>.appspot.comとなります。
ブラウザからこのURLにアクセスしてみましょう。

![013.png](http://qiita-image-store.s3.amazonaws.com/0/79389/7e74efcb-dd71-6790-897c-45eb158ae242.png)

はい、簡単なGuestbookの完成です。適当に"New Entry"に入力して"Submit"してみてください。
![014.png](http://qiita-image-store.s3.amazonaws.com/0/79389/5e96b9af-969e-1413-70e6-8954b12cdd30.png)

GAEコンソールでどう見えるか確認してみましょう。
![015.png](http://qiita-image-store.s3.amazonaws.com/0/79389/fcd08f9e-67c2-3822-d656-a3a77e424f34.png)

![016.png](https://qiita-image-store.s3.amazonaws.com/0/79389/3bc61efb-a62a-b704-2448-41a84f8ae9e9.png)

##(4)memcacheの確認

では、このアプリのmemcacheを少しみてみましょう。
このアプリのプログラムでは、memcacheのキーを"entries"としているので、それを入力して検索してみます。

・memcache画面を開いて
![020.png](http://qiita-image-store.s3.amazonaws.com/0/79389/79144fc9-5f13-9b9c-2f4a-c496e93b37a5.png)

・キー"entries"で検索すると
![021.png](http://qiita-image-store.s3.amazonaws.com/0/79389/5c3e3ee2-4724-765e-4ab2-d9d7f38cb29d.png)

・Webで入力した値が入っているっぽい
![022.png](https://qiita-image-store.s3.amazonaws.com/0/79389/43fef805-7418-fec7-455d-4ccbeda59258.png)

・memcache管理画面から「フラッシュ」してみます。
![023.png](http://qiita-image-store.s3.amazonaws.com/0/79389/aaec50b6-f837-372c-2729-ea66e86d2461.png)

・ブラウザ画面を再ロードして確認してみてください
![013.png](http://qiita-image-store.s3.amazonaws.com/0/79389/6939f07e-04de-53e6-eca8-70992b3b6c2c.png)

#6.Cloud Datastoreとは？

Cloud Datastoreは GCPの非リレーショナルデータ用のNoSQLデータベースです。
NoSQLデータベースは、基本的に KeyValue型テータストアの機能を持っています。

https://cloud.google.com/datastore/
![200.JPG](http://qiita-image-store.s3.amazonaws.com/0/79389/aea704f0-a40d-1d91-59e5-a2503187bfe2.jpeg)

#7.Cloud Datastoreってみる

##(1)Datastore版のプログラムを用意

・"Cloud Shell"のホームディレクトリに戻って、以下のコマンドを入力してDatastore版のプログラムを入手(git clone)します。

```
git clone https://github.com/GoogleCloudPlatformTraining/cp100-appengine-datastore-python.git
```
![040.png](http://qiita-image-store.s3.amazonaws.com/0/79389/9b131f92-8c32-d295-00de-f024e37d333b.png)

##(２)Datastore版プログラムをデプロイ

・デプロイは、git cloneされたディレクトリにある appcfg.py コマンド実行で行います。

```
cd cp100-­appengine­-datastore-python
appcfg.py -A $DEVSHELL_PROJECT_ID update .
```

##(3)Datastore版アプリの動作確認

・同じアプリ名（Project_ID)でupdateデプロイを行っているので、Webアプリは同じURLで動いています。
![041.png](http://qiita-image-store.s3.amazonaws.com/0/79389/44c276b0-aff3-b9c7-7198-e908fe29d965.png)

Datastoreを確認してみましょう。
![042.png](http://qiita-image-store.s3.amazonaws.com/0/79389/562aeea2-d988-d33c-cfde-0ca9353da416.png)

#8.Cloud Storageとは?

Cloud StorageはAWSのS3と同様の分散オブジェクトストレージです。
![201.JPG](http://qiita-image-store.s3.amazonaws.com/0/79389/e324b4ac-c78e-24d3-404b-6c41ef5eaeb4.jpeg)

#9.Cloud Storage使ってみる

##(1)Datastore版のプログラムを用意

・"Cloud Shell"のホームディレクトリに戻って、以下のコマンドを入力してCloud Storage版のプログラムを入手(git clone)します。

```
git clone https://github.com/GoogleCloudPlatformTraining/cp100-appengine-cloudstorage-python.git
```
![050.png](http://qiita-image-store.s3.amazonaws.com/0/79389/a2882aff-9cb0-e806-caf7-91c9dcfb928f.png)

##(２)Cloud Storage版プログラムで使うCloud Storage環境を用意

データを保存するCloud Storageのバケットを作って、それをプログラム内に指定します。
バケット名は全世界でユニークにする必要があるので、自分の名前を付加するなど工夫してください。

・Cloud Storage管理画面に行く
![030.png](http://qiita-image-store.s3.amazonaws.com/0/79389/c4d4ed64-1155-db01-7664-58cbc2cb45eb.png)

![031.png](http://qiita-image-store.s3.amazonaws.com/0/79389/b65c2d49-0117-8097-ea6d-3dcedb7f0f30.png)

・PJデフォルトを使っても良いが、ここでは新規にバケット作成（例:cp100-kenzo)
![053.png](http://qiita-image-store.s3.amazonaws.com/0/79389/1c0e95ea-803e-0a4e-2500-b91a3cefa75d.png)

・空のバケットが出来上がり
![033.png](http://qiita-image-store.s3.amazonaws.com/0/79389/aecb74ff-d515-b63a-b7ac-ba140254fc44.png)

##(3)Cloud Storage版プログラムを修正

上で作ったCloud Storageのバケット名(例：cp100-kenzo)をプログラムで指定します。
対象のソースコードは guestbook.pyです。

![051.png](http://qiita-image-store.s3.amazonaws.com/0/79389/881287eb-b589-04bd-5830-eff6f9a6c943.png)

viなどのエディタで開いて以下を編集します。

```
BUCKET_NAME = 'ここに自分のバケット名を書く'
```
![052.png](http://qiita-image-store.s3.amazonaws.com/0/79389/4acaa13f-75d3-e0df-1f85-2b162d549f99.png)


##(4)Cloud Storage版プログラムをデプロイ

・デプロイは、git cloneされたディレクトリにある appcfg.py コマンド実行で行います。

```
appcfg.py -A $DEVSHELL_PROJECT_ID update .
```
![055.png](http://qiita-image-store.s3.amazonaws.com/0/79389/03652e96-00a7-20e4-64d0-1ac276432970.png)

##(5)Cloud Storage版アプリの動作確認

・同じアプリ名（Project_ID)でupdateデプロイを行っているので、Webアプリは同じURLで動いています。
![041.png](https://qiita-image-store.s3.amazonaws.com/0/79389/a33c2cf1-0495-4008-ffec-82a2d05895cf.png)

##(6)Cloud Storageの確認

Cloud Storage画面からバケットの中身を確認してみましょう。
・新しいオブジェクトが作成されています
![056.png](http://qiita-image-store.s3.amazonaws.com/0/79389/ad74e2c0-7d01-f9b5-919a-ddaa4ad9ed58.png)

・オブジェクトの中身を表示してみます。
![057.png](http://qiita-image-store.s3.amazonaws.com/0/79389/be267bc9-ae21-f919-6116-b3e578cebecc.png)

・いろいろ入力してバケットの中身を確認してみてください
![058.png](https://qiita-image-store.s3.amazonaws.com/0/79389/3a36561f-9111-c9ef-3446-e7497b682b29.png)

Enjoy!:boom: