vscode-ruby-lsp 動かずハマった

「rubocop がない」って怒られて動かず。
どうやら、vscodeワークスペースに Gemfile 置いて、rubocop を記載して bundle install しないとダメらしい。
諸事情あり、Gemfile 置いてなかったのだった。
(Dockerfile のほうで gem 入れてて、コードはコンテナに入れない方式をとっていた。) 仕方ないので Gemfile 作って rubocop だけ記載した。

BQ に JSON 配列入れれない件

[{"num":1,"text":"hoge"},{"num":2,"text":"fuga"}]

みたいなファイルは bq load でエラーになる。 トップレベルがオブジェクトでなければダメなようだ。

やり方は2つあって、 {"row":...} みたいにラップしてオブジェクト化する方法

{"row":[{"num":1,"text":"hoge"},{"num":2,"text":"fuga"}]}

もしくは、配列をJSONLに変換する方法。

{"num":1,"text":"hoge"}
{"num":2,"text":"fuga"}

BQ の日付パーティションを月単位でフィルタしたい時

ts_column という TIMESTAMP 型のカラムでパーティショニングされたテーブルがあるとして、

WHERE
  FORMAT_TIMESTAMP('%Y-%m', ts_column, 'Asia/Tokyo') = '2023-05'

これだと全件読みに行っちゃうようだが、

WHERE
  TIMESTAMP_TRUNC(ts_column, MONTH,'Asia/Tokyo') = TIMESTAMP('2023-05-01', 'Asia/Tokyo')

これだとちゃんとパーティションが絞られるようだ。

最初、「えっw」って思ったけど、FORMAT_TIMESTAMP は任意の文字列を生成できるわけだから、そりゃパーティションフィルタ効かせるのは厳しいのかも。

digdag: schedule を設定していない workflow の last_session_time は未定義

schedule: を定義してない workflow を RUN ボタンクリックで実行した場合、session_time はボタンをクリックした日時で、last_session_time は未定義となる。
あと、schedule を定義してないと backfill はできない。どういうサイクル(日毎なのか時間毎なのか等)で実行すればよいのか分からないから当然。

Google::Cloud::Storage::File#exists? はファイルが存在しない場合にエラーログを出力する

bucket = Google::Cloud::Storage.new(project_id: gcp_project).bucket(gcs_bucket)
file = bucket.file(file_path, skip_lookup: true)
do_something if file.exists?

みたいなコード書いた場合、ファイルが存在しない場合は file.exists? がちゃんと false を返してくれるのだが、

E, [2023-02-27T15:57:39.741887 #83900] ERROR -- : Error - #<Google::Apis::ClientError: notFound: No such object: ...

みたいなエラーが出力される。

エラーがウザい場合は、files メソッド使ってファイル数で判定するしかなさそう。

files = bucket.files(prefix: file_path)
do_something if files.length.positive?

どうも google-api-ruby-client が OpenCensus (現 OpenTelemetry) を使ってるせいでエラーログが出るっぽい?

Google::Cloud::Storage::File#exists? は、ファイルが存在しない場合は ensure_gapi! を呼び出してるっぽい。
https://github.com/googleapis/google-cloud-ruby/blob/4a6a5b77e43975bdcfcdd15a4e5a186b860b47eb/google-cloud-storage/lib/google/cloud/storage/file.rb#L1936

ensure_gapi! の中で reload! を呼び出している。
https://github.com/googleapis/google-cloud-ruby/blob/4a6a5b77e43975bdcfcdd15a4e5a186b860b47eb/google-cloud-storage/lib/google/cloud/storage/file.rb#L2010

reload! の中で Google::Cloud::Storage::Service#get_file を呼んる。
https://github.com/googleapis/google-cloud-ruby/blob/4a6a5b77e43975bdcfcdd15a4e5a186b860b47eb/google-cloud-storage/lib/google/cloud/storage/file.rb#L1921

Service#get_file の中で、Google::Apis::StorageV1::StorageService#get_object を呼んでる。
https://github.com/googleapis/google-cloud-ruby/blob/4a6a5b77e43975bdcfcdd15a4e5a186b860b47eb/google-cloud-storage/lib/google/cloud/storage/service.rb#L380

StorageService#get_object の中で、Google::Apis::Core::BaseService#execute_or_queue_command を呼んでる。
https://github.com/googleapis/google-api-ruby-client/blob/main/generated/google-apis-storage_v1/lib/google/apis/storage_v1/service.rb#L1773

BaseService#execute_or_queue_command の中で、(おそらくは) Google::Apis::Core::HttpCommand#execute を呼んでる。
https://github.com/googleapis/google-api-ruby-client/blob/main/google-apis-core/lib/google/apis/core/base_service.rb#L418

HttpCommand#execute の中で OpenCensus を使っている。
https://github.com/googleapis/google-api-ruby-client/blob/main/google-apis-core/lib/google/apis/core/http_command.rb#L101

LBやDNSの用語整理

よく分かってないので整理。

ロードバランサのフロントエンド/バックエンド

用語 意味
フロントエンド LBがどのGIP、ポートで受けるのか、とか、SSL/TSL証明書の設定とか
バックエンド LBからどのサーバに流すのか

Cloud Front -> ELB 間の通信をSSL化する場合は、Cloud Front と ELB それぞれに証明書が要るらしい。 ELB、バックエンド間をSSL通信させたい場合も、ELB とバックエンドそれぞれに証明書が要るらしい。

DNSの用語・レコード

用語 意味
ゾーン 管理するドメインの範囲。ドメインとサブドメ。
他のDNSに委譲したサブドメはゾーンから外れる。
SOAレコード
(Start Of Authority)
ゾーンの管理情報(DNSサーバのFQDN、管理者のメルアドとか)
NSレコード あるゾーンの権威DNSサーバのFQDN
Aレコード
(address)
FQDN と IP アドレスを紐付ける
CNAMEレコード
(canonical name)
Aレコードの別名をつける
DCV
(Domain Control Validation)
証明書発行する際にそのドメインの持ち主であることを証明すること。
CNAME を利用した DCV 認証局側で、証明書発行対象のドメインハッシュ値を付与したサブドメを作成し、
申請者側でそれを CNAME として登録。そのサブドメでドメインが引ければ持ち主と判定。