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

できた。

ビルド構成ファイル cloudbuild.yml を作ってしまえば

gcloud builds submit --config cloudbuild.yaml

ですむ。

https://cloud.google.com/cloud-build/docs/quickstart-build?hl=ja

masayuki14 commented 4 years ago

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する必要がある。 うーん。

masayuki14 commented 4 years ago

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
masayuki14 commented 4 years ago

CGIで起動する場合、HookのURLを環境変数で渡す方法がわからんかった。 Webrickであれば

HOOK=https://xxxxxxx ruby webrick.rb

としてやれば webrick.rb 内であれば参照できる

masayuki14 commented 4 years ago

ということで、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
masayuki14 commented 4 years ago
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
masayuki14 commented 4 years ago

デプロイとおった。

masayuki14 commented 4 years ago

hookが環境変数に設定されてないから、実行しても動かない。

masayuki14 commented 4 years ago

https://cloud.google.com/cloud-build/docs/building/build-containers?hl=ja

coludbuild.yaml を使ってビルドする。これで環境変数も指定できるはず。

masayuki14 commented 4 years ago
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

ビルドできた。

masayuki14 commented 4 years ago

Container Registry にpushされているわけではない。

https://console.cloud.google.com/gcr/images/cloudruntutorial-1/GLOBAL/pitnews_scraper?project=cloudruntutorial-1&hl=ja&gcrImageListsize=30

masayuki14 commented 4 years ago
gcloud builds list

ビルドの履歴が見れる。

masayuki14 commented 4 years ago
    images: ['gcr.io/cloudruntutorial-1/pitnews_scraper']

images を指定することでCloudRegistryにイメージが格納される。

masayuki14 commented 4 years ago

yamlだとparse error が起きるのでjsonにしたらうまく行った。変な文字はいっちゃったのかも。

$ gcloud builds submit --config cloudbuild.json  
masayuki14 commented 4 years ago

Container Registry のコンソールで登録されてるのが確認できた。

masayuki14 commented 4 years ago

すっかりわすれたなー。

masayuki14 commented 4 years ago

とりあえずbuild できてるから環境変数でWebhookURL渡せればOKのはず。

masayuki14 commented 4 years ago

https://cloud.google.com/run/docs/configuring/environment-variables?hl=ja Cloud Run の環境変数のドキュメント

cloudbuild.json で build-args でやってみてるけどこれは違うのでは?

masayuki14 commented 4 years ago

コンソールのGUIで設定できた。

masayuki14 commented 4 years ago

うまく行った。

masayuki14 commented 4 years ago

pcかえたからプロジェクト設定とか必要だった。

gcloud components update
gcloud config set project cloudruntutorial-1
masayuki14 commented 4 years ago

build-argsを消して、build しなおし。

% gcloud builds submit --config cloudbuild.json

びるどできた。

masayuki14 commented 4 years ago

デプロイする

gcloud run deploy --image gcr.io/cloudruntutorial-1/pitnews_scraper --platform managed

できた。

masayuki14 commented 4 years ago

https://pitnewsscraper-qvpqylb4vq-an.a.run.app/

アクセスしたらSlackにメッセージが来るのでうまく言ってる。

masayuki14 commented 4 years ago

次は pub/sub? スケジューラ? で定期実行してみる。

masayuki14 commented 4 years ago

ドキュメント Pub/Sub の push からトリガーする https://cloud.google.com/run/docs/triggering/pubsub-push?hl=ja

masayuki14 commented 4 years ago

あんまりよくわからんかった。

masayuki14 commented 4 years ago

Pub/Subの方を見る。 https://cloud.google.com/pubsub/docs?hl=ja

masayuki14 commented 4 years ago

pub/sub サービス利用者目線での、PublishとSubscribeだった。腑に落ちた。

masayuki14 commented 4 years ago
スクリーンショット 2020-06-12 15 29 07
masayuki14 commented 4 years ago

Pub/Sub トピックを作成する から進めていく

masayuki14 commented 4 years ago

とりあえず専用のサービスアカウントは作成しない。

masayuki14 commented 4 years ago

トピックは新規作成する。

masayuki14 commented 4 years ago

「サブスクリプションの作成」

masayuki14 commented 4 years ago

Subscriptionを作成したので、あとはそれをスケジューラで定期実行するわけだ。

masayuki14 commented 4 years ago

Cloud Scheduler ジョブを作成する を進める。

masayuki14 commented 4 years ago

「ジョブを作成」

masayuki14 commented 4 years ago

ターゲットがHTTPとPub/Subを選べる 今やりたいことだけ考えると、pub/sub する必要はあんまりなくてHTTPだけで実現できる。

masayuki14 commented 4 years ago

スケジューラ => Pub => CloudRun かと思ったrあ スケジューラ => CloudRun の方法だった。 まぁこれで十分なんだけど。

masayuki14 commented 4 years ago

Pubの定期実行の方を探す。

masayuki14 commented 4 years ago

スケジューラのターゲットをPub/Sub にしてトピック指定してやればよかった。

masayuki14 commented 4 years ago

ペイロードは今んとこいらないけど、pub/sub経由したほうがかゆいところに手が届くような印象。

masayuki14 commented 4 years ago

ジョブが作成できたら、とりあえず「今すぐ実行」ぼたんが合ったので押してみた。

masayuki14 commented 4 years ago

うごかない。 トピック名はPub/Subページのながい名前をちゃんと指定しないと行けなかった。 projects/**********-1/topics/**********-trigger

とおもったけど、もとのとおりで良かった。

masayuki14 commented 4 years ago

スケジューラ-> pub/sub はいってるぽいけど、その先はどうなってん?

masayuki14 commented 4 years ago

わからなー

masayuki14 commented 4 years ago

わからんのでPub/Subのチュートリアルやってみる。

masayuki14 commented 4 years ago

クイックスタート: Pub/Sub システム機能の構築 https://cloud.google.com/pubsub/docs/quickstart-py-mac?hl=ja

これやる

masayuki14 commented 4 years ago

CloudRun のコンテナがPOSTリクエストを受け付けてなかったのでwebrick.rbを修正

    def do_POST(req, res)
      do_GET(req, res)
    end
masayuki14 commented 4 years ago

build & deploy

 gcloud builds submit --config cloudbuild.json
gcloud run deploy --image gcr.io/cloudruntutorial-1/pitnews_scraper --platform managed