Google Cloud Platform の VM を Cloud Source Repositories を使える状態で利用する

## はじめに

自宅で開発している時に Linux マシンが欲しくなることがあります。使い捨ての VM 環境としては Vagrant など自 PC 上で対応することも可能です。一方でクラウドの利点としては、OS イメージを手元のマシンに配置する必要がないことです。

ここでは Google Cloud Platform の VM インスタンスを使う手順を紹介します。VM を時々起動する程度であれば十分無料で使えます（念の為、公式の[GCPの無料枠](https://cloud.google.com/free/?hl=ja)をご参照の上ご利用ください）。

また、[Cloud Source Repositories](https://cloud.google.com/source-repositories/) というリポジトリも利用できます。せっかくなので、ソース類はこちらで管理するようにセットアップします。そうすれば、VM を使い捨てたとしても、ソース類をこちらに残せます。

流れとしては以下の通りです。

1. Cloud SDK のセットアップ
1. リポジトリ作成
1. サービスアカウントを作成
1. VM を起動
1. 利用後は VM を削除

## Cloud SDK のセットアップ

以降の手順では gcloud コマンドを使います。そのため、手元の PC で Cloud SDK を使える状態にする必要があります。導入手順は公式ドキュメントをご参照ください。

[Cloud SDK をインストールして初期化](https://cloud.google.com/sdk/docs/?hl=ja)


## リポジトリ作成

gcloud コマンドを利用できるようになったら、リポジトリを作成します。

```shell
$ gcloud source repos create リポジトリ名
```

## サービスアカウントの作成

サービスアカウントを使う目的は、VM 上から他のサービスを使えるようにすることです。今回のケースでは使いたいのは Cloud Source Repositories です。そのため、次の作業を行います。

1. サービスアカウントを作成
1. サービスアカウントに権限付与
1. VM にサービスアカウントを設定

まず、今後の作業のためにプロジェクトIDを環境変数にセットしておきます。

```shell
$ export PROJECT_ID=$(gcloud config get-value project)
```

サービスアカウントを作成します。

```shell
$ gcloud iam service-accounts \
    create gce-service-account \
    --display-name "gce-service-account"
```

サービスアカウントに source.writer 権限を付与します。

```shell
$ gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member serviceAccount:gce-service-account@${PROJECT_ID}.iam.gserviceaccount.com \
    --role roles/source.writer
```

[参考]

* [サービスアカウントへの役割の付与](https://cloud.google.com/iam/docs/granting-roles-to-service-accounts?hl=ja)
* [役割について](https://cloud.google.com/iam/docs/understanding-roles?hl=ja)

## VMインスタンスの作成

では、先ほど作ったサービスアカウントを設定しつつ VM を起動します。ここでは CentOS にしています。余談ですが下記のコマンドだと 20 秒かからず起動します。速い！

```shell
$ gcloud compute instances create my-centos \
  --image-family centos-7 \
  --image-project centos-cloud \
  --machine-type f1-micro \
  --preemptible \
  --service-account gce-service-account@${PROJECT_ID}.iam.gserviceaccount.com \
  --scopes cloud-source-repos
```

[参考]

* [インスタンスのサービス アカウントの作成と有効化](https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances?hl=ja)


## VM インスタンスに接続

VM が起動したらインスタンスに接続します。

```
$ gcloud compute ssh my-centos
```

## Git インストール

実は今回起動したイメージには Git が含まれていないので、yum でインストールします。

```
$ sudo yum install -y git
```

## git config

下記コマンドで git config の設定をしておく必要があります。

```
$ git config --global credential.'https://source.developers.google.com'.helper gcloud.sh
```

[参考:リポジトリをリモートとして追加する](https://cloud.google.com/source-repositories/docs/adding-repositories-as-remotes?hl=ja)

## リポジトリのクローン

ここまでの作業により、リポジトリを clone できるようになっていますので、次のコマンドで clone します。

```
$ gcloud source repos clone リポジトリ名
```

## 利用後は VM を削除

作業後は、OS シャットダウン後に、インスタンスを削除します。

```
$ gcloud compute instances delete my-centos
```

## 最後に

上記の流れで使い捨ての VM を利用できます。自分の PC に色々と入れていると、ソフトのバージョン管理などが面倒だったり容量も食います。そんな時にクラウド上の VM は便利です。

追記：実際のところ、Linux ライクな環境で開発したい場合は、Cloud Shell でいいような気もします・・

## 参考

この記事では単に VM を Cloud Source Repositories を使えるようにしただけですが、Cloud Source Repositories はコード検索などの機能があったり、Cloud Build など GCP 上の他のサービスと連携できる効用もあります。Google Cloud Platform のブログ上で紹介されているため案内させていただきます。

[新しくなった Cloud Source Repositories 、ベータ版で提供開始](https://cloudplatform-jp.googleblog.com/2018/09/introducing-new-cloud-source-repositories.html)