GCPを試す


## 基本
GCPのコンソールに行く
アカウント作成
プロジェクト作成（プロジェクト一覧から）
請求アラート作成（お支払い-> 予算とアラート）
[料金見積もり](https://cloud.google.com/products/calculator/?hl=ja)
CloudShell（ナビゲーションのアイコンをクリック）

## GCE
これがサーバです。

#### インスタンス作成
リージョンとサーバスペックを選択、HTTPを許可

#### パッケージインストール
SSHで開く（ブラウザウィンドウ）

```
sudo apt-get update
sudo apt-get install -y apache2
sudo apt-get install -y php
php -v
sudo systemctl start apache2 // サービス起動
ps -aux | grep apache // プロセス表示
```

#### 外部IPからアクセス

/var/www/html/index.php の変更

#### スナップショット（増分）
スナップショットを作成
詳細から「インスタンスを作成」ボタンで復元

#### エフェメラルIP
インスタンスを停止、起動するとIPが変わってしまう
「VPCネットワーク - 外部IPアドレス」エフェメラル->静的

## GCS
ストレージです。

#### バケットの作成
Storage - ブラウザ - バケットの作成
アクセスする頻度によってリージョン、ストレージクラスを決める
Multi,Dual,Regional
Sdandard,Nearline,Coldline,Archive（あとから変えられる）
権限
オブジェクトライフサイクル - 古いものをColdlineに移動など

ファイルをアップロード
ファイルを公開 - 権限の編集 - Public（一般公開）

#### GCSとGCEをマウント
一般公開せずに、GCEのコンピュータ内にGCSをマウントしアクセスさせる。
サービスアカウントを変更するためGCEを一旦停止する
GCEのインスタンス詳細から編集
アクセススコープ - 各APIにアクセス権設定 - ストレージ（フル）

gcsfuseをインストール
https://github.com/GoogleCloudPlatform/gcsfuse/blob/master/docs/installing.md
gcsfuseを使う
https://github.com/GoogleCloudPlatform/gcsfuse

GCEの中にマウント先のフォルダを作り、マウントする
sudo mkdir storage（/var/www/htmlの中）
sudo gcsfuse -o allow_other udemy-study-2020-1205 /var/www/html/storage
中にstorageのファイルが出たか確認

#### インスタンス再起動でマウントが外れないようにスクリプトを設定

カスタムメタデータに下記を追加

```
#! /bin/bash
sudo gcsfuse -o allow_other udemy-study-2020-1205 /var/www/html/storage
```

## CloudSQL

データベースです。Mysql, Postgres, SQLServerなどが使えます。

SQL - Mysql - インスタンス作成 - リージョン - DBバージョン - マシンタイプ
データベースの作成 - CloudShellを使用して接続 - Shellにコードが出るのでEnter - メッセージの通りCloud SQL Admin APIを有効化
rootパスワードを入力してログイン

### GCEからCloudSQLへ接続
https://cloud.google.com/sql/docs/mysql/connect-compute-engine
やり方: パブリックIPを使う、他にもプライベートIP、CloudSQLProxyを使うやり方
GCEのIPを許可する: GCEの外部IPをコピー、SQLの承認済みネットワークに追加
34.97.112.139

GCEでShellを起動しクライアントインストール

```
sudo apt-get update
sudo apt-get install -y mariadb-client
```

CloudSQLのIPを指定し接続する

```
mysql -u root -h xxx.xxx.xxx.xxx -p
```

phpからアクセス

```
sudo apt-get -y install php-mysql
sudo systemctl restart apache2
```

## InstanceGroup
インスタンスの自動増減でき、最小最大、基準となるCPU使用率などを設定

#### GCEのインスタンスからイメージの作成
もととなるインスタンスを停止 - もととなるソースを選択 - ディスク - インスタンスを選択

#### インスタンステンプレートの作成
マシンタイプなどのインスタンスプロパティ
https://cloud.google.com/compute/docs/instance-templates/?hl=ja
作成 - マシンタイプ選択 - ブートディスクを変更 - 作成したイメージを選択 - その他設定

#### インスタンスグループの作成
作成 - 作成したインスタンステンプレートを選択 - 自動スケーリング指標、最小、最大を設定
インスタンスを消したら新しいインスタンスが自動で復活する

#### CloudSQLにアクセス
インスタンスごとに違うパブリックIPを許可してられないのでプライベートIPを使う
同一リージョン、同一プロジェクトのみ接続可

SQL - プライベートIPを有効化 - 割り当てて接続 - 保存（時間がかかるので待ってブラウザ更新）
GCEに接続 - ソースをプライベートIPに変更 - イメージ、テンプレートの作り直し - 
インスタンスグループの更新 - ローリング再起動/置換 - オペレーション置換（一台ずつ置き換えなど）

## CloudLoadBalancing
負荷分散をする（HTTP、TCP、UDPなど）

#### HTTP負荷分散
ネットワークサービス - 負荷分散 - ロードバランサの作成 - HTTP負荷分散 - インターネットからVM
バックエンドサービスの作成 - インスタンスグループ（作ったグループ） - ポート80 - 使用率で割り振る - ヘルスチェックを作成（異常なインスタンスには割り振らないように）
ホストとパスのルール - そのまま（ホストとパスによって違うバックエンドに転送できる）
フロントエンドの構成 - そのまま

作成されたら、フロントエンドのIPポートにアクセス（完了でもロードバランサの起動に時間がかかる印象）

#### 確認
起動中のインスタンスのデータをわざと変え、違うデータが表示されるか

## CloudDNS
ドメインからロードバランサにアクセスする

#### DNSゾーンの作成
ネットワークサービス - CloudDNS - ゾーンの作成 - ゾーン名、取得したDNS名を入力
（GoogleAPIライブラリのCloudDNSAPIを有効化しないとエラー）
ネームサービス側の設定にGCPのタイプNSのデータを追加
レコードセットの追加 - タイプはA、キャッシュ時間の設定、ロードバランサのIPを追加

## CloudFunction

#### 関数を作成
関数を作成 - リージョン - 割当メモリ - ソースを書くorアップロード - 最初に実行される関数（エントリポイント）を選択
発行されたURLにアクセスすると実行される（未認証を許可した場合）or 詳細からテストを実行
ソース中身を変えた場合、バージョンを変えないと反映されない

#### CloudSQLにアクセス
Proxyを使ってアクセスできるようにする
CloudSQLでパブリックIPを有効にする
nodejsにmysqlパッケージを入れ、接続名を使って接続

## 後片付け
AWSはいちいちインスタンスを落とす必要があるが、GCPはプロジェクトごとにシャットダウンし課金を止められる

IAMと管理 - 設定 - シャットダウン


## 参考

[現役エンジニアが教える、手を動かして学ぶGoogle Cloud Platform(GCP) 入門](https://www.udemy.com/course/google-cloud-platform-gcp/)