BigQuery 2021/7月のupdate情報まとめ
6月のまとめに引き続き7月のまとめもいってみましょう!
ODBC/JDBC driverのバージョンアップ
6月に発表された型に桁数を持たせられる機能の他bugfixなどが含まれています。
マテリアライズドビューが集約無しクエリに対応
今まではSUMやAVGなどの集約関数を使ったクエリでしかマテビューが作れなかったが、集約関数を使わなくてもマテビューが作成可能になりました。
クラスタ化や、フィルタリングの検証に使えます。
クラスタ化されたマテビューは、indexのように機能し、元テーブルに対してのクエリもマテビューからのデータを参照するようになります。
BigQueryではoracleのクエリリライトと同じような機能があり、a
というテーブルを元に、 mv_a
というマテビューを作った場合、 a
に対するクエリでも mv_a
を見たほうがクエリコストが低いとクエリオプティマイザが判断した場合、内部的に mv_a
を参照される場合があります。
BigQuery は、事前に計算されたマテリアライズド ビューの結果を利用し、可能な場合にはベーステーブルからの差分のみを読み取って最新の結果を計算します。マテリアライズド ビューに直接クエリを発行できるのはもちろん、ベーステーブルに対するクエリを処理するために BigQuery オプティマイザーでマテリアライズド ビューを使用することもできます。
公式docでは以下のような例が記載されています
データの再クラスタ化
ベーステーブルと異なるクラスタリング スキームを使用したクエリの多くを発行する場合、マテリアライズド ビューを使用するとクエリのパフォーマンスが向上する可能性があります。
CREATE MATERIALIZED VIEW dataset.mv CLUSTER BY y AS SELECT * FROM dataset.base_table;
データの事前フィルタリング
テーブルの特定のサブセットのみを読み取るクエリを頻繁に実行する場合は、マテリアライズド ビューを使用してクエリのパフォーマンスを向上させることができます。
CREATE MATERIALIZED VIEW dataset.mv CLUSTER BY x AS SELECT * FROM dataset.base_table WHERE y < 1000;
データの事前計算
コンピューティング コストが高い関数を頻繁に使用する場合や、大きな列から少量のデータを抽出する場合は、マテリアライズド ビューを使用するとクエリのパフォーマンスが向上します。
CREATE MATERIALIZED VIEW dataset.mv AS SELECT x, JSON_EXTRACT(string_field, "$.subfield1.subfield2") subfield2 FROM dataset.base_table;
発行したクエリがマテビューを参照したかどうかはクエリプランのデータスキャン量などを見ると確認することが出来ます。
マテリアライズドビューが内部結合クエリに対応
今までは結合を使えなかったが、内部結合(inner join)を使ったクエリでもマテビューが作成可能になりました。
クロス結合、完全結合、左結合、右結合は非対応
ファクトテーブルとディメンションテーブルのように、頻繁にjoinされるテーブルのクエリはマテビューを作っておくことでパフォーマンス改善が可能に
(テーブルの参照順はviewとクエリで同一でなければいけない)
CONTAINS_SUBSTR関数
式(文字列や数値、配列など)に値(stirngで指定)が存在するかどうかを確認出来ます。(正規化して比較)
式が文字列の場合大文字小文字の区別をしません。
CONTAINS_SUBSTR関数はWhere句での条件にも指定ができ、テーブル全体から特定の文字列が入っている行を検索など全文検索ぽいことも出来る非常に便利な関数です。
使用例
■戻り値がTrueとなるパターン SELECT CONTAINS_SUBSTR('the blue house', 'Blue house') AS result; SELECT CONTAINS_SUBSTR((23, 35, 41), '35') AS result; -- '\u2168'は正規化するとⅨのため trueとなる SELECT CONTAINS_SUBSTR('\u2168', 'IX') AS result; ■Where句でも使用可能 -- Recipes テーブルのすべての列から値 toast を検索し、この値を含む行を返します。 SELECT * FROM Recipes WHERE CONTAINS_SUBSTR(Recipes, 'toast'); -- Recipe テーブルの Lunch 列と Dinner 列で値 potato を検索し、いずれかの列にこの値が含まれている場合にその行を返します。 SELECT * FROM Recipes WHERE CONTAINS_SUBSTR((Lunch, Dinner), 'potato');
PIVOT関数
エクセルのピボットテーブルと同じような操作が関数で可能に。
(以前もPreviewで使用出来ましたが7月にGAになりました。)
SQLからreservations(slot)の管理が可能に
slotの購入、reservationの作成、reservationへのアサインなどreservationsに関する操作がSQLで実行可能になりました。
スケジュールドクエリと組み合わせることで、特定の時間のみslotを増やすなどの設定が容易に行えます。
-- slotの購入 CREATE CAPACITY -- reservationsの作成 CREATE RESERVATION -- reservationsへのアサイン CREATE ASSIGNMENT -- slotの開放 DROP CAPACITY -- reservationsの削除 DROP RESERVATION -- アサインからdrop DROP ASSIGNMENT
6月には権限設定がSQLから出来るようになったりと、BQではAPIだけではなくSQLからも実行出来ることが増えて来てますね。
INFORMATION_SCHEMAでDMLの結果が取得可能に
INFORMATION_SCHEMA.JOBS_BY_(PROJECT / USER)にdml_statisticsカラムが追加
・INSERT and MERGEによって追加された行数
(loadは含まない)
・UPDATE and MERGEによって更新された行数
・DELETE, MERGE and TRUNCATEによって削除された行数
が確認出来ます
例
SELECT SUM(dml_statistics.inserted_row_count), SUM(dml_statistics.updated_row_count), SUM(dml_statistics.deleted_row_count), FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 8 DAY) AND TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY) AND job_type = "QUERY" AND statement_type != "SCRIPT";
INTERVAL型
時間間隔を保持出来るINTERVAL型を使えるようになりました。
(フォーマット:Y-M D H:M:S[.F])
使用例
CREATE TABLE yu_work.interval_test1 ( aa INTERVAL); -- データ登録例 INSERT INTO yu_work.interval_test1 VALUES (INTERVAL 1 DAY); INSERT INTO yu_work.interval_test1 VALUES (CAST('2-4 26 22:00:00' AS INTERVAL)); SELECT * FROM yu_work.interval_test1 ;
INTERVAL型の使い所について考察しているブログもありました!
【BigQuery】2021.7.27にPreview公開されたINTERVAL型を試してみる - とりゅふの森
7月のアップデートは以上となります。
INFORMATION_SCHEMAはどんどん便利になっていきますね。今後load数や、データ量なども取れるようになっていくといいな〜と思っています。
JulyTechFestaで「セキュアなBigQueryの運用方法」を話してきた
7/18に開催されたJulyTechFesta2021で「セキュアなBigQueryの運用方法」というタイトルで登壇してきました。
JulyTechFestaでの登壇はJulyTechFesta2021 winterに続き2回めとなります。
前回の登壇ブログ
登壇資料
登壇動画
普段BigQuery周りの開発や、運用、セキュリティなどを担当しているので実際に運用してみて得た知識をベースに資料にしました。
BigQueryでは基本的にIDでのアクセス管理が基本となっていますが、IDでの管理のみとするには機密性(権限を与えるべき人にのみ権限が付与されている)の確保や、シークレットの管理など課題も多くあり、完璧にできている企業はなかなか無いと思います。
そこで、ネットワークでの制御も視野に入ってくるのですが、GCPでBigQueryなどVPC内に存在出来ないサービスをネットワーク制御するにはVpcServiceControlsが必要となってきます。
前回の登壇資料でVpcServiceControlsそのものの説明はいくらかしていたので、今回は今年4月にGAとなったingress/egress rulesについて触れてみました。
こちら今までは同一のvpc-scに入ってないプロジェクトとデータのやり取りする際は境界ブリッジを作成しなくてはいけなかったのですが、こちらのrulesを使用することで境界ブリッジの作成なくデータをvpc-scの外部とやり取りすることが出来るようになります。
許可設定の方法として、今まであるアカウントやIPからのアクセスを許可すると方向性関係なく疎通が出来てしまっていたのですが、APIを叩く方向を指定して許可できるようになり、またアクセス元をプロジェクト単位でも許可出来るようになりました。
注意が必要なのは、APIを叩く方向性は制御出来ますが、データの方向性の制御は出来ません。
公式DOCでも注意書きされています。
また、叩くAPIは細かく制御が可能で、メソッド単位やパーミッション単位で指定出来ます。
現在BigQueryはメソッド単位での指定は出来ず、パーミッション単位での指定のみ出来ます。(CLIでのみ設定可能)
設定例
また下記の図のように、BigQueryからの通信を許可する場合は、一方向の通信であっても双方向の許可設定がいる場合があります
これはGCSの存在するプロジェクトからBigQueryのデータがあるプロジェクトへ、内部的にAPIの呼び出しが発生しているため、双方向での許可が必要になります。
登壇時には話さなかったのですが、 testIamPermissionsはigressだけでも大丈夫です。どんなAPIが内部的に呼ばれているかは実際に設定してみたあとにログを追っていくしかありません。
また、内部的に呼び出されるAPIはいつ変わるかわからないので、vps-sc使う際にあまり細かい設定はいれないほうがいいかな?とも思っています。
ingress/egressの設定周りは調査したときにかなり苦労したので別途ブログでまとめられたらと思っています。
おわりに
今回も登壇の機会をあたえてくださった、JulyTechFestaの運営の方々ありがとうございました!
聞かせていただいた他の登壇もとても学びがおおく、個人的にはとても満足度の高いカンファレンスとなりました。
vpc-scやBQ周りの設計相談や構築相談も受けてますので、ちょっと相談したい〜という方は気軽にtwitterのDM等でお知らせください。
BigQuery 2021/6月のupdate情報まとめ
BigQueryでは6月に多くのアップデートが発表されました
BigQueryリリースノート
以下の資料にまとめてみたのでそれぞれの機能を見ていきたいと思います
パラメータ化されたデータ型
BQでは変数を宣言出来るのですが、宣言した変数にパラメータを指定可能となりました。
宣言した変数はscriptまたは列にて使用することが出来ます。
また、違う型の値を入れようとした場合はエラーとなります。
行レベルでの権限制御
テーブルレベル、カラムレベルに続き行レベルでの権限制御が可能になりました。
権限の設定はSQLからのみ行なえます。
これにより1つのテーブルでも人によって見え方が違うので、US担当の人はUSのデータのみ見せるといった使い方が可能になりました。
行レベル制御が入っているテーブルについてはスキャン量もユーザが見えるだけ(テーブル全体ではない)になるようです。
スナップショットテーブル
もともとBigQueryでは7日間はテーブルデータが自動で保存されていましたが、それ以上の日付も手動で保存することが出来るようになりました。
別テーブルを作って保存も今まで出来たのですが、スナップショットテーブルとして保存した場合はストレージ費用が元テーブルとの差分のみになります。
GoogleトレンドのデータをBQからクエリ可能に
Googleトレンドのデータがpublicデータとして公開されました。(現在はUSのみ)
社内のデータと紐付けてマーケティングなどに活用が出来るかなと思います。
トレンドになっているテーマ、地域、スコア、ランクなどのデータが入っています。
Table関数
tableが戻り値として返る関数を作れるようになりました。
viewと似ていますが、引数をつけられるのが特徴です。where句に毎回生年月日を指定したいなどの場合に使えます。
ALTER COLUMN SET OPTIONS
今までは、GUIやAPIでしか書けなかった列の説明(description)をSQLで追加出来るようになりました。
PARSE NUMERIC / PARSE BIGNUMERIC
CASTとは違い数字の前や後ろにスペースや改行が入ってる文字列もNUMERICに変換してくれます。(CASTだとエラーになる)
CASTした際にFORMT指定可能に
以前からも一部は出来た気がするので、previewがGAになったよ。だとは思うのですが、
文字列から様々な型へのCAST
様々な型から文字列へのCAST
の際にFORMAT指定が出来るようになりました
INT64の別名
こちらもINTEGERなど元々あったので、エイリアスが増えたのかpreviewがGAになったのかだと思うのですが、INT/SMALLINT/INTEGER/BIGINT/TINYINT/BYTEINTはすべてINT64として扱われるようになりました。
ST_GEOGFROM関数
地理データの型に変換する関数がリリースされました。
SQLで権限制御が出来るように
DCL(GRANT/REVOKE)がサポートされ。SQLでの権限制御が出来るようになりました。
INFORMATION_SCHEMAから権限情報の取得が可能に
INFORMATION_SCHEMAにOBJECT_PRIVILEGESが加わり、権限情報が取得出来るようになりました。
トランザクションサポート
トランザクションがサポートされました!!!ただ、GUIからSQL実行する場合など、1回の実行毎にセッションが切れてしまうので、現在はscript用となっています。
MySQLの用に間にDDL挟むと暗黙的commit走るのかな?と思ったのですが、そもそもエラーになりました!
おおお!!!BQがトランザクション対応!!
— yu yamada (@nii_yan) 2021年6月30日
途中で、トランザクションに対応してないDDL挟んだら暗黙的commitされるのかな?って思ったらそもそもクエリが失敗する仕様だった。 https://t.co/NhViyoufhd pic.twitter.com/t4C8z0T5fK
以上で、6月のBQ updateは終わりです。 7月のリリースも多かったらまた来月もやりたいと思います。
参考にさせていただいたサイト
GCP 組織間(org間)でのProjectの移動方法
GCPでは組織間で既存のprojectを移動させる機能があります (2021/05/10現在 プレビュー)
例えば会社の統合や分社化などで、組織(org)を統合しなくてはいけない、または組織を分けなくてはいけないときにこちらの機能を使えば1からプロジェクト作成をやりなおすのではなく、リソースなどはそのままに紐付いている組織だけを変更することが出来ます。
移動した際はリソース(GCEやネットワーク設定など)はそのまま残っていますが、例えば組織ポリシーで継承されているIAMなどは移行されないので注意してください。
移動準備
移動をするにあたって、移動元組織と移動先組織でそれぞれ組織ポリシーの変更が必要になります。
また組織ポリシーの変更にあたっては、組織ポリシー管理者などの権限が必要となります
https://cloud.google.com/resource-manager/docs/project-migration#import_export_folders
移動元
プロジェクトの移動はデフォルトの組織ポリシーで禁止されています
ですので、まずは組織ポリシーで移動許可をしなくてはいけません
こちらはホワイトリストで移動出来る組織の指定を行います
参考コマンド
gcloud beta resource-manager org-policies / allow constraints/resourcemanager.allowedExportDestinations / --organization 移動元組織ID under:organizations/移動先組織ID
移動先
移動先でもどの組織からの受け入れが出来るかホワイトリストで許可をしないといけません
参考コマンド
gcloud beta resource-manager org-policies / allow constraints/resourcemanager.allowedImportSources / --organization 移動先組織ID under:organizations/移動元組織ID
移動
移動準備が出来ましたらあとは実際に移動コマンドを打てば完成です コマンド実行のために必要な権限はこちらを参考にしてください
https://cloud.google.com/resource-manager/docs/project-migration#assign_permissions
権限がついたら以下のコマンドをたたけば組織間でのプロジェクト移動の完成です
gcloud beta projects move 移動するプロジェクトID / --organization 移動先組織ID
以上で組織間のプロジェクト移動が出来ました!!
GCP Professional Cloud Architectの最速合格方法
受験動機
2019/4に資格を取ったのですが、2年で期限が切れるため再認定で受けました
再認定の場合、期限が切れるまえに試験を受けると$100の割引を受けることが出来ました
試験概要
勉強方法
今回は再認定ということもあり、あまり勉強に時間をかけたくなかったのでUdemyのコースを購入し
こちらについている問題集だけで試験に合格出来るか挑戦してみました
購入したコースはこちら
Ultimate Google Cloud Certifications: All in one Bundle (4)
定価は¥12,000と高いですがセールで¥1,500になるときがあるのでセールの時に買いました
また、試験直前には公式の模擬問題をときました
試験結果
Udemyのコースで出て来た範囲の問題がほとんどで、合格することが出来ました
問題集ベースで勉強したので、実質の勉強時間は8hほどになるかと思います。
所感
今回購入したUdemyのコースは神がかっていたと思います。
また、このコースはProfessional Cloud Architect以外にも以下の資格にも対応しているので買っておいて損はないと思います
- Associate Cloud Engineer
- Professional Cloud Developer
- Professional Cloud Data Engineer(今後対応予定)
- Professional DevOps Engineer(今後対応予定)
まったく0からの知識でUdemyの問題集だけで合格はさすがに難しいと思いますが、
- 再認定
- 普段GCPを使っている
- GCE,GAE,Dataflow,CloudSQL,BQと言われてどんなサービスかぱっと答えられる
のどれかに当てはまる方でしたら問題集のわからないところを補足して勉強する程度で受かるのでは?と思います
また、GCP全体的な知識をつけたい場合でしたら、Professional Cloud Architectに特化した本などは今のところ無いようなので、以下の書籍がおすすめです(Kindle Unlimitedで無料で読めます)
AWS 認定セキュリティ専門知識(SCS-C01)に合格しました
受験動機
現在、クラウドのセキュリティ周りを中心に担当していることからせっかくなら資格を取ろうと思い受験をし、結果 2021/2に無事に合格することが出来ました
試験概要
制限時間:170分
分野 | 試験における比重 |
---|---|
インシデント対応 | 12% |
ログ収集と監視 | 20% |
インフラストラクチャのセキュリティ | 26% |
IDとアクセスの管理 | 20% |
データ保護 | 22% |
勉強方法
セキュリティ試験用の対策本が出ているので一通り読破 (重要な事はほぼ、この本に載っています!)
サンプル問題を解いてみる
わからなかったところを、中心に対策本をもう一度読破(2回目)
自分はKMSの理解が難しく、KMSはかなり読み込みました
擬試験を受験 (この時点で60%の正解率)
(AWSの試験を受けるのが初めてだったので、今回模擬試験を受けたのですがスコアがわかるのみで正解はわからない&有料なので受けなくて良い気がします)
わからなかったところを、中心に対策本をもう一度読破(3回目)
試験対策用のコース、Exam Readiness シリーズのセキュリティのコース(日本語字幕版)を受講(無料)
試験対策本で載ってない部分も多少あるのと、確認試験も無料で受けられます(この時点で65%の正解率)
わからなかったところを、中心に対策本をもう一度読破(4回目)
試験対策のExam Readiness が無料で受けられるのが知ったのが受験前夜で慌てて受けましたが、こちらをやって本当によかったです。(受験前夜なのに、正解率が65%でめちゃめちゃ焦りました・・・)
勉強した期間は全部で2週間ほどでした
受験所感
今はオンラインでも受けられるのですが、私は家に子供がいたりなどの都合上オンサイトで受けました。 結果とても集中出来てよかったと思ってます。
試験時間は170分と長いので、全然余るだろうな〜と思っていましたが、問題をよく理解し考えて解くということを繰り返した結果 120分で一通り問題を解き、残りの50分で見直しというギリギリの時間でした。
また、試験終わった後のアンケートも含めて170分なので少し余裕を持って終わらせることをお勧めします。 (最後、めっちゃ急いでアンケート答えました)
また、試験を日本語で受験しても、英語で原文を見ることが出来ます。 なんかこの試験問題おかしくない?って思ったら英語でも見てみることをお勧めします!!! 自分が受けた時は英語から日本語に訳すところでサービス名が変わってしまっているものがありました・・・
受験後書
こちらの認定試験は受験料が$300と高額なので、落ちたらこの金額が無駄になってしまう〜〜〜!!と思っていたのですが、なんとか1回で合格出来てよかったです。
次回の受験半額券をもらえたので、次はdevopsあたりを受けてみようかな?と思っています。
July Tech Festa 2021 winterでGCPのセキュリティ周りについて登壇してきた
実に4年ぶりのブログになります。最近qiitaぐらいしか書いてなかったので、今年からブログを復活させようかなぁと思っております
1/24 に開催された July Tech Festa 2021 winterでGCPのセキュリティ周りについて登壇して来ました。
今まではメインの業務はデータ基盤周り中心だったのですが、ここ1年ほどセキュリティをメインに見るようになってきていましてちょうど組織のGCPセキュリティを見直していたので、ここで得られた知見の備忘も合わせて資料を作らせてもらいました。
登壇資料「GCPでセキュリティガードレールを作るための方法と推しテク」
資料補足
セキュリティ基盤を作るのにはお金かかるけど、特に売上を上げるというわけではないので予算が降りにくい会社もあるかと思います。
なので、守るだけではなくガードレールを作ってあげることでクラウドを使うユーザは事業に集中が出来、結果売上があがるという説明までつけることが大事だと思っているのであえて事業をドライブさせるといれてます
サブネットを作った際にはセキュリティ観点からフローログのonを推奨します
SecurityCommandCenterで外部からの侵入検知機能などありますが、こちらはフローログをデータソースにするのでフローログがないと検知が出来ません
ただ、フローログはonにするとログ量が増えてインフラ料金の増加につながるので、設定を見直しログ量を少なくセキュリティレベルは上げる設定に変えるのがおすすめです
集約の間隔
デフォルトだと5秒なのですが、これだとログ量が多くなってしまいます 5秒毎の通信量など細かい値を取る必要がない場合は15分の設定にするのが良いかと思います 15分の間にあった通信がサマられるだけでデータが欠損することはありませんその他のフィールド
デフォルトではメタデータを含めるになってます メタデータとは通信の相手がGCPだった場合にGCEやVPCの名前などが取れます ただ、メタデータを含めなくても重要なIPや通信量は取れるので必要ない場合は取らないで良いと思いますサンプルレート
デフォルトでは50%です 50%ではデータ欠損するので100%がおすすめです
VpcServiceControlsはセキュリティを高める上では良いソリューションですが、利便性が確実に下がります
最近対応サービスも増えて来ていますが資料に載せた情報以外にも例えばCloudAssetInventoryで設定情報取る時に、VpcServiceControlsによって取れなかったり、組織のログをすべてsinkで集約しようとしたときにVpcServiceControlsによって取れなかったりと組織に1つでもVpcServiceControlsを使っているプロジェクトがあるとセキュリティの全体設計が変わってきます
SecurityCommandCenterは組織を作るとすぐに使えます、プレミアムプランにしないかぎりは無料で使えるので見たことないひとはとりあえずどんな警告が出ているか見てみましょう
ただ、SecurityCommandCenterですべての検知をしようとすると毎日ダッシュボードを見るか、検知通知機能を独自に実装する必要があります
このような基盤を一緒に作りたい!というエンジニアを募集してますので、気になるから話しを聞いてみたいというかたは是非ともtwitterからDMお願いします
登壇動画
B2:GCPでセキュリティガードレールを作るための方法と推しテク
今回JulyTechFestaに登壇することで、資料もまとめられ基盤を見直すよい機会になりました。 運営の皆様ありがとうございました。
今年は登壇を多くしていこうと思ってますので、登壇や記事に執筆依頼などございましたらDMで連絡を頂きたいと思います