GCP版のFargate?  Cloud Runを触ってみた

# 概要

- Google Cloud RunはAWS Fargateの様な物っぽい
- DockerImageベースのサービスがhttpsのURL付きで10秒ほどで立ち上がる

# Cloud Runとは？

ある日の昼下がり、いつものようにGCPのコンソールを触っていると、`Cloud Run`という見慣れないものが目に入りました。

<img width="286" alt="2019-04-07 13.15.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/79302/a7a3c32e-dd43-37ce-5b47-52431c1fbe4b.png">


以下はスタート画面?のスクショになります。

<img width="1133" alt="スクリーンショット 2019-04-05 17.54.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/79302/24efe473-1df8-4059-10fb-d5a0f5c56703.png">


なるほど、説明を見る限りAWSで言う所の**Fargate**のようなものみたいですね。フルマネージドで使えるだけでなく、GKE上で実行することもできるみたいです。

# 試してみた

~~詳しい情報を求めてドキュメントのリンクをクリックしてみましたが、現段階だといずれも404になってしまいます。コンソールから得られる情報を頼りに、手探りで試すしかないようです。~~

**19年4月9日追記**

ドキュメント公開されたみたいです。
https://cloud.google.com/run/docs/?hl=ja

## DockerImageの準備

とりあえず動かすDockerImageが必要なので、Goのシンプルなwebサーバーを作ってCloud Registryに上げます。

### Goのコード

特に説明は不要かと思いますが、`Hello Cloud Run!`と表示するだけの物です。

```go:main.go
package main

import (
	"fmt"
	"log"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello Cloud Run!")
	})
	log.Fatal(http.ListenAndServe(":8080", nil))
}
```

### Dockerfile

Dockerfileを書く際の注意点として、`PORT`という環境変数を設定する必要があります。以下はコンソールに書いてある文言の引用です。

> ステートレスであり、$PORT 上で HTTP リクエストをリッスンする必要があります。

```dockerfile
FROM golang:1.11-alpine as goapp
ENV APP_ROOT /go/src/app
WORKDIR $APP_ROOT
ADD main.go $APP_ROOT

RUN go build main.go

FROM alpine:latest
COPY --from=goapp /go/src/app/main .
# この環境変数が必要
ENV PORT 8080
EXPOSE 8080
CMD ["./main"]
```

### GCRにアップロード

準備ができたらCloud Registryにアップロードします(project-idの部分は適宜読み替えて下さい)。

```
gcloud builds submit --tag gcr.io/project-id/run_sample:v0.1 .
```

## コンソールからサービスを立ち上げる

### サービスの新規作成

上部ヘッダの**CREATE SERVICE**をクリックします。

<img width="874" alt="スクリーンショット 2019-04-07 13.43.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/79302/f0082df3-d2b8-4eca-6680-ff6c91b96fcc.png">


### DockerImageの選択・サービス名の入力

先ほどGCRにアップロードしたDockerImageを選択し、任意のnサービス名を入力します。また、リージョンの選択もできるようですが、現在はus-central1だけみたいですね。

<img width="555" alt="スクリーンショット 2019-04-07 16.00.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/79302/8f06b480-9d2f-43d8-563b-2fc1b0f6860a.png">



### 外部公開するための設定

今回はサンプルとして外部公開してみたので、`未認証の呼び出しを許可`の項目にチェックを入れます。

<img width="604" alt="スクリーンショット 2019-04-07 13.47.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/79302/e37806a5-d84f-0166-e9d5-cde4203f9e74.png">


### 作成

後は**作成**ボタンを押すだけです。10秒ほど待つと、HTTPSのURLが発行されてサービスが公開されました。早い！

<img width="600" alt="スクリーンショット 2019-04-07 13.50.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/79302/c0e82e74-1c9c-00db-854b-0467656fa829.png">

URLにアクセスすると、ちゃんと期待通りのレスポンスが返ってきました。流石に東京リージョンじゃないので遅いですが・・・

<img width="530" alt="スクリーンショット 2019-04-07 13.52.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/79302/dbdb7ff7-154d-2c97-25fb-b1519be2a84e.png">

# Q&A・考察

## 独自ドメインは設定できるか

今回は試してませんが、**Domain Mapping**という項目があるので、簡単に設定できそうです。

<img width="665" alt="スクリーンショット 2019-04-07 13.55.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/79302/dbda6043-fb69-3d61-7dd9-1805ba97b378.png">

## 内部的にはどうなってるのか

コンソールの詳細画面にはyamlが表示されており、GKEで実行可能なことからも内部的にはk8s(GKE)で動いてそうですね。

<img width="453" alt="スクリーンショット 2019-04-07 13.58.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/79302/eecb2c5f-7843-6292-efb0-b34cdd71c4c9.png">


## 料金は？

APIのページに記載がありました。CPUおよびメモリに対する秒課金に加えて、リクエスト回数に対する課金が課せられる感じですね。

https://console.cloud.google.com/marketplace/details/google/run.googleapis.com

<img width="668" alt="スクリーンショット 2019-04-07 13.59.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/79302/509dce7b-6452-3fa3-1a00-f92a0f719409.png">


## ドキュメントは?

https://cloud.google.com/run/docs/?hl=ja

## まとめ

自分は普段GKEでサービスを運用していますが、そのほとんどはステートレスな物です(というか、そうなるように設計した)。今はまだ使えるリージョンが1つだけですが、東京リージョンが解放されたら一部のサービスの管理が楽になるのカモと感じました。