Google Cloud 版 Dataform と周辺リソースの図

GCP 版 Dataform がついに GA になりましたね。同時に定期実行の仕組みも出て、一通りの機能が揃った感がある。いまこそ買収以前の SaaS 版(Legacy 版)から GCP 版に移行する時!! しかし GitHub リポジトリと連携する場合、登場人物が多くて難しくなっている…

Slack チャンネルのロボット帝国化を防ぐ feed-pruning-proxy

この記事は はてなエンジニア Advent Calendar 2022 2日目の記事です。 みなさんは Slack の RSS アプリ を使っていますか? /feed subscribe FEED_URL で RSS や Atom フィードをチャンネルに流すことができます。 Slack に RSS フィードを追加する | Slack …

なぜ今も Google App Engine を選ぶのか

Google Cloud で何かアプリケーションを動かしたい時、いつも App Engine (GAE) を第一の選択肢として挙げています。 なのにみ〜んな Cloud Run に行ってしまう。なぜなのか?? 確かに Cloud Run のほうが新しくて公式に露出が多いし、GAE はこういうランディ…

2022-10 の Cloud Storage 料金改定に伴い GCR から Artifact Registry へ移行する

Google Cloud で運用しているサービスの Cloud Storage 費用が10月の料金改定から爆増していた。 Cloud Storage 費用(オレンジ部分)が増加 料金改定のタイミングで Cloud Storage のマルチリージョンからマルチリージョン内のリージョンへの転送費用が無料じ…

gcloud の configurations を切り替える

前回の記事では --project を毎回渡せという主張を展開していたけど切り替える話。 blog.pokutuna.com gcloud コマンドには構成を管理するサブコマンド gcloud config configurations がある。管理するプロジェクトが多くない場合は、カレントプロジェクトを…

gcloud にカレントプロジェクトを設定しない派

GCP

gcloud CLI にカレントプロジェクトをなるべく持たせないようにして暮らしている。 gcloud はデフォルトでカレントプロジェクトのリソースを操作する。操作するプロジェクトが 1 つなら良いけど、仕事でも遊びでもいくつもの GCP プロジェクトを扱っているの…

GCP IAM ロールの持つ権限を比較するテク

メンバーやサービスアカウントの権限を考える際に、ロールの持つ権限を比較したいことがしばしばある。そういう時は gcloud と diff を使うことで比較できるという素朴なテク。 ロールと権限 ロール(role)は roles/{roleName}, roles/{service}.{roleName} …

3/17 Born Digital Summit 2022 で発表します

来週 2022-03-17(木) の Google Cloud オンラインイベント 16:20- 『はてな広告配信システムのクラウドネイティブ化への道のり』で発表します。 データセンター環境で運用していた広告配信システムを GCP へ移転する話です。 派手なメッセージな感じではなく…

Google Colaboratory でデータフローのドキュメントを書く試み

この記事ははてなエンジニアのカレンダー | Advent Calendar 2021 - Qiita 2日目の記事です。 最近、データパイプラインの整備や営業チームの人力混じりの運用フローを機械化するなどの業務改善に取り組んでいます。 その過程で、運用ドキュメントを読んだり…

GCP の Application Default Credentials を使った認証

公式ドキュメントで説明されているけど、同僚に何度か説明する機会があったり、作る必要のないサービスアカウントキーを目にすることも多いのでまとめておく。 認証情報が登場しないアプリケーションコード 例えば以下のコードで Secret Manager に保存した…

GKE Autopilot で節約のために asia.gcr.io を使う

追記: 2022-10 移行、無料条件が変わったので Artifact Registry を使うのがよいです blog.pokutuna.com GKE Autopilot に移行してみたところ、意外と費用がかかっていた。 調べたところ、Cloud Storage の egress が支配的で、GCR からのコンテナイメージ転…

Chrome 拡張を Manifest v3 対応した

公式のガイドに従ってやればよい Migrating to Manifest V3 - Chrome Developers background pages が Service Worker に置き換えられた 各 chrome API の Promise 化 リモートのコードが実行できなくなる browser_action と page_action の統合 executeScri…

Flexispot 鬼目ナット化の記録

引越しを機に前から欲しかったスタンディングデスクを買った。 組立てには本体付属の木ねじ(ぐりぐりとねじ込んでいく)を使わず、鬼目ナットを埋め込んで組み立てた。 鬼目ナットを使うと、分解&再組み立てができるし、投機的に埋め込んでおいてリモコン位置…

js を書いて URL やページの内容を加工してコピーできる Chrome 拡張ココピーのご紹介

この記事は はてなエンジニア Advent Calendar 2020 - Qiita の23日目の記事です。 qiita.com 昨日は id:Krouton さんの 30日でできる! OS自作入門 を読むために nasm_of_nask というコンパイラを作った話 - KRAZY感情STYLE でした。よかったですね。 コード…

記事っぽい読み込み中プレースホルダをかんたんに作る

こういう見た目のやつ loading 僕の Next.js で作ったポートフォリオサイト https://pokutuna.com/ では、blog エントリ情報や github の活動は、Cloud Firestore から読み込んで表示していて、その読み込み中の表示を作る話です。 よくあるのは、くるくる回…

Cloud Functions で標準出力に書かれた JSON 文字列がそのまま jsonPayload に入るようになった

タイトルままの話。 GCP では各プロダクトで出力したログが Cloud Logging に集約されて、横断的に見たり検索したりできて大変便利。フィルタして BigQuery に流し込めるのも最高オブ最高。仕事が楽になるっていうのはこういうことやで。 ただ、プロダクトご…

docker build と docker-compose build でレイヤーキャッシュが共有できない問題を回避する

まとめ BuildKit 使ってなくても COMPOSE_DOCKER_CLI_BUILD=1 を使う キャッシュが効いてない CI をいじっていてタイトルの問題に気づいたのが発端。 Cloud Build でキャッシュを使いつつ、ビルドとテストを実行するためにこうしていた。 1 前回のビルドのア…

Automator で .HEIC をオートに変換

Mac

AirDrop で iPhone から Mac へ撮った写真を移すのは一瞬でできるのに、Mac に移してから .HEIC フォーマットの画像を他サービスに貼り付けたりする時の面倒さたるや... 今まで Preview.app で開いて保存し直したりしていたけど、領収書の写真を何枚も変換す…

BigQuery GENERATE_ARRAY でバケットを作って集計

昨日やった作業。 例えばこういうテーブルがあったとして count timestmap 3 2020-07-07 10:30:00 5 2020-07-07 12:34:50 7 2020-07-07 21:07:10 11 2020-07-07 21:10:00 1時間ごとの count の合計値を出したい場合以下みたいなクエリを書く WITH data AS ( …

TSDoc を書きたい & TSDoc で使えるタグ一覧

いつも TypeScript 書いてるんですよ、そしたら function の前にコメント書くじゃないですか、/** ... */ で書いてるけど正直のところ中身は勘で書いている。@returns や @deprecated とかよく見るし、雰囲気で使っているけど、本来なんのタグが使えるかあん…

DataStudio で条件付きの割合スコアカードを作る

こういうやつ Google DataStudio1 でこういう表示をしたい場合は多い。目標の達成割合とか、アプリケーションログから何らかのアクションを取ったユーザの割合を出したりだとか。とりあえず使うだけなら簡単に使える DataStudio だけど、これはシンプルな表…

Next.js を Google App Engine にデプロイする

GAE 便利さに気づいてからめちゃくちゃ気に入っている。 最近開発が活発な Cloud Run や、Firebase のバックエンド実行環境でもある Cloud Functions が話題に登りがちだけど、2nd gen になってからの GAE はめちゃめちゃいいです。 トラフィック分割などの…

.gcloudignore で全部無視して必要なものだけ指定する

App Engine や Cloud Function や Firebase プロジェクトのデプロイ時などでしばしばやる。 TypeScirpt などトランスパイルが必要な言語をデプロイする際に、実行に必要ないファイルをたくさんアップロードしていることがある。 .gcloudignore で全部 ignore…

BigQuery スケジュールされたクエリを設定する際の動作確認コマンド

Scheduling queries または Scheduled queries と呼ばれているもの、日本語だといまいちしっくりこない名前。定期的にクエリを実行して結果を宛先テーブルへ書き込んでくれる。メールで通知したり Pub/Sub イベントを投げたりもできる。 クエリのスケジュー…

Cloud Functions でログをグルーピングする

または Cloud Functions で httpRequest ログを書く方法。 Cloud Logging (もう Stackdriver ブランドなくなりましたね)の好きな機能に、リクエスト内のログをまとめて表示する機能がある。アプリケーション内での一連のログをまとめて追えてとても便利。 me…

Cloud Functions PubSub トリガはデフォルトでは再送しない

タイトルそのまま 以下のように Cloud Functions をデプロイすることで、トピックへメッセージが来るたびに function を起動してくれる。 $ gcloud functions deploy --trigger-topic=TOPIC_NAME 裏では gcf-{function}-{topic} という設定のサブスクプショ…

Could not load the default credentials エラーについて

Cloud Functions でしばしば見るエラー、Firebase Functions も中身は同じなので起きる。 なにやらちゃんと動いていないぞ... と Stackdriver Logging を見にいくと、こういうエラーメッセージが書かれている。 Error: Could not load the default credentia…

gts で TypeScirpt をすぐ書き始める

gts は Google の TypeScirpt style guide と Linter 設定が入った npm package。 googleapis 以下などの Google が公開している各種 TypeScirpt プロジェクトで使われている。 github.com TypeScript は大変気に入っているけど、新たにプロジェクトを作って…

Firestore のエクスポートデータを timetamp パーティショニングして BigQuery に取り込む

Firestore または Datastore の中身を柔軟に検索したい場合、エクスポートしたデータを BigQuery へロードすることで実現できる。 コンソール上に UI も提供されていて簡単だけど、パーティショニング選択肢が "取り込み時間" しかない。 コンソール上のパー…

Cloud Build の waitFor の挙動

Google Cloud Buildにおいて、 ビルドステップの順序の構成 | Cloud Build のドキュメント | Google Cloud waitFor の値が指定されない場合、ビルドステップは、ビルド リクエスト内の先行するすべてのビルドステップが正常に完了するまで待機した後に実行さ…