Google Cloud Platformのチュートリアルをおとなしく続行する　その２（ローカルのみ成功）


#見直したらさっぱりわからん！
前回のこれ。

- [Google Cloud Platformでハロワする - Qiita](https://qiita.com/ragingalpaca/items/e73e74d179febc7f611a)

**滝先生がなんですかコレ？とかいうレベル。**

コードが一切書いてないからわからん。
というわけでちゃんと書こうと思いました。

あとGCPってなんじゃいってなったので勉強しました。（今更）

- [Google Cloud Platform(GCP)とは何か？サービス概要を徹底解説 | レンタルサーバー比較サイト](https://rentubtalk.com/server-column/gcp/)


#2番目のサンプルを動かす。
うろ覚えでサーバーを起動して、web/index.phpを叩く。
エラー。

1の方のフォルダと見比べる。

**vendorがない。**
よく考えるとcomposerさんに何も仕事をさせていない……！

というわけで以下を実行。

	composer install

からの、webをルートに指定してサーバーを起動。

![スクリーンショット 2017-11-28 19.07.50.jpg](https://qiita-image-store.s3.amazonaws.com/0/214031/9602b7f1-bb3e-2bc0-cebb-8fd48f1d803e.jpeg "スクリーンショット 2017-11-28 19.07.50.jpg")

ですよねー。
うーん。

ここでふと思い立って、README.mdを確認したところチュートリアルっぽいページが記載されていた。

- [Using Structured Data with PHP  |  PHP  |  Google Cloud Platform](https://cloud.google.com/php/getting-started/using-structured-data)

**これはチュートリアルの途中のページだよ！**
とか書かれてる。
お前ってやつは……。

#真のチュートリアルはこちら

- [PHP Bookshelf アプリ  |  PHP  |  Google Cloud Platform](https://cloud.google.com/php/getting-started/tutorial-app)

こっちが本命らしいです。

##PHP Bookshelfアプリ
そういうものを作るらしいです。
そういえばさっきのエラーメッセージにもそんな感じの言葉は見えてた気がします。


##準備
###GCPプロジェクトの設定。
App Engineを設定して、APIを設定。
ボタンを押して……エラー。

####エラー。
> リクエストしたAPIを使用する権限がありません。

さてなんだろう。
いろいろいじってるうち、ハンバーガーボタン「メニューとサービス」の「APIとサービス」＞「ダッシュボード」で現在有効？なAPI一覧が表示されることに気付きました。

####APIの設定。
見てみると、すでに有効になっているものもありました。
有効になっていなかった、「Cloud Pub/Sub」を入れます。
あとは「Google+ API（複数）」……そんな日本語名のAPIないんですけど……？

とりあえずググってそれらしい方法を探ります。

#####Google+ API認証情報の作成
Google+ APIのダッシュボード先頭にある「認証情報を作成」をクリック。

認証情報作成のページに飛びます。

使用するAPIはデフォルトでGoogle+になっているのでそのままで。
呼び出す場所……知らんので、ウェブブラウザってことにしておきます。なんとなくJavascriptを選択。
アクセスするデータの種類。アプリケーションデータだと怒られたのでユーザーデータ。
いいんでしょうかこんなんで。
必要な認証情報をクリック。

OAuth 2.0 クライアントIDを作成する。
必要なことがなんなのかわからん状態で知らん単語を出されても困りますね。
名前はとりあえずデフォルトのままでいきます。
Javascript生成元か、リダイレクトURIを入力する。知らんがな。生成元の方に、プロジェクトのパスを入れておきましょう。

OAuth 2.0同意画面を設定する。
本当に知らんがなという気しかしません。
こいつが認証求めてるけどー？ってやつですねきっと。
メアドはまあそのままで、サービス名は適当に入力します。
次へ。

認証情報をダウンロードする。
json形式のファイルが出てきました。

完了。
jsonファイルの中のidとsecretは、後でymlファイルの中に設定するっぽいです。


###SDKダウンロード
どこにだよ！！
ってキレてます。
ローカルはインストール済みなのでスルーします。

###ローカル認証
が必要らしいので以下でログインしたりします。
ブラウザで開くので、認証をしておきます。

	gcloud auth appllication-default login

###プロジェクトの確認
以下で、プロジェクトが想定通りになっているかを確認します。

	gcloud config list

ここで、表示されるプロジェクトが使う予定のものと違う場合は変更が必要らしいです。
案の定違いましたので、変更します。

	gcloud config set project XXXXX

で確認。おk。

###リポジトリのクローンを作成
これはしてるので飛ばします。


##チュートリアルの構成
説明がされている。
要するにこのページはここで終わるらしいですね。

- このチュートリアルは複数のパートで構成されてるよ、それぞれのパートでPlatformの各機能について学ぶよ
- 構造化データパートではSQLまたはNoSQLとかを使うよ。具体的には3つくらいあるから好きなやつを選んでね
- ファイルアップロード的なことも扱うよ
- ログイン処理もあるよ
- ログもあるよ

そういうことらしい。次に進みます。

#構造化データを使う方法を選ぶ
- [Using Structured Data with PHP  |  PHP  |  Google Cloud Platform](https://cloud.google.com/php/getting-started/using-structured-data)

3つの構造化データから1つを選ぶ。
MongoDBとか興味はあるんですけど、学習コスト的な意味でCloud SQLにしました。

#PHP での Cloud SQL の使用
- [PHP での Cloud SQL の使用  |  PHP  |  Google Cloud Platform](https://cloud.google.com/php/getting-started/using-cloud-sql)

##SQLプロキシのインストール
OSを選択して、記載されているコマンドを実施。
ここはそれだけ。

##CloudSQLインスタンスを作成する
###第二世代のインスタンスを作成する
つまり……どういうことだってばよ！？

- [インスタンスを作成する  |  Cloud SQL for MySQL  |  Google Cloud Platform](https://cloud.google.com/sql/docs/mysql/create-instance)

解説がこっち。

![スクリーンショット 2017-11-29 16.30.44.jpg](https://qiita-image-store.s3.amazonaws.com/0/214031/b6e43b2a-255f-a2a6-6ac0-1692c21befb5.jpeg "スクリーンショット 2017-11-29 16.30.44.jpg")

なるほど、この上の方をやればいいわけですね。

やり方が３種類。
コンソール、GCLOUD、CURL。
うーん？

とりあえずデフォルトのコンソールでやってみます。

GCP ConsoleからCloudSQLインスタンスに移動。

- [SQL の概要 - sample2](https://console.cloud.google.com/sql/instances?_ga=2.17503418.-2091782027.1510616207&project=sample2-187315)

画面の指示に従って進めます。
インスタンスとかパスワードを設定。忘れそう……適当に入力してEvernoteにメモを残しました（だめなやつ

設定オプション。
なにやらいろいろあるんですけど特に指示がないのでスルーで。
いいのか？

まあいいや。作成を押して、できたっぽいです。
次に進みます。

###コマンドラインからインスタンスをどうにかする
どうにかします。
どういう処理か書いてない。
describeだから、インスタンスの情報を表示って感じですかね。

	gcloud beta sql instances describe [YOUR_INSTANCE_NAME]

ベータとか書いてますね。
記事の冒頭になんかごちゃごちゃ書いてるので、それ関係なんでしょうね。

そのうち使えなくなるかも〜みたいな。
日々是勉強ですね……。

とか書いてたら終わりました。

connectionNameを取得します……インスタンス名とリージョン名が繋がってるだけですけどこれでいいのかな。
ユニークになってればなんでもいいんですかね。


##CloudSQLインスタンスを初期化
次にそういうことをします。

###Cloud SQL Proxyを開始
まず接続を確立するっぽい。

Linux系とWindowsで異なるようです。
以下はMac。

	./cloud_sql_proxy -instances="[YOUR_INSTANCE_CONNECTION_NAME]"=tcp:3306

これを実行します。

あとなんか書いてあるんですけどなんのことかよくわかりません。

> ローカルでテストを行うため、このステップでローカル コンピュータから Cloud SQL インスタンスへの接続を確立します。ローカルでのアプリケーションのテストが終了するまで、Cloud SQL Proxy を実行している必要があります。

つまり？
この処理はその「ローカルから接続を確立」するためのものなんでしょうか？

実行したところ、php -Sとかでサーバーを立ち上げた時のように操作権が返ってこなくなりましたのでそういうことにしておきます。
じゃあ、以降のテストとかはこの状態でやる必要があるってことですね。

##ユーザとかDBを作成
コンソールとMYSQLクライアントがありますがコンソールで。

1. DBを作成。
2. ユーザを作成。

としか書かれてない不親切仕様ですがいい加減慣れてきました。

**ハンバーガー＞SQL＞インスタンス名をクリック＞インスタンスの詳細が表示されるのでそのデータベースタブとユーザータブでそれぞれ作成ボタンを押す。**

これや。

###DBの作成
データベースタブで、データベースの作成ボタンを押す。
データベース名を入力。手順にある通りにbookshelfとか。
照合は省略。

作成をクリック。
タイプがユーザーのデータベースが作成できました。


###ユーザの作成
ユーザータブで、ユーザー アカウントを作成ボタンを……押せない。
うーん？
解説ページっぽいところに飛ぶと、ボタンを押してね！としか書いてません。

SXXT。

と思ったら、家の回線が不安定になっているだけのようでした。
なんかうちのMacさん、電波をときどき離すんですよね……。
回線とかくだらないところで止まることのないようにお気をつけください。

リロードしたらボタンが押せるようになりました。

ユーザー名とパスワードを入力して作成をクリック。


##設定の構成
settings.ymlとかをいじるようです。
2のサンプルフォルダに移動して以下を実行。

	cp config/settings.yml.dist config/settings.yml

config/settings.ymlを編集します。

手順にはGOOGLE_CLIENT_IDとかは書いてないんですけど、Google+ APIで認証したときのclient_idとclient_secretを指定しました。


##依存関係のインストール
これやったような気がしますね。
でも変わってるかもなんで再度実施。

	composer install

速攻終了しました。
特に変更はなくてよさそうです。

##アプリのデプロイ
App Engineフレキシブル環境？へのアプリのデプロイとか書いてます。
フレキシブル環境とは……？ってなったんですが。

**いろんなアプリが使えるよ、という程度のあまり意味のない言葉っぽいのでスルーします。**

	gcloud app deploy

実行。
なんか途中でめっちゃ赤文字が表示されたんですけど動いてるんで大丈夫でしょう。
うん。

しかし時間かかるな。

##実行。
エラー！！

しばし悩み、ローカルで実行してみたらエラー内容が出るということに気付きました。
**確認したところymlのcloudsqlという項目がおかしいとか。**

そういえば、ymlを設定した時にbookshelf_backendをcloudsqlに設定するとかあったんですけど。

**ymlを見る限りだと、どうやらそんな設定ないみたいなんですよね。**

つまりこの記事かgitのどっちかが古い……？
まじかよ……。

少し調べたらこんな似た感じの記事が出てきました。

- [Using Cloud SQL for MySQL with PHP  |  PHP  |  Google Cloud Platform](https://cloud.google.com/php/getting-started/using-cloud-sql-with-mysql)

**こっちは似てるんですけど、cloudsqlってなってるところがmysqlになってます。**
~~ふざけてんの？~~

キレ気味になりつつも、日本語訳に頼る語学弱者はこうなるといういい経験ができたと思うことにします。
改めて見直してみます。

#全体を見直し
違うところ……app.yamlを修正するところがありますね。

##app.yaml
beta_settingsとcloud_sql_instancesの行をコメント解除。
cloud_sql_instancesの値をsettings.ymlで設定したやつに修正して保存。

##ローカル実行
で、ローカル実行。
できました！！

##デプロイ……で、またエラー。
app.yamlがおかしいとか言われます。
うんー？　さっき直したやつのせい？

試しに、先ほどapp.yamlでコメント解除した行をコメントに戻して再度デプロイ。
お、できました。
**でも当然ながらエラー。**

~~なんなの……~~

って思ってその状態で試しにローカルで実行してみたら動きました。
……あれ、app.yamlの修正はいらなかった？？

よくわからなくなって諦め。
とりあえずローカルでは動きました。