masayuki14 / worklog

Record working log by issues.
MIT License
0 stars 0 forks source link

GCPでサーバーレス #20

Closed masayuki14 closed 3 years ago

masayuki14 commented 4 years ago

https://shinyorke.hatenablog.com/entry/gcp-slack-taida これに似たことやってみたい

masayuki14 commented 4 years ago

スクレイピングはNokogiriを使うもののかんたんなRubyのスクリプト。 Functionalに使えるのか、コンテナにしたほうがいいのかどうか。 度のサービスで何ができるかを調べる。

masayuki14 commented 4 years ago

まずはCloudFunctionでできることは何か。

masayuki14 commented 4 years ago

CloudFunction のドキュメントである。 https://cloud.google.com/functions

masayuki14 commented 4 years ago

Cloud Functions は、Google Cloud のイベント ドリブンのサーバーレス コンピューティング プラットフォームです。

masayuki14 commented 4 years ago

使えるのが

masayuki14 commented 4 years ago

となるとコンテナで実行することになる。

Cloud Run フルマネージド型のサーバーレス環境上のコンテナ https://cloud.google.com/run?hl=ja

masayuki14 commented 4 years ago

Cloud Run は、ステートレス コンテナを自動的にスケールするフルマネージド型のコンピューティング プラットフォームです。

従量課金 コードが実行されている間のみ料金が発生します。使用時間は最も近い 100 ミリ秒単位に丸められます。

masayuki14 commented 4 years ago

チュートリアルが3つある とりあえずやってみる。

事前にビルドされたサンプル コンテナのデプロイ

https://cloud.google.com/run/docs/quickstarts/prebuilt-deploy?hl=ja

masayuki14 commented 4 years ago
  1. プロジェクトを作成
スクリーンショット 2020-04-14 15 42 41
masayuki14 commented 4 years ago

CloudRun に移動 コンピューティングメニューの中にある。

https://console.cloud.google.com/run?enableapi=true&hl=ja&_ga=2.83058966.1209114855.1586844705-1987607463.1583893587

スクリーンショット 2020-04-14 15 46 10
masayuki14 commented 4 years ago

[サービスの作成] からサービスを作成する。

masayuki14 commented 4 years ago
スクリーンショット 2020-04-14 15 48 11
masayuki14 commented 4 years ago

リージョンは東京にする asia-northeast1(東京)

サービス名をつける。

結果をウェブブラウザで開くには、[未認証の呼び出しを許可する] を選択

[次へ] 進む

masayuki14 commented 4 years ago

コンテナURL gcr.io/cloudrun/hello

にして [作成]

masayuki14 commented 4 years ago

https://tutorial-1-qvpqylb4vq-an.a.run.app URLが発行されて、コンテナがWebAppとして動く。 wow

masayuki14 commented 4 years ago

次のチュートリアル

ビルドとデプロイ

https://cloud.google.com/run/docs/quickstarts/build-and-deploy?hl=ja

masayuki14 commented 4 years ago

https://console.cloud.google.com/flows/enableapi?apiid=cloudbuild.googleapis.com%2Crun.googleapis.com&redirect=https%3A%2F%2Fconsole.cloud.google.com&hl=ja&_ga=2.175244322.1209114855.1586844705-1987607463.1583893587

APIを有効にする。

masayuki14 commented 4 years ago

プロジェクトを選んで [続行]

スクリーンショット 2020-04-14 16 05 34
masayuki14 commented 4 years ago

Google Cloud SDK のインストール https://cloud.google.com/sdk/docs?hl=ja

前に GKE 使おうとした時にインストールしたような気がする。

masayuki14 commented 4 years ago

とりあえずここまでで 1h

masayuki14 commented 4 years ago

resume

masayuki14 commented 4 years ago

/Users/masa/.bin/google-cloud-sdk にインストールされてた。 バージョン古いので最新にする

masayuki14 commented 4 years ago

再インストールみたいなことしたけど、 gcloud components update してもよかった。

masayuki14 commented 4 years ago

Ruby でチュートリアルを続ける

masayuki14 commented 4 years ago

Dockerfileを用意して Cloud Build でビルドするらしい。

masayuki14 commented 4 years ago

PROJECT-ID はどうなる? gcloudにプロジェクトしていする必要があるのでは?

masayuki14 commented 4 years ago

設定など確認

gcloud config list

プロジェクトを設定したい。

gcloud config set project
masayuki14 commented 4 years ago

事前に認証しておかないといけないぽい。

Updated property [core/project].
ERROR: (gcloud.config.set) There was a problem refreshing your current auth tokens: invalid_grant: Bad Request
Please run:

  $ gcloud auth login

to obtain new credentials, or if you have already logged in with a
different account:

  $ gcloud config set account ACCOUNT

to select an already authenticated account to use.
masayuki14 commented 4 years ago
gcloud auth

で認証完了。 その後

% gcloud config set project cloudruntutorial-1

でプロジェクトを設定できた

gcloud config list

で設定されたプロジェクトが確認できた

masayuki14 commented 4 years ago
% gcloud config get-value project 
cloudruntutorial-1

なので、ProjectIDは cloudruntutorial-1 。 ようはwebコンソールで見れるやつ。

スクリーンショット 2020-04-15 9 43 55
masayuki14 commented 4 years ago

cloud build でビルドする。

masayuki14 commented 4 years ago
% gcloud builds submit --tag gcr.io/cloudruntutorial-1/helloworld 
Creating temporary tarball archive of 9 file(s) totalling 38.4 KiB before compression.
Uploading tarball of [.] to [gs://cloudruntutorial-1_cloudbuild/source/1586911911.83-15da4e0179b84dfab7ddb9366bd77e58.tgz]
Created [https://cloudbuild.googleapis.com/v1/projects/cloudruntutorial-1/builds/302ce3ba-2e46-414d-b1b9-e596381d9828].
Logs are available at [https://console.cloud.google.com/cloud-build/builds/302ce3ba-2e46-414d-b1b9-e596381d9828?project=1014054297475].
----------------------------------------------------- REMOTE BUILD OUTPUT ------------------------------------------------------
starting build "302ce3ba-2e46-414d-b1b9-e596381d9828"

FETCHSOURCE
Fetching storage object: gs://cloudruntutorial-1_cloudbuild/source/1586911911.83-15da4e0179b84dfab7ddb9366bd77e58.tgz#1586911915162118
Copying gs://cloudruntutorial-1_cloudbuild/source/1586911911.83-15da4e0179b84dfab7ddb9366bd77e58.tgz#1586911915162118...
/ [1 files][  1.7 KiB/  1.7 KiB]
Operation completed over 1 objects/1.7 KiB.
BUILD
Already have image (with digest): gcr.io/cloud-builders/docker
Sending build context to Docker daemon  46.08kB
Step 1/7 : FROM ruby:2.5-slim
2.5-slim: Pulling from library/ruby
c499e6d256d6: Pulling fs layer
2e516c92236d: Pulling fs layer
4698a33c221b: Pulling fs layer
19f43379a810: Pulling fs layer
ee0a6b7b6f0f: Pulling fs layer
19f43379a810: Waiting
ee0a6b7b6f0f: Waiting
4698a33c221b: Download complete
2e516c92236d: Verifying Checksum
2e516c92236d: Download complete
c499e6d256d6: Verifying Checksum
c499e6d256d6: Download complete
ee0a6b7b6f0f: Verifying Checksum
ee0a6b7b6f0f: Download complete
19f43379a810: Verifying Checksum
19f43379a810: Download complete
c499e6d256d6: Pull complete
2e516c92236d: Pull complete
4698a33c221b: Pull complete
19f43379a810: Pull complete
ee0a6b7b6f0f: Pull complete
Digest: sha256:293c27b183aa9cccda2e7de38af928bebd9f7b5467f1f2ed6ac627612fb58f59
Status: Downloaded newer image for ruby:2.5-slim
 ---> e8384067964e
Step 2/7 : WORKDIR /usr/src/app
 ---> Running in 75a843932044
Removing intermediate container 75a843932044
 ---> d81d2804eeb9
Step 3/7 : COPY Gemfile Gemfile.lock ./
 ---> ee1e53ad094b
Step 4/7 : ENV BUNDLE_FROZEN=true
 ---> Running in ae429821ade4
Removing intermediate container ae429821ade4
 ---> 175177ce2437
Step 5/7 : RUN bundle install
 ---> Running in 662806d0b4c4
Fetching gem metadata from https://rubygems.org/..........
Using bundler 1.17.3
Fetching ruby2_keywords 0.0.2
Installing ruby2_keywords 0.0.2
Fetching mustermann 1.1.1
Installing mustermann 1.1.1
Fetching rack 2.2.2
Installing rack 2.2.2
Fetching rack-protection 2.0.8.1
Installing rack-protection 2.0.8.1
Fetching tilt 2.0.10
Installing tilt 2.0.10
Fetching sinatra 2.0.8.1
Installing sinatra 2.0.8.1
Bundle complete! 2 Gemfile dependencies, 7 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
Removing intermediate container 662806d0b4c4
 ---> cac54b330c0c
Step 6/7 : COPY . ./
 ---> 705b9c9cf915
Step 7/7 : CMD ["ruby", "./app.rb"]
 ---> Running in 32e0c39906a6
Removing intermediate container 32e0c39906a6
 ---> 30080dd9ad7f
Successfully built 30080dd9ad7f
Successfully tagged gcr.io/cloudruntutorial-1/helloworld:latest
PUSH
Pushing gcr.io/cloudruntutorial-1/helloworld
The push refers to repository [gcr.io/cloudruntutorial-1/helloworld]
bafe2c2b6bd6: Preparing
06413fa43adf: Preparing
23cb811536e8: Preparing
f79430b1f856: Preparing
864ba82ea01e: Preparing
d6d10a8a559e: Preparing
4ffcc982b204: Preparing
69ecf019f649: Preparing
c3a984abe8a8: Preparing
d6d10a8a559e: Waiting
4ffcc982b204: Waiting
69ecf019f649: Waiting
c3a984abe8a8: Waiting
bafe2c2b6bd6: Pushed
23cb811536e8: Pushed
f79430b1f856: Pushed
06413fa43adf: Pushed
864ba82ea01e: Pushed
4ffcc982b204: Pushed
c3a984abe8a8: Layer already exists
d6d10a8a559e: Pushed
69ecf019f649: Pushed
latest: digest: sha256:a770f0d7505294d1f5fbb428d6d3b46749fc9538f4fee23ba21a6f948117e3f1 size: 2201
DONE
--------------------------------------------------------------------------------------------------------------------------------

ID                                    CREATE_TIME                DURATION  SOURCE                                                                                        IMAGES                                          STATUS
302ce3ba-2e46-414d-b1b9-e596381d9828  2020-04-15T00:51:56+00:00  35S       gs://cloudruntutorial-1_cloudbuild/source/1586911911.83-15da4e0179b84dfab7ddb9366bd77e58.tgz  gcr.io/cloudruntutorial-1/helloworld (+1 more)  SUCCESS
masayuki14 commented 4 years ago

ビルドが終わったのでデプロイする。

% gcloud run deploy --image gcr.io/cloudruntutorial-1/helloworld --platform managed                                [~/workspace/cloud_run 9:54:01]
Service name (helloworld):
Please specify a region:
 [1] asia-east1
 [2] asia-northeast1
 [3] europe-north1
 [4] europe-west1
 [5] europe-west4
 [6] us-central1
 [7] us-east1
 [8] us-east4
 [9] us-west1
 [10] cancel
Please enter your numeric choice:  2

To make this the default region, run `gcloud config set run/region asia-northeast1`.

Allow unauthenticated invocations to [helloworld] (y/N)?  y

Deploying container to Cloud Run service [helloworld] in project [cloudruntutorial-1] region [asia-northeast1]
✓ Deploying new service... Done.
  ✓ Creating Revision...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [helloworld] revision [helloworld-00001-ved] has been deployed and is serving 100 percent of traffic at https://helloworld-qvpqylb4vq-an.a.run.app
masayuki14 commented 4 years ago

https://helloworld-qvpqylb4vq-an.a.run.app/ デプロイされたURL

masayuki14 commented 4 years ago

CloudRunのコンソールにもサービスとして追加されている。

masayuki14 commented 4 years ago

app.rb 編集してビルドしてみる。

masayuki14 commented 4 years ago
  get '/test' do
    "Hello test"
  end

を追加して

gcloud builds submit --tag gcr.io/cloudruntutorial-1/helloworld

してから https://helloworld-qvpqylb4vq-an.a.run.app/test にアクセスしても反映されていない

masayuki14 commented 4 years ago
% gcloud run deploy --image gcr.io/cloudruntutorial-1/helloworld --platform managed

もう一度同じ条件で実行

masayuki14 commented 4 years ago

反映された。URLも変わらず。

masayuki14 commented 4 years ago

ポートの謎。解明。sinatra はデフォルトで4567をListenするけど、環境変数の$PORTがあればそれをListenする。 CloudRunは8080をWebのポートにしているようだけど、それを$PORTに保存しているから、そのポート番号で動くようになってる。

masayuki14 commented 4 years ago

Git -> Build -> Deploy を自動化する方法がある。 https://cloud.google.com/run/docs/continuous-deployment-with-cloud-build?hl=ja

今の所これは置いておく。

masayuki14 commented 4 years ago

Pub/Sub からトリガーする方法 https://cloud.google.com/run/docs/triggering/pubsub-push?hl=ja スケジュールもできる https://cloud.google.com/run/docs/triggering/using-scheduler?hl=ja

これらをどうするか、は考えないといけない。

masayuki14 commented 4 years ago

と、その前に、Container Registryのことも知っておかないと行けないような。

masayuki14 commented 4 years ago

Cloud Storage にコンテナ用、ビルド用と思われるバケットが作成されている。

https://console.cloud.google.com/storage/browser?forceOnBucketsSortingFiltering=false&hl=ja&project=cloudruntutorial-1

masayuki14 commented 4 years ago

Container Registry トップページ https://cloud.google.com/container-registry?hl=ja

masayuki14 commented 4 years ago

Dockerコンテナのレジストリとして使える。 設定すれば docker コマンドで push/pull できる。 ローカルでビルドして push するよりかは Cloud Build 使ったほうがそのまま登録できるしそのほうがいいかも。

masayuki14 commented 4 years ago

Pub/Sub

Cloud Schedule

何れにせよ、コンテナに対し http アクセスを発生させている。 ただのRubyスクリプトを動かしたいだけなのだが、Rackアプリでラップしてやらないといけないのか?

masayuki14 commented 4 years ago

まずは、RubyスクリプトをSlackに通知できるように変えて動いたかどうか確認できるようにしないとあかんですなぁ。

masayuki14 commented 4 years ago

slackのWebHookを作って、mentoring 用のslackでつかう。

https://api.slack.com/apps Appを作ってWebHookを使えるようにする。

masayuki14 commented 4 years ago

RubyScraping のDocker化が終わった。

$ docker run --rm -e SLACK_WEBHOOK=https://hooks.slack.com/services/hogehoge/hogehogehoge pitnews_scraper

で動くイメージ。

$ gcloud builds submit --tag gcr.io/cloudruntutorial-1/pitnews_scraper

かな。