認定試験ガイド（公式）を通してGCPに入門してみる

# 【この記事の目的】
Associate Cloud Engineer資格取得のための公式にある「[認定試験ガイド](https://cloud.google.com/certification/guides/cloud-engineer/?authuser=0&hl=ja)」を通してGCPの理解を深める

# 【対象とする人】
- GCP聞いたことあるけど触ったことないよ！って人
- 他のクラウドベンダーが提供するサービス使ったことあるけどGCP触ったことないよ！って人
- GCP勉強したいけどどこから勉強したらええんやろ！って人

# 【注意】
本記事は↓参考資料をもとに個人的にざっくりまとめた内容になってます。
ちゃんとした解釈や説明は公式ドキュメントを参照してください。

# 【参考資料】
[Google Cloud 入門ガイド(公式)](https://cloud.google.com/resource-manager/docs/how-to?hl=ja)

# 【全体の流れ】
[認定試験ガイド](https://cloud.google.com/certification/guides/cloud-engineer/?authuser=0&hl=ja) にある通りの流れでやりますが、
そのまま記事にするとちょっと長いので分割します。

# 【やってみよう】
## 1. クラウド ソリューション環境の設定
### 1.1 クラウド プロジェクトとアカウントを設定する

GCPに初めてログインするとまずこんな画面が表示されます。
<img width="1178" alt="no1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/f2be8f67-65dd-458d-815f-741ef4a39dac.png">


このままいきなりインスタンスやらFunctionを作るのではなく、まずは「**プロジェクト**」を作成する必要があります。
「プロジェクトとはなんぞや」というのは、公式に以下のように記載されてます。
> Google Cloud Platform（GCP）プロジェクトは、
API の管理、請求の有効化、共同編集者の追加と削除、GCP リソースの権限の管理など、
すべての GCP サービスの作成、有効化、使用の基礎となります。
>
> *[プロジェクトの作成と管理](https://cloud.google.com/resource-manager/docs/creating-managing-projects?hl=ja&visit_id=637091473348877265-3695866265&rd=1) より抜粋*


イメージがつかない人もとりあえず進めていく内に理解できてくるかと思うので、まずは「プロジェクト」を作ってみることにしましょう！

#### ○ プロジェクトを作成する

プロジェクトの作成は至って簡単。
↓の順番でポチポチ行くとプロジェクト作成ページに飛びます。
<img width="1159" alt="no2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/a3c6db64-cc46-98ea-cfea-d90feff7acaa.png">


「組織」という項目がありますが、ここは一旦スルーして作成します。
そうするとダッシュボードに戻り、プロジェクトが無事作成されたことがわかります。
<img width="1168" alt="no3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/8573f86b-25ce-6eb8-e4dc-3c00145be065.png">


ちなみにコマンドだと↓の手順で作成できます。

```bash
# まずはGCPに登録しているアカウントの認証を通す
$ gcloud auth login
Your browser has been opened to visit:

    https://accounts.google.com/o/oauth2/auth?xxxxx
    # ↑のURLにアクセスして承認する

# その後にgcloudコマンドを使ってプロジェクトを作成する
$ gcloud projects create プロジェクトID
Create in progress for [https://cloudresourcemanager.googleapis.com/v1/projects/プロジェクトID].
Waiting for [operations/cp.xxxxx] to finish...done.              
Enabling service [cloudapis.googleapis.com] on project [プロジェクトID]...
Operation "operations/acf.xxxxxxxx" finished successfully.

```

#### ○ プロジェクト内に事前定義された IAM 役割へのユーザーの割り当て

さて、無事にプロジェクトが作成されたので、次はこのプロジェクトで開発/運用していくときのことを考えてみましょう。
AWSなど他のクラウドを利用してる人はイメージがつくかと思いますが、開発するにしろ運用するにしろ、メンバーの誰でも（リソース間も含む）どんなことでもできてしまうとセキュリティ上よろしくありません。
なので、リソースに対する必要なアクセス権のみを付与してあげることが重要です。

それを「**IAM（Identity and Access Management）**」という機能で制御することができます。
> IAM では、IAM ポリシーを設定して、誰（どのユーザー）に、どのリソースに対するどのアクセス権（役割）を付与するかを制御することができます。IAM ポリシーは、特定の役割をユーザーに付与することで、そのユーザーに特定の権限を付与します。
>
*[IAM を使用したプロジェクトのアクセス制御](https://cloud.google.com/resource-manager/docs/access-control-proj?hl=ja)より抜粋*

Cloud IAMでは定義済みの役割として↓のようなものが既に用意されているようです。([参照](https://cloud.google.com/resource-manager/docs/access-control-proj?hl=ja)より引用)
![no4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/261e0edb-2384-0d78-7a1d-b74886217745.png)



#### ○ Cloud Identity でのユーザーの管理（手動および自動）

では早速Cloud IAMにてユーザーを管理していきましょう。
Google CloudではIDでアクセス権を付与する対象のことを「**メンバー**」といい、それには以下のタイプがあるようです。詳細は[こちら](https://cloud.google.com/iam/docs/overview?hl=ja)を参照してください。
* Google アカウント
* サービス アカウント
* Google グループ
* G Suite ドメイン
* Cloud Identity ドメイン

[公式](https://cloud.google.com/iam/docs/overview)にわかりやすい図があったので引用させていただきます。
![public-img.png](https://cloud.google.com/iam/img/iam-overview-policy.png)

なお、今回は指定があるので「[Cloud Identity](https://cloud.google.com/identity/?hl=ja)」を利用して管理をしていこうかと思いましたが、自身がテスト用に取得しておいたドメインの有効期限が切れてしまっていた為アカウントが作れなかったので今回はちょっと見送ります。（申し込みの際にドメインが必要）

ちなみにCloud Identityをざっくり説明すると「ユーザー、アプリ、端末を一元管理できる企業向け管理サービス」といったところでしょうか。（※[公式](https://support.google.com/cloudidentity/answer/7319251?hl=ja)参照）
アカウント作成方法は↓のサイトさんがわかりやすくて参考になります。
http://www.tech-joy.work/article/464263812.html


メンバー追加は↓のようにコンソールから簡単にできます。
<img width="1174" alt="no5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/0000b3b6-2c7b-04fc-f0e4-3be3ad10a9e4.png">

<img width="1167" alt="no6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/ce5af61d-3722-3aae-b5e3-6d8ebcccf6d2.png">

メンバーの追加は↓のようにヘルプで入力例があるので、初めてでも迷わず追加することが可能です。

```
Google アカウントのメールアドレス: user@gmail.com
Google グループ: admins@googlegroups.com
サービス アカウント: server@example.gserviceaccount.com
G Suite のドメイン: example.com
```

ちなみにコマンドだと↓の手順で作成できます。

```bash
# この段階で追加するアカウントは「プロジェクトにメンバーを追加する」という扱いなので、iamではなくprojectsを指定している
$ gcloud projects add-iam-policy-binding プロジェクトID --member='user:Gmailならこの形式でメアド' --role='roles/editor'
Updated IAM policy for project [プロジェクトID].
bindings:
- members:
  - user:メアド@gmail.com
  role: roles/editor
- members:
  - user:メアド@gmail.com
  role: roles/owner
etag: xxxxx=
version: 1
```

#### ○ プロジェクトで API を有効にする

Google Cloud Platformでは[APIを利用してあらゆる機能を簡単に追加することができる](https://cloud.google.com/apis/docs/overview?hl=ja&visit_id=637092149260133040-2231135041&rd=1#monitoring-your-usage)ようです。
SDKコマンドラインツールやクライアントライブラリを使用して利用はもちろん、ウェブコンソール上でもこれを利用しているようです。
<img width="1172" alt="no7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/9068cc04-298e-6867-1825-3e4d34f04f8b.png">

例えばApp Engine SEを利用したいとします。
その場合は↓のように検索をして「有効化」すればそのサービスを利用することができます。
<img width="1168" alt="no8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/771f0010-7468-e640-5e0e-4e5db5036774.png">
<img width="1172" alt="no9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/10c4f08d-149e-4eaf-bd71-26dbbc53e806.png">

ちなみにコマンドラインだと↓のように追加します

```bash
# 既に有効化されたAPIを表示して、有効済みかどうかを確認
$ gcloud services list

NAME                              TITLE
bigquery-json.googleapis.com      BigQuery API
bigquerystorage.googleapis.com    BigQuery Storage API
cloudapis.googleapis.com          Google Cloud APIs
clouddebugger.googleapis.com      Stackdriver Debugger API
cloudtrace.googleapis.com         Stackdriver Trace API
datastore.googleapis.com          Cloud Datastore API
logging.googleapis.com            Stackdriver Logging API
monitoring.googleapis.com         Stackdriver Monitoring API
servicemanagement.googleapis.com  Service Management API
serviceusage.googleapis.com       Service Usage API
sql-component.googleapis.com      Cloud SQL
storage-api.googleapis.com        Google Cloud Storage JSON API
storage-component.googleapis.com  Cloud Storage

# app engineを追加したい場合、有効にできるサービスリストにあるかどうかを確認します
$ gcloud services list --available | grep appengine

appengine.googleapis.com                              App Engine Admin API
appengineflex.googleapis.com                          Google App Engine Flexible Environment

# 有効化する
$ gcloud services enable appengine.googleapis.com
Operation "operations/acf.xxxxxx" finished successfully.

# 確認
$ gcloud services list | grep app
appengine.googleapis.com          App Engine Admin API
```

#### ○ Stackdriver アカウントのプロビジョニング

前段階で利用するAPIを有効化したのでそのサービスを使うことができるようになりましたが、ここで一旦ホームのダッシュボードを確認してみましょう。
そうすると↓のようにAPIのリクエストが発生していることが確認できますね。
<img width="1178" alt="no10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/4ea42d8b-f2ed-f46a-9627-80c97e6f65b5.png">


Google Cloud PlatformではAPI使用状況に関する詳細な情報をモニタリングすることができます。
この情報は単にperformanceやtrafficのモニタリングに役立つだけでなく、ソフトウェアとGoogle サービスとの間の非効率的な相互作用を発見するうえでも役立つそうです。
> ほとんどの Cloud API は、API 使用状況に関する詳細なテレメトリを送信します。この情報は、全体的な消費量のトラッキングやパフォーマンスのモニタリングに役立つだけでなく、ソフトウェアと Google サービスとの間の非効率的な相互作用を発見するうえでも役立ちます。また、この情報から Google Cloud サービスが異常な動作をしているかどうかもわかります。さらに、問題をトラブルシューティングする際に Google によるサポートが必要な場合、この情報によって解決時間が大幅に短縮されることにもなります。
> 
*[API 使用状況のモニタリング](https://cloud.google.com/apis/docs/monitoring?hl=ja)より抜粋*

これらの API が提供する指標を表示できる場所として先程のようなAPIダッシュボードの他に「**[Stackdriver](https://cloud.google.com/stackdriver/?hl=ja)**」があります。
StackdriverはAWSで言うところのCloudWatchに該当します。

検索BoxでStackdriverを検索して移動すると、2-3分くらいで↓の画面が表示されるようになりました。
<img width="1179" alt="no11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/e9c3a639-6c5f-fd0f-bd39-11e53f2579a3.png">

これでStackdriverにWorkspaceが作成され、かつ先程までGCPで選択していたプロジェクトが紐付いてモニタリング対象となりました。
また、Workspaceには他のプロジェクトもモニタリング対象に含めることができ、↓のように設定することができます。
<img width="1174" alt="no12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/9afb36ca-21b1-4f63-b98b-b16bfc233a8d.png">

Stackdriverの詳しい説明は[公式ドキュメント](https://cloud.google.com/monitoring/docs/?hl=ja)や[参考となるサイト](https://www.topgate.co.jp/gcp15-what-is-google-stackdriver)などを読んでいただければと思います。


## 1.2 課金構成を管理する

#### ○ 請求先アカウントを作成する

さて、1.1でようやくサービスを作っていくための土壌が形になってきました。
次にすることはいよいよサービスを...ではなく、土地代を払うための請求先アカウントを作成しましょう。
請求先アカウントがない方はサイドメニューにある「お支払い」を踏めば↓のように表示されます。
<img width="1165" alt="no13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/0e7d1f85-509d-b079-86c7-bb171aac62f5.png">

作成自体はそんなに複雑なことはなく、画面の案内に従って情報を入力していけば問題なく作成できます。
<img width="1180" alt="no14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/e75e7e45-8364-1369-242c-73eb0bd6802f.png">

#### ○ プロジェクトを請求先アカウントにリンクする

請求先アカウントを作成しただけでは、請求先として登録されてません。
GCPでは「プロジェクト」という単位で管理しているという話を冒頭にしましたが、請求もプロジェクト単位で分けることができるようです。
なので、作成した請求先アカウントと対応するプロジェクトを紐付けて上げる必要があります。

これの方法も先程同様すごく簡単です。
「請求先アカウント管理」画面の「マイプロジェクト」から紐付けたいプロジェクトを選択して、請求先アカウントと紐付けて設定するだけです。
<img width="1175" alt="no15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/8f0ba834-ae07-bfa8-15e9-a522defbf717.png">

これで請求先アカウントとプロジェクトの紐付けができました！

#### ○ 課金の予算とアラートを設定する

設定が完璧でも実際の利用想定を超えて大幅に使われることはありますし、逆にプログラム上のバグで余剰にアクセスが増えることだってあります。
これを放置しておくと請求金額がとんでもないことになってしまいます。
たとえ正常に使われていたとしても、商用にしろ個人用にしろ予算は無限にあるわけではないので、予算以上の金額は払えません。

ということで、「課金の予算とアラート」は必ず設定しておいたほうがよい項目となります。

ただし、↓にもあるように予算を設定しても上限超えたからいい感じに制限してくれるとかはないようなので注意が必要です。

**注意**
> 予算を設定しても、API 使用量は制限されません。予算の目的は、アラート通知のトリガーのためであり、それにより利用額の傾向を時系列的に把握できます。予算アラートによって、費用を抑えるための措置を促されますが、予算額に達した場合やそれを超過した場合に、サービスの使用や課金ができなくなることはありません。費用の発生を防ぐために API 使用量の上限を設定する場合は、API 使用の上限設定をご覧ください。あるいは、プログラムによってプロジェクトの課金を無効にする方法で利用額の上限を設定することもできます。
> 
[予算アラートの設定](https://cloud.google.com/billing/docs/how-to/budgets?hl=ja)より抜粋

では「課金の予算とアラート」を設定していきます。
先程の「お支払い」一覧の中に「予算とアラート」というものがあるのでここから作っていきます。
<img width="1180" alt="no16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/2aca2835-6a4d-660f-00c4-ad2dcdcfac74.png">

アラートと予算の作成も簡単で↓のようにサクサクと作れます。
<img width="1176" alt="no17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/0f9c18f3-10ef-408e-f254-a6b34da77ed3.png">
<img width="1175" alt="no18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/5e912ba1-4cfa-c588-40a3-8809689407e5.png">
<img width="1182" alt="no19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/f155992c-b172-fcff-99b7-b3b60cb4ccf9.png">


#### ○ 日 / 月単位の料金見積もりを目的とする請求関連のエクスポートの設定

費用をモニタリング、分析するために課金データをエクスポートすることができます。
エクスポートする方法としては↓の２つがあるようです。
分析をしっかりとクエリでやるのであれば、BigQueryを利用するほうがよさそうですね。

* [BigQuery](https://cloud.google.com/billing/docs/how-to/export-data-bigquery?hl=ja)
* [Cloud Storage（ファイル）](https://cloud.google.com/billing/docs/how-to/export-data-file?hl=ja)

登録は↑を参考にすればできますが、UI上だけでも特に複雑な設定がいらないで設定ができます。
<img width="1172" alt="no20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/b9d7f7b4-0e5b-2bd5-cf67-557ae0497a1f.png">
<img width="1181" alt="no21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318649/d7962a5a-a276-9c40-89b9-27b00dc98beb.png">


ちなみに、どちらを選んでも[Always Free](https://cloud.google.com/free/docs/gcp-free-tier?hl=ja)の使用上限には抵触しなさそうなので、気兼ねなく試すことができます。


### 1.3 コマンドライン インターフェース（CLI）、具体的には Cloud SDK をインストールして構成する（デフォルト プロジェクトの設定など）。

これは今までの項目で中に並行して説明してたので↓以外は省略します。

```bash
# デフォルト プロジェクトの設定
$ gcloud config set project プロジェクトID
```


# 【まとめ】

これでサービスを作っていく土壌が完成しました！
しかし、認定試験ガイドの順番的には次がサービスではなく、「クラウド ソリューションの計画と構成」となっているので
次回はこちらに触れていければと思います。