GCPを使ったウェブサーバー（nginx）の構築入門

[CYBIRD Advent Calendar 2023](https://qiita.com/advent-calendar/2023/cybird) 10日目担当の @moffunnya です。
9日目は @chikako_ikeda さんの「NFCリーダーアプリで読み取れる限界をさぐってみた」でした。
NFCカードとリーダーアプリの間に布を交代で挟んでいって読み込まれなくなったら負けゲームとかやりたいですね。
是非こちらも合わせてご覧ください！

## はじめに
2022年に新卒入社し、現在はインフラチームで環境構築、運用をしております。
普段、AWSと触れ合う機会が多く仲良くなってきた感覚があるのですが、GCPとはまだ仲良くなれていないので、簡単そうなところから距離を縮めていこうと思い、今回はGCPでウェブサーバーを構築していきます。
GCPを学び始めた方は一緒に頑張りましょう！

## 概要
本記事はGCPの軽い説明から環境の削除まで、以下の流れで進んでいきます。
- GCPとは
- 基本習得
- 準備
- ウェブサーバー構築：GCE
- nginxインストール
- クリーンアップ

## GCPとは
GCPとは、Google Cloud Platformの略で、Googleが提供するクラウドコンピューティングサービスです。
Googleが提供しているGmail、Googleカレンダー、YoutubeなどがGCPで構築されています。
類似サービスとしてAmazonが提供しているAmazon Web ServiceやMicrosoftが提供しているAzure等があります。
複数のクラウドサービスを扱えると、障害等でサービス自体が使えなくなってしまった際に、レプリケーション等で難を逃れられるかもしれないので、個人的に学んでおこうと思いました。

## 基本習得
進めていくにあたり、これらの用語を抑えていきましょう！
| 用語 | 説明 |
| ---- | ---- |
| ユーザー | 利用する人、Googleアカウントを保有する個人 |
| プロジェクト | GCPのリソースが紐づく単位 |
| 請求先アカウント | １プロジェクトに対して適用できる課金管理用アカウント |
| リージョン | Googleが保有する物理サーバーが配置されている地域 |
| ゾーン | リージョン内で分けられた区域 |

## 準備
事前に用意するものとして、3つ挙げられます。
- Googleアカウント
- クレジットカード
    - 今回は無料枠内で使用するので料金は発生せず、認証用として使用します。
- Google Chrome
    - ダウンロード：https://www.google.com/intl/ja_jp/chrome/

これらを用意できましたら以下の流れで準備を進めていきます。
- GCPアカウント作成
- プロジェクト作成
- 予算とアラート設定

### GCPアカウント作成
最初に、GCPアカウントを作成していきます。

https://cloud.google.com/free?hl=ja

上記ページにアクセスしていただき、「無料で開始」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/9757b64b-c7a0-0005-e653-90737d0cb5bd.png)

「同意して続行」をクリックします。（最新情報に関する通知メールのチェックは任意です。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/2822b018-5ff5-5f19-f477-1de212c3b6bd.png)



「アカウントの種類」を「個人」に設定しお支払方法を入力します。
問題なければ「無料で利用開始」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/1ea3695c-dcc0-441a-198b-38f682a28e00.png)

「ようこそ、○○さん」と出力され無料利用が開始されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/6b124f1b-9708-4d53-ae15-b21f3655506c.png)



### プロジェクト作成
GCPアカウント作成ができましたら次にプロジェクトを作成していきます。
画面左上に「My First Project」とあるので「▼」をクリックし、出力されたウィンドウで「新しいプロジェクト」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/0b73b2a1-0de2-c156-d739-c1cdf6d56259.png)


「プロジェクト名」に「larning-for-gcp」（※任意）と入力し「作成」をクリックします。　

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/27838053-dbb8-c09e-cf5a-0d8c1e9d7f31.png)


先ほどのプロジェクト選択画面に作成したプロジェクトが出力されているので、名前の部分をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/850788d4-9bfd-5495-c484-4eb12aec2b4b.png)

左上のプロジェクト名が作成したものに切り替わっていたらプロジェクトを選択できています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/b05c7f36-d38e-5884-70aa-d3032ee8895e.png)


今回の記事の内容はこのプロジェクト内で進めるようお願いいたします。

### アラートの設定
次にアラートの設定です。
予期しない費用に気付けるよう、ある程度のクレジットを消費した際にアラートを発火させるよう設定していきます。

左上からメニューを開き「お支払い」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/657cb0e6-3af6-c7d6-b4de-79a7f5db01b7.png)


「予算とアラート」から「予算を作成」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/96f0116d-78a0-1561-15e4-4c81c55f559a.png)


名前を「Cost Alert」（※任意）と入力し「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/bc569d89-edb2-7110-94d2-37d2014417a2.png)


予算タイプは「指定額」（デフォルト）とし目標金額をここでは2000円(※任意)で設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/3232ef32-088d-e90b-a498-ef75a3a41025.png)

消費している費用が「予算の割合」の金額に達した場合メールにてアラートが届きます。
通知の管理はデフォルトのままで「終了」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/6ccea5f6-4e92-d100-c52d-d95a71e92db9.png)



こちらで準備完了です。

## ウェブサーバー構築：GCE
いよいよ実際にGCPのサービスを使ってサーバーを構築していきます。
ここで使用していくサービスはGoogle Compute Engine（GCE）です。
GCEはGCPが提供する仮想マシンが利用できるサービスです。

### 仮想マシン起動
早速仮想マシンを起動していきます。

メニューから「Compute Engine」→「VMインスタンス」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/85469121-0fb1-d083-caa7-349743b75a15.png)


「Compute Engine API」の詳細が出力されるので「有効にする」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/c85946e7-c8f8-6224-2856-e9f53b588c81.png)

VMインスタンスのページが出力されるので「インスタンスを作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/b20c25f6-5a41-bf94-d9d1-8ee5b165932c.png)

「名前」「リージョン」「ゾーン」「マシンタイプ」をそれぞれ以下で設定します。
- 名前：web01
- リージョン：asia-northeast1(東京)
- ゾーン：asia-northeast1-a
- マシンタイプ：e2-micro
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/037909f0-4708-32c6-835c-6b826832f828.png)

少し下へ進み、ブートディスクの「変更」を選択すると設定画面が出力されます。
OSを「CentOS」、バージョンを「CentOS 7」に設定し「選択」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/a0a3a16c-862a-a8ca-82a6-97e044742844.png)


ファイヤーウォール内の「HTTP トラフィックを許可する」「HTTPS トラフィックを許可する」それぞれにチェックを入れ「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/fe94d6ce-8ec6-6c80-37b8-f313b93da0bb.png)

作成には数分場合がありますが無事作成されれば一覧に表示されます。
早速作成した仮想マシンに入ってみましょう！
「SSH」から該当のマシンに接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/542cd361-6919-48ca-d5f5-73980d1c3675.png)


別ウィンドウが開き、少し待つと「承認」ポップアップが出力されますので、「Authorize」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/6ff27093-1b8b-1b2d-5e01-03793d351ba0.png)

作成した仮想マシン内がコマンドラインで表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/93332699-d0ed-7bbe-847e-3ec39160d16a.png)

## nginxインストール
表示されたコマンドラインからnginxをインストールしていきます。
初めにパッケージをアップデートします。
```html:コマンド
sudo yum -y update
```
「Complete！」と出力されればOKです。

次にリポジトリを追加していきます。
viコマンドで`nginx.repo `ファイルを作成します。
```html:コマンド
sudo vi /etc/yum.repos.d/nginx.repo
```
作成したファイルに以下の内容を書き込みます。
```html:nginx.repo内
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
```
`nginx.repo `ファイルが作成されているか確認します。
```html:コマンド
cat /etc/yum.repos.d/nginx.repo
```
```html:出力内容
[moffunnya00@web01 ~]$ cat /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
```
次にリポジトリを初期化し読み込んでいきます。
```html:コマンド
sudo yum clean all
```
次にリポジトリを読み込みます。
```html:コマンド
sudo yum repolist all
```
続いてnginxをインストールしていきます。
```html:コマンド
sudo yum install nginx
```
「Complete！」と出力されていればOKです。
インストールの確認をします。
```html:コマンド
nginx -v
```
バージョンが出力されていればOKです。

続いてnginxを起動していきます。

```html:コマンド
sudo systemctl start nginx
```
nginxの起動を確認します。
```html:コマンド
sudo systemctl status nginx
```
Activeが`active(running)`になっていればOKです。

現状だと仮想マシンを停止・起動した際にnginxを手動で起動しなければいけないので、自動で起動するよう設定します。
```html:コマンド
sudo systemctl enable nginx
```
自動起動が設定されているか確認します。
```html:コマンド
systemctl is-enabled nginx
```
`enabled`と出力されていればOKです。


最後にブラウザから確認します。
仮想マシン一覧に出力されている作成した仮想マシンの外部IPを控えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/97d132da-dce2-48ae-a72a-46163c30c256.png)
外部IPの語尾に`:80`を付けてChromeからアクセスします。
例）XX.XXX.XX.XX:80
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/7c587641-fd57-7149-9d5c-3b38b9935bd9.png)
ウェルカムページが出力されればウェブサーバー構築完了です！！

## クリーンアップ
最後に作成したリソースを削除していきます。
メンテナンスを行わないリソースを放置しておくとセキュリティ上よくないので、最後に削除しましょう。

仮想マシンの一覧から作成したインスタンスを選択し「削除」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/a058e96f-1da2-ddc9-5987-187415ec7b36.png)

ポップアップが出力されるので「削除」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/2a7346ef-a118-c548-9ada-1c83534660de.png)

仮想マシンの一覧から作成したインスタンスが消えていれば削除完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983941/46f520d8-76d3-a1b9-c3eb-450350f4e102.png)

お疲れ様でした！！

## さいごに
業務でAWSに触れている状態でGCPに触れると、頭の中で「これはAWSのあれか～」的な変換をしてしまうのですが、変換する癖がつく前に直接直感的に扱えるようになっておいた方がいいかもしれないなと思いました。
また、無料利用期間が90日間になっているので、GCPの他のサービスについても触れてみてください！！

[CYBIRD Advent Calendar 2023](https://qiita.com/advent-calendar/2023/cybird) 11日目は @cy_yusuke_ito さんの「MongoDBからMySQLへのEmbulkを使った移行」です。
お楽しみに！