Closed masayuki14 closed 3 years ago
スクレイピングはNokogiriを使うもののかんたんなRubyのスクリプト。 Functionalに使えるのか、コンテナにしたほうがいいのかどうか。 度のサービスで何ができるかを調べる。
まずはCloudFunctionでできることは何か。
CloudFunction のドキュメントである。 https://cloud.google.com/functions
Cloud Functions は、Google Cloud のイベント ドリブンのサーバーレス コンピューティング プラットフォームです。
使えるのが
となるとコンテナで実行することになる。
Cloud Run フルマネージド型のサーバーレス環境上のコンテナ https://cloud.google.com/run?hl=ja
Cloud Run は、ステートレス コンテナを自動的にスケールするフルマネージド型のコンピューティング プラットフォームです。
従量課金 コードが実行されている間のみ料金が発生します。使用時間は最も近い 100 ミリ秒単位に丸められます。
チュートリアルが3つある とりあえずやってみる。
事前にビルドされたサンプル コンテナのデプロイ
https://cloud.google.com/run/docs/quickstarts/prebuilt-deploy?hl=ja
CloudRun に移動 コンピューティングメニューの中にある。
[サービスの作成] からサービスを作成する。
リージョンは東京にする asia-northeast1(東京)
サービス名をつける。
結果をウェブブラウザで開くには、[未認証の呼び出しを許可する] を選択
[次へ] 進む
コンテナURL gcr.io/cloudrun/hello
にして [作成]
https://tutorial-1-qvpqylb4vq-an.a.run.app URLが発行されて、コンテナがWebAppとして動く。 wow
次のチュートリアル
ビルドとデプロイ
https://cloud.google.com/run/docs/quickstarts/build-and-deploy?hl=ja
プロジェクトを選んで [続行]
Google Cloud SDK のインストール https://cloud.google.com/sdk/docs?hl=ja
前に GKE 使おうとした時にインストールしたような気がする。
とりあえずここまでで 1h
resume
/Users/masa/.bin/google-cloud-sdk
にインストールされてた。
バージョン古いので最新にする
再インストールみたいなことしたけど、
gcloud components update
してもよかった。
Ruby でチュートリアルを続ける
Dockerfileを用意して Cloud Build でビルドするらしい。
PROJECT-ID はどうなる? gcloudにプロジェクトしていする必要があるのでは?
設定など確認
gcloud config list
プロジェクトを設定したい。
gcloud config set project
事前に認証しておかないといけないぽい。
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.
gcloud auth
で認証完了。 その後
% gcloud config set project cloudruntutorial-1
でプロジェクトを設定できた
gcloud config list
で設定されたプロジェクトが確認できた
% gcloud config get-value project
cloudruntutorial-1
なので、ProjectIDは cloudruntutorial-1
。
ようはwebコンソールで見れるやつ。
cloud build でビルドする。
% 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
ビルドが終わったのでデプロイする。
% 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
https://helloworld-qvpqylb4vq-an.a.run.app/ デプロイされたURL
CloudRunのコンソールにもサービスとして追加されている。
app.rb
編集してビルドしてみる。
get '/test' do
"Hello test"
end
を追加して
gcloud builds submit --tag gcr.io/cloudruntutorial-1/helloworld
してから https://helloworld-qvpqylb4vq-an.a.run.app/test にアクセスしても反映されていない
% gcloud run deploy --image gcr.io/cloudruntutorial-1/helloworld --platform managed
もう一度同じ条件で実行
反映された。URLも変わらず。
ポートの謎。解明。sinatra はデフォルトで4567をListenするけど、環境変数の$PORTがあればそれをListenする。 CloudRunは8080をWebのポートにしているようだけど、それを$PORTに保存しているから、そのポート番号で動くようになってる。
Git -> Build -> Deploy を自動化する方法がある。 https://cloud.google.com/run/docs/continuous-deployment-with-cloud-build?hl=ja
今の所これは置いておく。
Pub/Sub からトリガーする方法 https://cloud.google.com/run/docs/triggering/pubsub-push?hl=ja スケジュールもできる https://cloud.google.com/run/docs/triggering/using-scheduler?hl=ja
これらをどうするか、は考えないといけない。
と、その前に、Container Registryのことも知っておかないと行けないような。
Cloud Storage にコンテナ用、ビルド用と思われるバケットが作成されている。
Container Registry トップページ https://cloud.google.com/container-registry?hl=ja
Dockerコンテナのレジストリとして使える。 設定すれば docker コマンドで push/pull できる。 ローカルでビルドして push するよりかは Cloud Build 使ったほうがそのまま登録できるしそのほうがいいかも。
Pub/Sub
Cloud Schedule
何れにせよ、コンテナに対し http アクセスを発生させている。 ただのRubyスクリプトを動かしたいだけなのだが、Rackアプリでラップしてやらないといけないのか?
まずは、RubyスクリプトをSlackに通知できるように変えて動いたかどうか確認できるようにしないとあかんですなぁ。
slackのWebHookを作って、mentoring 用のslackでつかう。
https://api.slack.com/apps Appを作ってWebHookを使えるようにする。
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
かな。
https://shinyorke.hatenablog.com/entry/gcp-slack-taida これに似たことやってみたい