Closed masayuki14 closed 3 years ago
できた。
ビルド構成ファイル cloudbuild.yml
を作ってしまえば
gcloud builds submit --config cloudbuild.yaml
ですむ。
https://cloud.google.com/cloud-build/docs/quickstart-build?hl=ja
Deploy
% gcloud run deploy --image gcr.io/cloudruntutorial-1/pitnews_scraper --platform managed
Service name (pitnewsscraper):
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 [pitnewsscraper] (y/N)? y
Deploying container to Cloud Run service [pitnewsscraper] in project [cloudruntutorial-1] region [asia-northeast1]
X Deploying new service... Cloud Run error: Container failed to start. Failed to start and then listen on the port defined by the PORT
environment variable. Logs for this revision might contain more information.
X Creating Revision... Cloud Run error: Container failed to start. Failed to start and then listen on the port defined by the PORT e
nvironment variable. Logs for this revision might contain more information.
. Routing traffic...
✓ Setting IAM Policy...
Deployment failed
ERROR: (gcloud.run.deploy) Cloud Run error: Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable. Logs for this revision might contain more information.
エラーになった。どうやらPORTをListenする必要がある。 うーん。
Webrickを使ってサーバーをたてて、 実行はServletでラップしてやる。
require 'webrick'
require_relative 'lib/mercury'
server = WEBrick::HTTPServer.new(
Port: ENV['PORT'] || 8080,
DocumentRoot: './',
BindAddress: '0.0.0.0',
)
#CGIInterpreter: "/Users/masa/.rbenv/shims/ruby" #'/usr/local/bin/ruby'
#, "./scrape.rb --hook=#{ENV['SLACK_WEBHOOK']}")
#
module Mercury
class Servlet < WEBrick::HTTPServlet::AbstractServlet
def do_GET(req, res)
# スクレイピングして
# SlackのHookをコールする
end
end
end
server.mount('/', Mercury::Servlet)
trap("INT"){ server.shutdown }
server.start
CGIで起動する場合、HookのURLを環境変数で渡す方法がわからんかった。 Webrickであれば
HOOK=https://xxxxxxx ruby webrick.rb
としてやれば webrick.rb
内であれば参照できる
ということで、webrickでラップしてやればビルドがとおった。
% gcloud builds submit --tag gcr.io/cloudruntutorial-1/pitnews_scraper
% gcloud builds submit --tag gcr.io/cloudruntutorial-1/pitnews_scraper
Creating temporary tarball archive of 23 file(s) totalling 67.2 KiB before compression.
Uploading tarball of [.] to [gs://cloudruntutorial-1_cloudbuild/source/1587967183.77-96129542dc6d4d08a80175b7d11e8522.tgz]
Created [https://cloudbuild.googleapis.com/v1/projects/cloudruntutorial-1/builds/b3bb44aa-e946-454e-a8f7-ea408f4b5e5c].
Logs are available at [https://console.cloud.google.com/cloud-build/builds/b3bb44aa-e946-454e-a8f7-ea408f4b5e5c?project=1014054297475].
------------------------------------------------------------------------------------------ REMOTE BUILD OUTPUT -------------------------------------------------------------------------------------------
starting build "b3bb44aa-e946-454e-a8f7-ea408f4b5e5c"
FETCHSOURCE
Fetching storage object: gs://cloudruntutorial-1_cloudbuild/source/1587967183.77-96129542dc6d4d08a80175b7d11e8522.tgz#1587967184875156
Copying gs://cloudruntutorial-1_cloudbuild/source/1587967183.77-96129542dc6d4d08a80175b7d11e8522.tgz#1587967184875156...
/ [1 files][ 6.4 KiB/ 6.4 KiB]
Operation completed over 1 objects/6.4 KiB.
BUILD
Already have image (with digest): gcr.io/cloud-builders/docker
Sending build context to Docker daemon 88.58kB
Step 1/7 : FROM ruby:2.7
2.7: Pulling from library/ruby
90fe46dd8199: Pulling fs layer
35a4f1977689: Pulling fs layer
bbc37f14aded: Pulling fs layer
74e27dc593d4: Pulling fs layer
4352dcff7819: Pulling fs layer
cffd0bce6043: Pulling fs layer
d05af844ace0: Pulling fs layer
58e36c806601: Pulling fs layer
74e27dc593d4: Waiting
4352dcff7819: Waiting
cffd0bce6043: Waiting
d05af844ace0: Waiting
58e36c806601: Waiting
35a4f1977689: Verifying Checksum
35a4f1977689: Download complete
bbc37f14aded: Verifying Checksum
bbc37f14aded: Download complete
90fe46dd8199: Verifying Checksum
90fe46dd8199: Download complete
cffd0bce6043: Verifying Checksum
cffd0bce6043: Download complete
74e27dc593d4: Verifying Checksum
74e27dc593d4: Download complete
58e36c806601: Verifying Checksum
58e36c806601: Download complete
d05af844ace0: Verifying Checksum
d05af844ace0: Download complete
4352dcff7819: Verifying Checksum
4352dcff7819: Download complete
90fe46dd8199: Pull complete
35a4f1977689: Pull complete
bbc37f14aded: Pull complete
74e27dc593d4: Pull complete
4352dcff7819: Pull complete
cffd0bce6043: Pull complete
d05af844ace0: Pull complete
58e36c806601: Pull complete
Digest: sha256:99ae9cd8e70f18be421c0e19c5775b535ddcdd002c3ed9c3e64b0ad873442c87
Status: Downloaded newer image for ruby:2.7
---> dfa98863f22c
Step 2/7 : WORKDIR /usr/src/app
---> Running in f80cc9da6069
Removing intermediate container f80cc9da6069
---> c392530d0511
Step 3/7 : COPY Gemfile Gemfile.lock ./
---> c1c728ee131b
Step 4/7 : ENV BUNDLE_FROZEN=true
---> Running in eb0a534ab4be
Removing intermediate container eb0a534ab4be
---> b0511b571de6
Step 5/7 : RUN bundle install
---> Running in ac2fee4653f8
Fetching gem metadata from https://rubygems.org/.................
Using bundler 2.1.4
Fetching mini_portile2 2.4.0
Installing mini_portile2 2.4.0
Fetching nokogiri 1.10.9
Installing nokogiri 1.10.9 with native extensions
Bundle complete! 1 Gemfile dependency, 3 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
Removing intermediate container ac2fee4653f8
---> 735af6b0672b
Step 6/7 : COPY . ./
---> 025bde56cbab
Step 7/7 : CMD ["ruby", "./webrick.rb"]
---> Running in b0c16587fe31
Removing intermediate container b0c16587fe31
---> d13243af840e
Successfully built d13243af840e
Successfully tagged gcr.io/cloudruntutorial-1/pitnews_scraper:latest
PUSH
Pushing gcr.io/cloudruntutorial-1/pitnews_scraper
The push refers to repository [gcr.io/cloudruntutorial-1/pitnews_scraper]
16f40a80a1b6: Preparing
c7733834c645: Preparing
4237bdf665f6: Preparing
bf7b38222734: Preparing
b33d34dcd673: Preparing
1dbeef267ad4: Preparing
e969265a9309: Preparing
3d3e92e98337: Preparing
8967306e673e: Preparing
9794a3b3ed45: Preparing
5f77a51ade6a: Preparing
e40d297cf5f8: Preparing
1dbeef267ad4: Waiting
e969265a9309: Waiting
3d3e92e98337: Waiting
8967306e673e: Waiting
9794a3b3ed45: Waiting
5f77a51ade6a: Waiting
e40d297cf5f8: Waiting
4237bdf665f6: Pushed
16f40a80a1b6: Pushed
bf7b38222734: Pushed
3d3e92e98337: Layer already exists
8967306e673e: Layer already exists
9794a3b3ed45: Layer already exists
b33d34dcd673: Pushed
c7733834c645: Pushed
e969265a9309: Pushed
5f77a51ade6a: Layer already exists
e40d297cf5f8: Layer already exists
1dbeef267ad4: Pushed
latest: digest: sha256:aae7f201120dacc8418ee4b55ba670269658b8070f5676b85d38e38c63e333b1 size: 2836
DONE
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ID CREATE_TIME DURATION SOURCE IMAGES STATUS
b3bb44aa-e946-454e-a8f7-ea408f4b5e5c 2020-04-27T05:59:45+00:00 1M29S gs://cloudruntutorial-1_cloudbuild/source/1587967183.77-96129542dc6d4d08a80175b7d11e8522.tgz gcr.io/cloudruntutorial-1/pitnews_scraper (+1 more) SUCCESS
Updates are available for some Cloud SDK components. To install them,
please run:
$ gcloud components update
gcloud run deploy --image gcr.io/cloudruntutorial-1/pitnews_scraper --platform managed
Service name (pitnewsscraper):
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`.
Deploying container to Cloud Run service [pitnewsscraper] in project [cloudruntutorial-1] region [asia-northeast1]
✓ Deploying... Done.
✓ Creating Revision...
✓ Routing traffic...
Done.
Service [pitnewsscraper] revision [pitnewsscraper-00002-zop] has been deployed and is serving 100 percent of traffic at https://pitnewsscraper-xxxxxxxxx-an.a.run.app
デプロイとおった。
hookが環境変数に設定されてないから、実行しても動かない。
https://cloud.google.com/cloud-build/docs/building/build-containers?hl=ja
coludbuild.yaml を使ってビルドする。これで環境変数も指定できるはず。
steps:
- name: 'gcr.io/cloud-builders/docker'
# $ gcloud builds submit --tag gcr.io/cloudruntutorial-1/pitnews_scraper
# gcr.io/cloudruntutorial-1/pitnews_scraper のタグでビルドしてるのでこれを指定
#
# e.g. args: [ 'build', '-t', 'gcr.io/[PROJECT_ID]/[IMAGE_NAME]', '.' ]
args: [ 'build', '-t', 'gcr.io/cloudruntutorial-1/pitnews_scraper', '.' ]
マニュアル通りにする。
$ gcloud builds submit --config cloudbuild.yaml
ビルドできた。
Container Registry にpushされているわけではない。
gcloud builds list
ビルドの履歴が見れる。
images: ['gcr.io/cloudruntutorial-1/pitnews_scraper']
images を指定することでCloudRegistryにイメージが格納される。
yamlだとparse error が起きるのでjsonにしたらうまく行った。変な文字はいっちゃったのかも。
$ gcloud builds submit --config cloudbuild.json
Container Registry のコンソールで登録されてるのが確認できた。
すっかりわすれたなー。
とりあえずbuild できてるから環境変数でWebhookURL渡せればOKのはず。
https://cloud.google.com/run/docs/configuring/environment-variables?hl=ja Cloud Run の環境変数のドキュメント
cloudbuild.json で build-args でやってみてるけどこれは違うのでは?
コンソールのGUIで設定できた。
うまく行った。
pcかえたからプロジェクト設定とか必要だった。
gcloud components update
gcloud config set project cloudruntutorial-1
build-argsを消して、build しなおし。
% gcloud builds submit --config cloudbuild.json
びるどできた。
デプロイする
gcloud run deploy --image gcr.io/cloudruntutorial-1/pitnews_scraper --platform managed
できた。
https://pitnewsscraper-qvpqylb4vq-an.a.run.app/
アクセスしたらSlackにメッセージが来るのでうまく言ってる。
次は pub/sub? スケジューラ? で定期実行してみる。
ドキュメント Pub/Sub の push からトリガーする https://cloud.google.com/run/docs/triggering/pubsub-push?hl=ja
あんまりよくわからんかった。
Pub/Subの方を見る。 https://cloud.google.com/pubsub/docs?hl=ja
pub/sub サービス利用者目線での、PublishとSubscribeだった。腑に落ちた。
Pub/Sub トピックを作成する から進めていく
とりあえず専用のサービスアカウントは作成しない。
トピックは新規作成する。
「サブスクリプションの作成」
Subscriptionを作成したので、あとはそれをスケジューラで定期実行するわけだ。
Cloud Scheduler ジョブを作成する を進める。
「ジョブを作成」
0 8 * * *
にしたターゲットがHTTPとPub/Subを選べる 今やりたいことだけ考えると、pub/sub する必要はあんまりなくてHTTPだけで実現できる。
スケジューラ => Pub => CloudRun かと思ったrあ スケジューラ => CloudRun の方法だった。 まぁこれで十分なんだけど。
Pubの定期実行の方を探す。
スケジューラのターゲットをPub/Sub にしてトピック指定してやればよかった。
ペイロードは今んとこいらないけど、pub/sub経由したほうがかゆいところに手が届くような印象。
ジョブが作成できたら、とりあえず「今すぐ実行」ぼたんが合ったので押してみた。
うごかない。
トピック名はPub/Subページのながい名前をちゃんと指定しないと行けなかった。
projects/**********-1/topics/**********-trigger
とおもったけど、もとのとおりで良かった。
スケジューラ-> pub/sub はいってるぽいけど、その先はどうなってん?
わからなー
わからんのでPub/Subのチュートリアルやってみる。
クイックスタート: Pub/Sub システム機能の構築 https://cloud.google.com/pubsub/docs/quickstart-py-mac?hl=ja
これやる
CloudRun のコンテナがPOSTリクエストを受け付けてなかったのでwebrick.rbを修正
def do_POST(req, res)
do_GET(req, res)
end
build & deploy
gcloud builds submit --config cloudbuild.json
gcloud run deploy --image gcr.io/cloudruntutorial-1/pitnews_scraper --platform managed
https://shinyorke.hatenablog.com/entry/gcp-slack-taida これに似たことやってみたい