Google Cloudインフラ構築ハンズオンやってみた

# 概要

弊社ではシステムのインフラにGoogle Cloudを使用し、Terraformで管理しています。
ですが私はTerraformはおろかGoogle Cloudについも全然知らないしよくわかってないので、とりあえずコンソールを触ってお勉強するところから始めようと思います。
本記事はお勉強の:memo:です。
目的はGoogle Cloudのコンソールを触ることと、機能や概要についてなんとなく知ることになります。

## 参考書

[Amazon Web Services 基礎からのネットワーク＆サーバー構築](https://www.amazon.co.jp/Amazon-Web-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%EF%BC%86%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89-%E6%94%B9%E8%A8%823%E7%89%88-%E5%A4%A7%E6%BE%A4-ebook/dp/B084QQ7TCF)を使用しました。
本書はAWSでの簡易的なシステムインフラの構築をハンズオンで学べる形式となっている書籍です。
本書で紹介されているシステムインフラの例を、Google Cloud上で構築してみました。

## やること

- パブリックサブネット作成
  - サーバーを構築
  - サーバーにWebサーバーソフトインストール
  - WordPressインストール
- プライベートサブネット作成
  - サーバー構築
  - NAT構築
  - DBソフトインストール
- ブラウザから構築したブログにアクセス

## 準備

まずは利用登録をしていきます。
Google Cloudのコンソールページにアクセスします。
https://console.cloud.google.com/welcome/
![SnapCrab_NoName_2023-7-29_15-13-33_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/b6c4c13d-8f05-7fc9-ed11-c7d72b5a4f59.png)

90日間300$分の無料トライアルに加え、無料でアクセス可能なサービスもあります。
https://cloud.google.com/free/docs/free-cloud-features?hl=ja

登録に必要な情報を入力して無料トライアルに登録します。

### プロジェクトについて

プロジェクトはGoogle Cloudのリソースがまとまった単位のこと。
https://cloud.google.com/storage/docs/projects?hl=ja#what_is_a_project
デフォルトで[My First Project]が作成されているので、これをそのまま使用します。

### AWSとの比較

参考にする書籍がAWSのものなので、Google Cloudのサービスに読み替えてハンズオンを進めていきます。
ありがたいことにGoogle側がサービスの対応表を用意してくれているので、これも参考にしていきます。
https://cloud.google.com/free/docs/aws-azure-gcp-service-comparison?hl=ja

## パブリックサブネット作成

コンソール画面上部にある検索窓で「VPC」と入力して、`VPCネットワーク`のサービスのページを開きます。
「データを読み込めませんでした」というアラートが出るので、「続行」をして対応します。
![SnapCrab_NoName_2023-7-29_15-25-37_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/6d4923e1-4162-16be-4d0a-3789e63d9b4d.png)

`Compute Engine API`を有効にしてくださいとのこと。
そもそもGoogle Cloudは`Google Cloud APIs`というAPI郡によって成り立っていて、各APIを有効にすることでそのAPIに属するサービスを利用できるということでした。
https://cloud.google.com/apis/docs/overview?hl=ja

`Compute Engine API`を有効にします。
![SnapCrab_NoName_2023-7-29_15-25-49_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/24858dd2-71ab-eecd-4dc4-c3d88358b202.png)

APIを有効にすることで`VPCネットワーク`を利用できます。
利用開始時点でdefaultと名がついたVPCが用意されています。
![SnapCrab_NoName_2023-7-29_15-27-49_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/e13a0e89-214b-af89-bf10-37daee796e4a.png)

新しくネットワークを作成し、そこにサブネットを追加していきます。
とりあえず名前は「vpc-area」にしました。
![SnapCrab_NoName_2023-7-29_15-39-49_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/a0926cac-22ee-cddb-d90d-b6369ca92df9.png)

サブネットの項目でサブネット作成モードのカスタムをチェックし、新しいサブネットを作成します。

- 名前: public-subnet
- リージョン: asia-northeast1(作成時のスクショはにasia-east1だが台湾であることを知らずに設定したため。なんとなく東京にしておきたかったのであとで編集しました)
- IPスタックタイプ: IPv4
- IPv4範囲: 10.0.1.0/24
- 限定公開のGoogleアクセス: オフ
- フローログ: オフ
![SnapCrab_NoName_2023-7-29_15-40-23_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/86789db3-f847-cbc0-8a2b-1864aeb76c32.png)

ファイアウォールの設定はいったんデフォルトで用意されているプロトコル/ポートがallのものを設定しました（あとで修正しました）
![SnapCrab_NoName_2023-7-29_15-48-32_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/33d20e0d-8ddc-e2ab-0c21-3788a68bae9a.png)

上記内容でとりあえず作成。
![SnapCrab_NoName_2023-7-29_15-49-47_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/9c10f111-4d65-2f49-8bce-d60ea8d24376.png)
![SnapCrab_NoName_2023-7-29_15-50-5_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/067b48ef-95f6-cee3-e990-74b3bf0c236a.png)

これでパブリックサブネットの作成自体は完了です。

### インターネットゲートウェイ

左側のメニューのルートから確認できます。
デフォルトのものが用意されるのでこれをそのまま使いました。

![SnapCrab_NoName_2023-7-29_15-58-46_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/5d62655f-c209-8726-d3bb-75c4e1213abd.png)
![SnapCrab_NoName_2023-8-19_17-30-33_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/e5c90d49-d575-9a04-8d3a-40d45473a53a.png)

## サーバー構築（その1）

コンソール画面上部にある検索窓で「サーバー」とか「Compute」とか入力して、`Compute Engine`のサービスのページを開きます（検索窓をクリックすると人気キーワードのサジェストでも出てきます）
インスタンスを作成していきます。
![SnapCrab_NoName_2023-7-29_16-2-55_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/efd33021-709c-740a-5761-dbd938fad207.png)


- 名前: web-server
- リージョン: asia-northeast1
- マシンの構成: E2
- マシンタイプ: プリセット
![SnapCrab_NoName_2023-7-29_16-12-16_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/f9c56c84-f326-1a2e-61f9-2202a207b548.png)

とりあえず触ることが目的なのでマシンのスペックとかは気にしません。
ブートディスクもデフォルトのままです。

ここでもファイアウォールの設定ができるので、`HTTP トラフィックを許可する`, `HTTPS トラフィックを許可する`にそれぞれチェックを入れておきます。
![SnapCrab_NoName_2023-7-29_16-12-26_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/d1a89160-8567-498c-0d11-67449784296e.png)

詳細オプションを開き、ネットワークの設定をします。
ネットワークインターフェースがデフォルトのものになっているので、先程作成したサブネットを追加するようにします。

![SnapCrab_NoName_2023-7-29_16-12-40_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/a6419c63-4950-e5d0-4a6f-cdf7ba4b0628.png)

- ネットワーク: vpc-area
- サブネットワーク: public-subnet
- プライマリ内部 IPv4 アドレス: エフェメラル（カスタム）
- カスタムのエフェメラル: 10.0.1.10
- ネットワークサービスティア: スタンダード
![SnapCrab_NoName_2023-7-29_16-14-49_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/46265bb5-c02e-624d-77b9-64ede8c5f779.png)

上記内容で作成。
![SnapCrab_NoName_2023-7-29_16-18-53_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/5a3f36bc-a21d-64b3-c826-3aee27e2c22b.png)

## ファイアウォール設定見直し

サブネットを作成する際にプロトコル/ポートがallのファイアウォールを設定していたので、これを修正します。
インスタンス作成時のhttp, httpsとsshのみを許可するように設定を変更します。

VPCネットワークの詳細画面 -> ファイアウォール -> ファイアウォール ルールを追加でsshのルールを追加します

- 名前: vpc-area-allow-ssh(初回作成時にスクショ撮り忘れたので名前重複エラー)
- ログ: オフ
- ネットワーク: vpc-area
- 優先度: 1000
- トラフィックの方向: 上り
- 一致したときのアクション: 許可
- ターゲット: 指定されたターゲットタグ
- ターゲットタグ: ssh
![SnapCrab_NoName_2023-8-19_18-51-21_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/92c0befc-eec4-2d3d-47bd-2d8e435d3a18.png)

インスタンス作成でhttp, httpsを許可するファイアウォールを設定すると, ネットワークタグのところに`http-server`, `https-server`というタグが追加されます。
タグで紐づけするのねということで`ssh`という名前のタグでファイアウォールを先程作成したインスタンスに同様に紐づけします。
https://cloud.google.com/firewall/docs/tags-firewalls-overview?hl=ja

- プロトコルとポート: 指定したプロトコルとポート
- TCPにチェック
- ポート番号: 22
![SnapCrab_NoName_2023-8-19_18-56-44_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/67a3f161-0b03-7543-e3cd-939ebadfdaf2.png)

これでルールを追加作成。
![SnapCrab_NoName_2023-8-19_18-48-45_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/008a67f4-2745-65dd-22d5-a1f29dc42ecf.png)

`Compute Engine`のサービスのページのサービスに戻り、インスタンスの編集でネットワークタグを追加します。
![SnapCrab_NoName_2023-8-19_18-59-12_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/a302f17b-0ea7-0bbd-ae2f-b769593e8b33.png)

これでファイアウォールの修正は完了です。

## SSH接続

インスタンス一覧にある`SSH`をクリックすることでブラウザからSSHができます。便利！
https://cloud.google.com/compute/docs/ssh-in-browser?hl=ja

`Authorize`をクリックして続行
![SnapCrab_NoName_2023-8-19_19-8-16_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/4585bf23-8382-82cd-43d8-30fef6ac44d7.png)

接続完了。
![SnapCrab_NoName_2023-7-29_16-45-51_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/1d7902a3-1060-3ed6-ca28-aa65b4ca4940.png)

## Webサーバーソフトインストール

ブートディスクをデフォルトで作成したらDebian GNU/Linux 11 (bullseye)だったので、参考書とは異なりaptでインストールします。
```shell
sudo apt install apache2
```
Apaccheを起動させます。
```shell
sudo systemctl start apache2
```
`http://自動で設定された外部IP`でページを開きます。
![SnapCrab_NoName_2023-8-19_19-50-4_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/13ae6244-ddd9-2b19-ca9f-c2c6a7a1dad4.png)

## プライベートサブネット作成

VPC ネットワークの詳細 -> サブネット -> サブネットを追加 からサブネットを作成します。

- 名前: private-subnet
- IPv4範囲: 10.0.2.0/24
![SnapCrab_NoName_2023-7-29_19-11-49_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/876f26ca-0d5a-4afc-daa8-12aab9f1a09b.png)

## サーバー構築（その2）

サーバー構築（その1）でやった手順とほぼ一緒の設定です。
名前はdb-serverにしました。
インターネットからのアクセスを制限させるため、ファイアウォールの設定にある`HTTP トラフィックを許可する`, `HTTPS トラフィックを許可する`にはチェックを入れません。

ネットワークインターフェースは先程作成したプライベートサブネットを指定します。
カスタムのエフェメラルIPv4アドレスは10.0.2.10です。
また外部IPv4アドレスは、なしを指定します。
![SnapCrab_NoName_2023-7-29_19-25-18_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/8bd3485c-6732-4453-8e33-a2ff6508fd14.png)

これで作成完了です。

## DBサーバーに接続

### ファイアウォールのルール追加
先程作成したインスタンスにアクセスするために、WebサーバーからのSSHだけ許可するようなファイアウォールのルールを追加します。

![SnapCrab_NoName_2023-8-19_20-12-53_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/eecce243-3036-d1e4-e205-551e37ddd798.png)

`internal-ssh`という名前のターゲットタグを作成したので、これをDBサーバーに設定します。

## 踏み台インスタンスからSSH

Webサーバーを踏み台インスタンスとしてDBサーバーにSSH接続します。
gcloudのコマンドを使用しました。
https://cloud.google.com/compute/docs/connect/ssh-using-bastion-host?hl=ja#console

```shell
gcloud compute ssh db-server --internal-ip
```
![SnapCrab_NoName_2023-8-19_20-18-24_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/5cae5049-0de5-1cc9-e085-578c15a42d78.png)
初回アクセスの際はパスフレーズの設定があります。

## NAT作成

DBソフトをインストールしたいので、プライベートサブネット -> インターネットの通信を行うためのNATを作成します。
上部検索窓に「NAT」と入力し`Cloud NAT`のサービスを選択します。
https://cloud.google.com/nat/docs/overview?hl=ja

- 名前: cloud-router(なんでこの名前にしてたのか謎。nat-gatewayとかのほうがいい)
- ネットワーク: vpc-area
- リージョン: asia-northeast1
![SnapCrab_NoName_2023-8-5_16-23-53_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/83d9223f-d884-3786-c998-857d9c2e999e.png)

> Cloud Router に NAT ゲートウェイを構成します。

`Cloud NAT`の説明にある通り、Cloud Routerも作成します。
NAT作成ページ、Cloud Router -> 新しいルーターを作成から作成可能です。
名前だけ設定して作成し、作成したCloud Routerを設定します。
![SnapCrab_NoName_2023-8-5_16-24-28_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/ec894230-2a24-c56c-a9de-32ab6387591b.png)

プライベートサブネットのみに適用させます。
- ソース:カスタム
- サブネット名: private-subnet
- IP範囲1: すべて
- Cloud NAT IPアドレス: 自動
- ネットワークサービスティア: スタンダード
- 高度な構成: 特にいじらず
![SnapCrab_NoName_2023-8-5_16-26-15_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/3a03c9e6-de09-576a-5015-cd62f1f8b63c.png)

上記内容で作成。

### DBサーバー -> インターネット

DBサーバーに接続し、適当にgoogleに疎通確認してみます。
```shell
curl www.google.com
```
![SnapCrab_NoName_2023-8-5_16-51-40_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/d3d7891a-294b-2d1a-c982-d21cb14a99e9.png)

## DBソフトインストール

参考書と同様にMariaDBを使用します。

```shell
sudo apt install mariadb-server
```

MariaDBの初期設定もします。以下参考↓
https://www.digitalocean.com/community/tutorials/how-to-install-mariadb-on-ubuntu-20-04-ja#2-mariadb

参考書の通り、rootでDBにログインします。
```shell
mysql -u root -p
```

WordPress用のデータベース、ユーザーを作成します。
```sql
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

grant all on wordpress.* to wordpress@"%" identified by 'wordpresspasswd';

flush privileges;
```

## WordPressインストール

### PHPインストール
WebサーバーにWordPressをインストールします。
WordPressがPHPで動くためPHPとその他必要なモジュールをインストールします。

```shell
sudo apt install -y php
sudo apt install php-mbstring
sudo apt install php-mysql
```

### Webサーバー -> DBサーバー上のMariaDBへの疎通確認

参考書と同様にDBサーバー上のMariaDBへの疎通確認を行うため、WebサーバーにもMariaDBをインストールします。

```shell
sudo apt install mariadb-server
```

ファイアウォールのルーツを追加して、ターゲットタグをDBサーバーに追加します。
![SnapCrab_NoName_2023-8-5_17-41-8_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/febcd8df-d71e-e550-896b-96879080ca21.png)
![SnapCrab_NoName_2023-8-5_17-41-54_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/64f6c7ce-7f06-c54d-7801-0c81ab7e44bb.png)

疎通確認をしていきます。
```shell
mysql -h 10.0.2.10 -u wordpress -p
```
![SnapCrab_NoName_2023-8-5_18-13-15_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/342a48e5-df71-c0eb-6da1-8e01d2151e59.png)

### WordPressインストール

参考書通りにWordPressをインストールしていきます。
```shell
cd ~
wget https://ja.wordpress.org/latest-ja.tar.gz

tar xzvf latest-ja.tar.gz 

cd wordpress/
sudo cp -r * /var/www/html/

sudo chown www-data:www-data /var/www/html/ -R
```

この状態でブラウザから`http://自動で設定された外部IP`を開いても、まだApacheのデフォルトページのままです。
Apacheのデフォルトページが残っているので、これを移動なり削除なりしておきます。

```shell
sudo mv /var/www/html/index.html ~
```

これでWordPressの初期設定画面が表示されるようになりました。

## WordPress初期設定

`http://自動で設定された外部IP`を開き、初期設定を進めていきます。
データベース情報を入力、インストール実行、サイトタイトルや管理者情報を入力していき初期設定が完了します。

無事、管理画面とブログを開くことができました。
![SnapCrab_NoName_2023-8-5_18-55-52_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/860472bf-0bb0-e2ed-0009-589877195fa7.png)
![SnapCrab_NoName_2023-8-5_18-56-39_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392448/59a634ea-0e6c-4881-ebec-fa50e3cb692d.png)

# おしまい

当初の目的通り、Google Cloudのコンソールを触り機能や概要についてなんとなく知って、親しみを覚えることができたのではないかと思います。
まだまだ知らない・わからない機能も多いですし、業務で使えるスキルには結びついてないので、引き続きお勉強していきます:muscle:
無料で使えるクレジットも200円分ぐらいしか使ってなくて43000円分ぐらい残っているので、この機会に触っておきたいですね。