Cloud Runを実行してみた

# Cloud Runとは
GCPが提供するフルマネージドなコンテナ実行環境です。
11/15にGAになりました。
（11/20時点では日本語のドキュメントは対応が遅れていてベータ版という記載があります。）
AWSではFargateという似たような？サービスがあります。

2019/12/6追記
Cloud RunとCloud Run on GKEの違いが開発者のツイッターで記載されていました。
~~やはりツイッターは時代の最先端を取得するためのツール~~
https://twitter.com/ahmetb/status/1116041166359654400
Cloud RunはGoogle社内で使われているインフラが使われているのでBorg（現Omega？）がバックグラウンドだそうです。
対してCloud Run on GKEはKnativeで動いているようです。

公式
<a href="https://cloud.google.com/run/?hl=ja">Cloud Run（日本語）</a>
<a href="https://cloud.google.com/run/?hl=en">Cloud Run（英語）</a>

- サーバーレスでコンテナを実行できる 
GCPがインフラについては提供してくれるのでコンテナの作成に注力できます。

- Knativeから作成されている
knativeについてはこちら（<a href="https://knative.dev/">knative</a>）


# Cloud Runを実行してみる
公式のチュートリアルに従って実行してみました。
<a href="https://cloud.google.com/run/docs/quickstarts/prebuilt-deploy?hl=ja">チュートリアル</a>
<a href="https://github.com/tg-tky/cloud-run">作成したソース</a>

```
$ export PROJECT_ID=hogehoge
$ make deploy_cloud
$ make run_cloud
```

サンプルなのにマルチステージビルドしてて意識高い

>公式からの引用 <a href="https://cloud.google.com/run/docs/quickstarts/build-and-deploy?hl=ja">Quickstart: Build and Deploy<a/>

``` 
# Use the official Golang image to create a build artifact.
# This is based on Debian and sets the GOPATH to /go.
# https://hub.docker.com/_/golang
FROM golang:1.13 as builder

# Create and change to the app directory.
WORKDIR /app

# Retrieve application dependencies.
# This allows the container build to reuse cached dependencies.
COPY go.* ./
RUN go mod download

# Copy local code to the container image.
COPY . ./

# Build the binary.
RUN CGO_ENABLED=0 GOOS=linux go build -mod=readonly -v -o server

# Use the official Alpine image for a lean production container.
# https://hub.docker.com/_/alpine
# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
FROM alpine:3
RUN apk add --no-cache ca-certificates

# Copy the binary to the production image from the builder stage.
COPY --from=builder /app/server /server

# Run the web service on container startup.
CMD ["/server"]

```


デプロイが完了すると自動でリビジョンが切られたり、トラフィックの切り替わりが行われます。

### デプロイ
コンテナのビルドは行なってあります。

#### コマンドラインからの実行

```
gcloud run deploy --region=asia-northeast1 --image gcr.io/$PROJECT_ID/go-server --platform=managed
Service name (go-server):  go-server　#go-serverと入力
Allow unauthenticated invocations to [go-server] (y/N)?  y #yと入力
Deploying container to Cloud Run service [go-server] in project [$PROJECT_ID] region [asia-northeast1]
✓ Deploying... Done.                                                                                                                       
  ✓ Creating Revision...                                                                                                                   
  ✓ Routing traffic...                                                                                                                     
Done.                                                                                                                                      
Service [go-server] revision [go-server-00002-dag] has been deployed and is serving 100 percent of traffic at https://$URL
```

#### コンソールからの実行
デプロイするサービスを選択
<img width="824" alt="スクリーンショット 2019-11-21 7.48.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525962/5161f643-7301-b198-4695-4f4891d11fff.png">

新しいバージョンのデプロイを選択
<img width="649" alt="スクリーンショット 2019-11-21 7.56.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525962/7c2fd456-14a7-940a-c6e0-67a5cd533b72.png">

特に変更せずデプロイ
<img width="692" alt="スクリーンショット 2019-11-21 8.00.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525962/4ae74b40-538d-a565-a01e-e2cc8b1d0ee6.png">



デプロイ中・・・・
<img width="723" alt="スクリーンショット 2019-11-21 7.39.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525962/051b8a15-8398-cf7e-6ac3-9460465859c1.png">

デプロイ完了
<img width="720" alt="スクリーンショット 2019-11-21 7.40.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525962/a15dfcfb-0e29-2f68-21de-87e903c7f638.png">

と非常に簡単にコンテナがデプロイできます。
現状GCRからのpullしか対応していないようで、Dockerhubなど外部リポジトリからは取得できないようです。
リポジトリの指定がgcr.ioが必要なようです。

```
gcloud run deploy --region=asia-northeast1 --image nginx:latest --platform=managed
〜中略〜
ERROR: (gcloud.run.deploy) Invalid image provided in the revision template. Expected [region.]gcr.io/repo-path[:tag or @digest], obtained nginx:latest
```

# 今後に期待すること
Dockerhubなど外部のリポジトリからも取得できるようにして欲しい
バージョンを手軽に戻せるようにして欲しい
と思いました。