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
google spread sheet の範囲指定の方法
google spread sheet で A$2:B みたいな範囲指定ができる。
「2行目以降の A:B 列」という意味になる。
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 として登録。そのサブドメでドメインが引ければ持ち主と判定。 |