GoogleAppEngineクイックスタート② CloudSQL編

# 概要

* [前回記事](https://qiita.com/ezaqiita/private/df24cdef6dee6d38509f)の続き
* AppEngineから接続するDBインスタンスを作成する
* ここでのDBはCloudSQLを使用する
* そのままでは接続できないため、サーバレスVPCコネクタを作成する
* AppEngineからCloudSQLへ接続する
* データベース内のデータ作業をするため、GCEで踏み台サーバを作成する

# VPCネットワーク

## 設定

* DBインスタンスが存在するためのVPCを作成する

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/925d78db-4ba7-700b-9c58-91a9131d2c69.png">
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/066319d0-96da-d732-aa6d-427140003316.png">
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/d16f7bfd-6f06-97f3-16f6-79ae7903d2a4.png">

* CloudSQLでDBインスタンスを作成する
* プライベートIPで接続させる
* パブリックIPは有効にしていないためCloudShellからは接続できない


# CloudSQL

## 設定

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/9275c733-2318-6935-2ce6-528d793956de.png">

*「割り当てて接続」を選択

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/0fb98c18-a826-d73c-09b1-1223492d6932.png">

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/8d08451c-2adc-ffa1-7fcd-747448452c8e.png">

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/70d9651e-ae57-cff6-2aad-9a99a83188d4.png">

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/0fef213a-cbcd-d95e-0fa4-7a1a91986c8e.png">

* mysql rootユーザのパスワードを設定
<img width="60%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/69df30ea-eb9c-5699-56a8-eafdd5d7bb11.png">

* mysql 一般ユーザを作成
<img width="60%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/92ba6d28-df0a-0d02-9049-a6ea99265e18.png">

# GCE

## 設定

*　DBに接続するため同じVPC内にGCEで踏み台サーバを作成

* インスタンスを作成する

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/20d5aa70-4826-6a7c-cfee-7cd23acc5f10.png">

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/b5a69609-fec8-dccb-dfe3-97c0812477b8.png">

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/171c8d3a-722c-b49d-d9cd-f8c42fccc460.png">

# ファイアウォールルール

## 設定

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/ea1fb51e-c83c-0564-eb64-70cec4d83c5a.png">

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/3b74bbbe-4397-edd0-bae2-923fbe401640.png">

* GCEインスタンスへ接続し、CloudSQLへ接続

```
$ ssh -i <path_to_privatekey> <os_user>@<gce_external_ip>
$ sudo apt upgrade
$ sudo apt-get install mariadb-client
$ mysql -uroot -h<cloudsql_private_ip> -p
Enter password:
$ create database test;
$ exit
```

[公式：MySQL クライアントの Compute Engine からの接続](https://cloud.google.com/sql/docs/mysql/connect-compute-engine)

# サーバレスVPCアクセス

## 設定

* AppEngineからCloudSQL接続するためにサーバレスVPCコネクタを作成する

* [サーバレスVPCコネクタ画面へ](https://console.cloud.google.com/networking/connectors/list)

* 「コネクタ作成」
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/a8b86997-61c9-f913-c6bd-657b1b5e9043.png">
各項目入力
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/99945a60-0c79-e56c-6079-b4b3493e2ca5.png">

# 結合試験

## 設定

* CloudShellを起動
* app.yamlを以下のように記載

```app.yaml
runtime: php72
service: <service_name>

vpc_access_connector:
  name: "projects/<project_id>/locations/asia-northeast1/connectors/<vpc_connector_name>"
```

* AppEngineからデータベース接続を確認するためindex.phpを以下のように変更
* 先程作ったDB”test”に接続を試す

```index.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Hello World</title>
</head>
<body>
<?php
    echo "Hello World";
    echo '<br>';

    $link = mysqli_connect('<cloud_sql_private_ip>', 'root', '<password>', 'test');

    if (!$link) {
      echo "データベース接続失敗" . PHP_EOL;
      echo '<br>';
      echo "errno: " . mysqli_connect_errno() . PHP_EOL;
      echo "error: " . mysqli_connect_error() . PHP_EOL;
    exit;
     }

    echo 'データベース接続成功';
    echo '<br>';

    // 切断
    mysqli_close($link);

?>
</body>
</html>
```

```
$ gcloud app deploy
$ gcloud app browse -s <service_name>
```

## 接続

* 出力されたアドレスでアクセスし、DB接続を確認

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/8a7e94f4-317e-ab1d-7d51-f4324759f4e0.png">

* カスタムドメインのアドレスでアクセスし、DB接続を確認

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/4ad89b56-c612-a2bc-bc37-4d0265be6ccd.png">

上記でAppEngineからCloudSQLの接続を設定・確認を完了

## 参考
[公式：VPC ネットワークへの接続
](https://cloud.google.com/appengine/docs/standard/php7/connecting-vpc)

# CloudMemoryStore

[GoogleAppEngineクイックスタート③ CloudMemorystore編へ](https://qiita.com/ezaqiita/private/e359a3e1d5ac6a8561f7)