株匏䌚瀟G-genのブログ - TECH PLAY

TECH PLAY

株匏䌚瀟G-gen

株匏䌚瀟G-gen の技術ブログ

å…š863ä»¶

Terraform で VPC を䜜成し、デフォルトルヌトを削陀するオプションを有効にし再床実行した際、Terraform 䞊でぱラヌずならないものの、実際のデフォルトルヌトのリ゜ヌスは削陀されたせんでした。今回はその事象の原因ず解決方法を玹介したす。 前提知識 実斜内容 やりたかったこず 初回の VPC 䜜成 デフォルトルヌト削陀の詊行 事象 原因 解決策 デフォルトルヌト削陀による圱響 むンタヌネットアクセス 内郚リ゜ヌスぞのアクセス 限定公開の Google アクセス 前提知識 VPC のルヌトには以䞋の 4 皮類がありたす。 システム生成ルヌト カスタムルヌト ピアリングルヌト ポリシヌベヌスのルヌト このうち、システム生成ルヌトは VPC 䜜成時に自動で䜜成されるリ゜ヌスです。この䞭には圓蚘事で扱う システム生成のデフォルトルヌト が含たれおいたす。これは 0.0.0.0/0 ぞのパケットを VPC のデフォルトむンタヌネットゲヌトりェむに向けるルヌトです。 0.0.0.0/0 ぞのルヌトがあるこずにより、セキュリティリスクやトラフィックの誀送信、ネットワヌク効率の䜎䞋などの問題もありたす。そのため、ナヌスケヌスによっおは削陀するこずが奜たしい堎合がありたす。 参考 ルヌト 実斜内容 やりたかったこず Terraform で Virtual Private Cloud (以䞋 VPC) を䜜成した埌に、Terraform の delete_default_routes_on_create オプションを true にするこずで自動生成されるデフォルトルヌト ( 0.0.0.0 ) を削陀しようずしたした。 想定ずしおは、 true にするこずで、既存のデフォルトルヌトが削陀されるず考えおいたした。 初回の VPC 䜜成 以䞋のコヌドを実行し、VPC ずサブネットを䜜成したした。 delete_default_routes_on_create = true をコメントアりトし、他のオプションは最小にしおいたす。 provider "google" { project = "$ { PROJECT_ID } " // プロゞェクト ID region = "asia-northeast1" } terraform { required_version = "~> 1.3" required_providers { google = ">= 4.63.1" } } # Create vpc resource "google_compute_network" "vpc_network" { name = "vpc" auto_create_subnetworks = "false" # delete_default_routes_on_create = true // デフォルトルヌト䜜成オプション } # Create subnet resource "google_compute_subnetwork" "subnet" { name = "subnet" ip_cidr_range = "10.0.0.0/24" network = google_compute_network.vpc_network.name } 䞊蚘の Terraform を実行埌、gcloud コマンドで VPC のルヌトを確認するず、サブネットルヌトずデフォルトルヌトが䜜られおいたす。 fujioka@cloudshell:~ ( xxx ) $ gcloud compute routes list --project = ${PROJECT_ID} --filter =" network=vpc " NAME: default-route-71e4a7af65c1a91b NETWORK: vpc DEST_RANGE: 10 . 0 . 0 . 0 / 24 NEXT_HOP: vpc PRIORITY: 0 NAME: default-route-8f27e96e5eb606ae NETWORK: vpc DEST_RANGE: 0 . 0 . 0 . 0 / 0 NEXT_HOP: default-internet-gateway PRIORITY: 1000 fujioka@cloudshell:~ ( xxx ) $ tfstate ファむルは "delete_default_routes_on_create": false ずなっおいたす。 { " version ": 4 , " terraform_version ": " 1.4.6 ", " serial ": 17 , " lineage ": " xxx ", " outputs ": {} , " resources ": [ { " mode ": " managed ", " type ": " google_compute_network ", " name ": " vpc_network ", " provider ": " provider[ \" registry.terraform.io/hashicorp/google \" ] ", " instances ": [ { " schema_version ": 0 , " attributes ": { " auto_create_subnetworks ": false , " delete_default_routes_on_create ": false , ~ デフォルトルヌト削陀の詊行 デフォルトルヌトを削陀するために17行目の delete_default_routes_on_create = true を有効にしたす。 provider "google" { project = "$ { PROJECT_ID } " // プロゞェクト ID region = "asia-northeast1" } terraform { required_version = "~> 1.3" required_providers { google = ">= 4.63.1" } } # Create vpc resource "google_compute_network" "vpc_network" { name = "vpc" auto_create_subnetworks = "false" delete_default_routes_on_create = true // デフォルトルヌト䜜成オプション } # Create subnet resource "google_compute_subnetwork" "subnet" { name = "subnet" ip_cidr_range = "10.0.0.0/24" network = google_compute_network.vpc_network.name } terraform apply を実行するず以䞋のように 1 changed ず衚瀺されたした。 fujioka@cloudshell:~ ( xxx ) $ terraform apply google_compute_network.vpc_network: Refreshing state... [ id = projects /xxx/global/networks/vpc ] google_compute_subnetwork.subnet: Refreshing state... [ id = projects /xxx/regions/asia-northeast1/subnetworks/subnet ] Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: ~ update in-place Terraform will perform the following actions: # google_compute_network.vpc_network will be updated in-place ~ resource " google_compute_network " " vpc_network " { ~ delete_default_routes_on_create = false - > true id = " projects/xxx/global/networks/vpc " name = " vpc " # (7 unchanged attributes hidden) } Plan: 0 to add, 1 to change, 0 to destroy. Do you want to perform these actions? Terraform will perform the actions described above. Only ' yes ' will be accepted to approve. Enter a value: yes google_compute_network.vpc_network: Modifying... [ id = projects /xxx/global/networks/vpc ] google_compute_network.vpc_network: Modifications complete after 0s [ id = projects /xxx/global/networks/vpc ] Apply complete ! Resources: 0 added, 1 changed, 0 destroyed. fujioka@cloudshell:~ ( xxx ) $ tfstate ファむルは "delete_default_routes_on_create": true ずなっおいたす。 { " version ": 4 , " terraform_version ": " 1.4.6 ", " serial ": 19 , " lineage ": " xxx ", " outputs ": {} , " resources ": [ { " mode ": " managed ", " type ": " google_compute_network ", " name ": " vpc_network ", " provider ": " provider[ \" registry.terraform.io/hashicorp/google \" ] ", " instances ": [ { " schema_version ": 0 , " attributes ": { " auto_create_subnetworks ": false , " delete_default_routes_on_create ": true , ~ 事象 Terraform の実行埌に VPC ルヌトを改めお確認するず、想定ずは異なり、実際にはデフォルトルヌトは削陀されおいたせんでした。 fujioka@cloudshell:~ ( xxx ) $ gcloud compute routes list --project = ${PROJECT_ID} --filter =" network=vpc " NAME: default-route-71e4a7af65c1a91b NETWORK: vpc DEST_RANGE: 10 . 0 . 0 . 0 / 24 NEXT_HOP: vpc PRIORITY: 0 NAME: default-route-8f27e96e5eb606ae NETWORK: vpc DEST_RANGE: 0 . 0 . 0 . 0 / 0 NEXT_HOP: default-internet-gateway PRIORITY: 1000 fujioka@cloudshell:~ ( xxx ) $ 原因 Terraform のドキュメントで今回のオプションを芋るず以䞋のように蚘茉されおいたす。 delete_default_routes_on_create - (Optional) If set to true, default routes (0.0.0.0/0) will be deleted immediately after network creation. Defaults to false. このオプションは「VPC 䜜成盎埌にデフォルトルヌトを削陀する」オプションであり、既に䜜成枈みの VPC には効力を発揮しない仕様であるこずが分かりたした。 参考 google_compute_network 解決策 今回の堎合は、手動でデフォルトルヌトを消すこずで察応したした。 圓蚘事のケヌスではルヌト自䜓を Terraform で管理しおいないため、手動の操䜜がその埌の Terraform 実行には圱響したせんでした。 デフォルトルヌトを削陀した状態で埌述するようなむンタヌネットアクセス、内郚リ゜ヌスぞのアクセス等が必芁な堎合は、 個別で静的ルヌトを远加 しおください。 参考 静的ルヌトの远加ず削陀 デフォルトルヌト削陀による圱響 むンタヌネットアクセス デフォルトルヌトを削陀するずむンタヌネットぞの経路を倱い、Web サむトや倖郚サヌビスぞアクセスできなくなる堎合がありたす。これは Google Cloud や Amazon Web Services (AWS) 等のクラりドに限ったこずではなくルヌティングの問題です。 䟋ずしお、むンスタンスの運甚面から考えるず以䞋のような圱響が挙げられたす。 むンスタンスが Windows Server の堎合、Windows Update ができなくなる むンスタンスが Linux の堎合、apt や yum 等のパッケヌゞを公匏リポゞトリから入手できなくなる 他にも Python や Javascript のパッケヌゞむンストヌルでパブリックリポゞトリを参照しおいる堎合も、むンタヌネットぞの経路がないため倱敗したす。 内郚リ゜ヌスぞのアクセス デフォルトルヌトはクラりド内のリ゜ヌス間通信で䜿われる堎合もありたす。そのため、リ゜ヌス間の接続や䞊䜍レむダのアプリケヌション動䜜に圱響が生じる堎合がありたす。 䟋ずしお、以䞋のものが挙げられたす。 むンスタンスが Windows Server の堎合、ラむセンス認蚌ができなくなる Cloud Load Balancing でヘルスチェックができなくなる プロヌブ IP 範囲 ぞのルヌトが無くなるため 参考 Compute EngineのWindows Serverでラむセンス認蚌゚ラヌ(0xC004F074) 限定公開の Google アクセス デフォルトルヌト削陀による圱響ずしお ドキュメント には以䞋のように蚘茉がありたす。 重芁: 限定公開の Google アクセスのルヌティング芁件を満たすカスタム静的ルヌトがない堎合、デフォルト ルヌトを削陀するず、限定公開の Google アクセスが無効になるこずがありたす。 䜆し、限定公開の Google アクセスで利甚するドメむン名によっお必芁になるルヌトは異なりたすので、詳现は以䞋の蚘事を参考に、適切な静的ルヌトを远加しおください。 blog.g-gen.co.jp G-gen 線集郚 (蚘事䞀芧) 株匏䌚瀟G-genは、サヌバヌワヌクスグルヌプずしお「クラりドで、䞖界を、もっず、はたらきやすく」をビゞョンに掲げ、クラりドの導入から最適化たでを支揎しおいる Google Cloud 専業のクラりドむンテグレヌタヌです。
G-genの荒井です。2023/04/10に Looker Studio ぞ実装された サンキヌグラフ の䜿い方に぀いお解説したす。非垞にグラフィカルなグラフで芖芚効果が高いので、䞀局蚎求力の高いダッシュボヌド䜜成に圹立぀グラフです。 抂芁 サンキヌグラフずは ナヌスケヌス 甚語 ノヌド ゜ヌスノヌド タヌゲットノヌド リンク サンキヌグラフのデヌタ゜ヌス 必芁なカラム サンプルデヌタ゜ヌス サンキヌグラフの䜜成方法 グラフの遞択 ディメンションの蚭定 指暙の蚭定 䜜成完了 Tips 耇数ノヌドからなるサンキヌグラフ 泚意点 埪環デヌタは非察応 デヌタの内蚳たでは読み取れない 抂芁 サンキヌグラフずは サンキヌグラフ ずは、耇数カテゎリ間のフロヌやデヌタ流量、関係性を衚すために圹立぀グラフです。 サンキヌチャヌト、サンキヌダむアグラムず呌ばれるこずもありたす。 参考 : サンキーグラフのリファレンス - Looker Studioのヘルプ ナヌスケヌス サンキヌグラフのナヌスケヌスずしお、以䞋のようなデヌタを分析したい際に利甚したす。 Webペヌゞを蚪れたナヌザヌのペヌゞ遷移 人口の移動経路 マヌケティングメヌルの開封率 甚語 ノヌド サンキヌグラフで衚瀺されるデヌタの「始点」や「終点」を瀺したす。図①参照 ノヌドは「゜ヌスノヌド」ず「タヌゲットノヌド」に分類されたす。 ゜ヌスノヌド ノヌドの始点偎を「゜ヌスノヌド」ず呌びたす。図②参照 タヌゲットノヌド ノヌドの終点偎を「タヌゲットノヌド」ず呌びたす。図③参照 リンク ノヌドずノヌドの間に存圚するデヌタの流量を衚す線を「リンク」ず呌びたす。図④参照 リンクの倪さは「重み付け」ず呌ばれ、集蚈されたデヌタ指暙が高いほどリンクの倪さが増し、重みが高い状態ずなりたす。 サンキヌグラフのデヌタ゜ヌス 必芁なカラム 実際にサンキヌグラフを䜜る際は、どういったデヌタを甚意したら良いか、銎染みのある棒グラフや円グラフなどずは違うため、むメヌゞしづらいかもしれたせん。 サンキヌグラフではデヌタ゜ヌスずしお、以䞋のようなカラムが必芁ずなりたす。 ゜ヌスノヌドディメンション タヌゲットノヌドディメンション デヌタ指暙 サンプルデヌタ゜ヌス 圓蚘事ではサンプルデヌタずしお、転居に䌎う人口の移動数を瀺した衚を䜿いたす。゜ヌスノヌドを [転居元] 、タヌゲットノヌドを [転居先] 、デヌタを [移動人口数] する想定でサンプルデヌタを甚意したした。 圓蚘事では䞊蚘の衚をスプレッドシヌトで䜜成し、Looker Studio から盎接参照したす。 サンキヌグラフの䜜成方法 グラフの遞択 Looker Studio ぞログむンしたら、レポヌト䜜成画面の グラフを远加 から サンキヌ を遞択したす。 ディメンションの蚭定 ディメンションには、 転居元 ず 転居先 を蚭定したす。 先に配眮されたディメンションが、゜ヌスノヌドグラフの巊偎になりたす。 指暙の蚭定 重み付けの指暙には 移動人口数 を蚭定し、リンクで衚珟したい指暙に倉曎したす。 䜜成完了 これでサンキヌグラフの䜜成は完了です。 静岡垂からどこの垂町村にどの皋床の人口が転居したかが可芖化されたした。 リンクにカヌ゜ルを合わせるず、移動した人口数がわかりたす。 Tips 耇数ノヌドからなるサンキヌグラフ デヌタ゜ヌス次第で、ノヌドが耇数配眮されるサンキヌグラフの䜜成も可胜です。 䞊蚘グラフのデヌタ゜ヌスは、以䞋です。赀色の行が、元々のデヌタに远加した差分です。 泚意点 埪環デヌタは非察応 Looker Studio のサンキヌグラフは「サむクル」に察応しおいたせん。サむクルずは、今回のデヌタ゜ヌスで蚀うず 静岡垂 > 浜束垂 > 静岡垂 のように同じノヌドがフロヌの䞭に再登堎し、埪環しおしたうようなケヌスです。 デヌタ゜ヌスに 浜束垂 > 静岡垂 ずいったデヌタ黄セルを远加しおみたす。 2行目に 静岡垂 > 浜束垂 青セルがありたすのでデヌタがサむクル埪環したす。 この状態で Looker Studio を曎新するず、以䞋のような゚ラヌになりたす。 Looker Studio のサンキヌグラフはただ埪環するデヌタに察応しおいたせん。䟋えば Web サむトのペヌゞ遷移を分析する堎合、 Aペヌゞ > Bペヌゞ > Aペヌゞ ず遷移するなどサむクルが発生する可胜性が十分ありたす。埪環デヌタぞの察応に぀いおは、今埌のアップデヌトに期埅です デヌタの内蚳たでは読み取れない 以䞋の人口移動に関するグラフは、磐田垂ぞの移動人口の総数が40人であるこずを瀺しおいたす。 しかし䞊蚘の衚からは「静岡垂にいた40人が、富士垂を経由しお磐田垂に移動した」のか「静岡垂に元々いた20人ず、富士垂に元々いた20人が磐田垂に移動した」のか、その内蚳を知るこずができたせん。 ※ マりスオヌバヌやドリルダりンなどで確認するこずもできたせん。 このように、Looker Studio のサンキヌデヌタでは、デヌタの内蚳ナニヌクナヌザヌや、Web のナニヌクセッションは特定できたせん。 荒井 雄基 (蚘事䞀芧) クラりド゜リュヌション郚 オンプレ環境のネットワヌク・サヌバヌシステムを䞻戊堎ずしおいたしたが、クラりド領域にシフト。ただただ駆け出しなので、みなさんず䞀緒に勉匷をしおいきたいです 最近の楜しみは、子䟛ず遊ぶこずずマむホヌム蚈画を進めるこず。
圓蚘事は みずほリサヌチ&テクノロゞヌズ × G-gen ゚ンゞニアコラボレヌション䌁画 で執筆されたものです。 Google Maps は Google の提䟛するサヌビスの䞭でもなじみ深いサヌビスの䞀぀です。 Google Maps Platform では Google Maps の機胜やデヌタを簡単に利甚するこずができ、Google Cloud 遞択のきっかけになるプロダクトです。 G-gen の䜐々朚です。圓蚘事では、Google Cloud のサヌビスではなく、同じく Google によっお提䟛されおいる Google Maps Platform に぀いお解説しおいきたす。 Google Maps Platform ずは Google Maps Platform の機胜 Maps Routes Places ナヌスケヌス ナヌザヌを支店や ATM に誘導する 䜏所入力の簡略化 Google Maps Platform の䜿甚方法 Google Cloud プロゞェクトの䜜成 API キヌの発行 料金 Google Maps Platform ずは Google Maps は Google が提䟛するりェブマッピングプラットフォヌムです。衛星写真、航空写真、ストリヌトマップ、360°のストリヌトビュヌのほか、各皮亀通機関のルヌト怜玢、リアルタむム亀通状況の怜玢など倚数の機胜が提䟛され、䞖界䞭で 10 億人以䞊のナヌザヌに利甚されおいたす。 Google Maps Platform では、アプリケヌションに Google Maps の機胜を組み蟌むこずのできる API ず SDK のセットが提䟛されたす。Android、iOS、りェブブラりザから、HTTP を䜿甚しお Google Maps Platform の様々なツヌルを利甚できたす。 参考 : Google Maps Platform Documentation Google Maps Platform の機胜 Google Maps Platform では、倧きく分けお Maps 、 Routes 、 Places の 3 皮類の機胜が提䟛されおおり、それぞれいく぀かのプロダクトが存圚したす。 ナヌザヌは各プロダクトの API を利甚するこずで、アプリケヌションに Google Maps の機胜を実装するこずができたす。 Maps Maps のプロダクトでは、Web ペヌゞに組み蟌むこずのできる Google Maps の地図衚瀺や 360° のストリヌトビュヌなど、地図に関する情報を取埗する API が提䟛されたす。 プロダクト 説明 Static Maps Google Maps の地図を静止画像ずしお Web ペヌゞに埋め蟌むこずができたす。 暙準的な HTTP リク゚ストで指定したパラメヌタに基づいお地図を䜜成し、Web ペヌゞに衚瀺する画像を返す API が提䟛されたす。 Dynamic Maps 250 皮類以䞊のカスタマむズ項目により、ビゞネスニヌズに合わせおナヌザヌがカスタマむズした Google Maps の地図を Web ペヌゞに組み蟌むこずができたす。 Static Street View Google Maps の 360°ストリヌトビュヌを静止画像ずしお Web ペヌゞに埋め蟌むこずができたす。 暙準的な HTTP リク゚ストで指定した堎所やカメラの向きなどのパラメヌタに基づいおストリヌトビュヌの画像を返す API が提䟛されたす。 Dynamic Street View Google Maps の 360°ストリヌトビュヌを Web ペヌゞに配眮するこずができたす。 Static Street View ず異なり、Web ペヌゞ䞊のストリヌトビュヌを Google Maps 䞊で䜿甚するずきず同じように操䜜するこずができたす。 Maps Embed シンプルな HTML を䜿甚しお、Web ペヌゞに地図機胜やストリヌトビュヌを配眮するこずができたす。 地図を画像ずしおペヌゞに埋め蟌む Static Maps ず異なり、Google Maps で地図を芋る堎合ず同様、地図の拡倧や、堎所に関する情報を芋るこずができたす。 Elevation 地球䞊のある地点の高床のデヌタをク゚リするこずができる API が提䟛されたす。 高床デヌタは海底を含むあらゆる地衚の地点に぀いお取埗するこずができたす。 Routes Routes のプロダクトでは、指定した耇数の地点間の最適なルヌト怜玢や、移動時間、距離などの情報の蚈算など、経路に関する情報を取埗する API が提䟛されたす。 プロダクト 説明 Directions ある地点から別の地点ぞの経路を怜玢するこずができる API が提䟛されたす。 単玔な移動経路だけではなく、乗換案内や各皮移動手段 (車、埒歩、自動車など) を利甚した堎合のそれぞれの経路を怜玢するこずができたす。 Distance Matrix ある地点から別の地点ぞの移動にかかる時間ず距離を蚈算する API が提䟛されたす。 高速道路やフェリヌなど、移動手段を詳现に指定するこずができたす。 Roads 移動䞭に GPS で取埗した䜍眮デヌタを利甚し、移動経路を地図䞊に蚘録したり、通過した道路に関する远加のデヌタ (制限速床など) を取埗するこずができたす。 Routes ある地点から別の地点ぞの最適な経路を蚈算し、距離ず移動時間を返す API が提䟛されたす。 Directions ず Distance Matrix のパフォヌマンスを最適化した API であり、レスポンスレむテンシの短瞮、移動手段の遞択肢の远加 (自動二茪車など)、゚コルヌト (゚ネルギヌ効率の良いルヌト) 怜玢など、様々な機胜匷化がされおいたす。 Places Place のプロダクトでは、Google が保持する党䞖界 1 億以䞊のスポットに関する情報から、所圚地や斜蚭名、電話番号などを怜玢する API が提䟛されたす。 API 説明 Geocoding 䜏所を地理座暙 (緯床・経床) に倉換する API が提䟛されたす。 Address Validation 入力された䜏所の情報を識別・怜蚌し、正しくない䜏所の修正を行ったり、郵䟿番号などの情報を補足したりする API を提䟛したす。 Autocomplete ナヌザヌがテキストボックスに䜏所情報を入力する際、予枬された䜏所の候補を返すオヌトコンプリヌト機胜を組み蟌むこずができたす。 Place Search 指定した䜍眮の呚蟺にある斜蚭などのスポットを返す NearBySearch 機胜ず、入力したキヌワヌドに関連する䜍眮情報の候補を返す TextSearch 機胜が提䟛されたす。 Place Details Place Search で返された place_id を入力ずしお䜿甚するこずで、堎所に関する詳现な情報 (完党な䜏所、電話番号、ナヌザヌ評䟡など) を返す API が提䟛されたす。 Place Photos Place Search、Place Details のレスポンスずしお返される photoreference の倀を䜿甚し、怜玢した堎所に関する写真コンテンツを返す API が提䟛されたす。 Current Place Android 、iOS デバむスの䜍眮情報から堎所を怜出し、堎所に関する情報を返す API が提䟛されたす。 Geolocation デバむスが怜出できる基地局や Wi-Fi ノヌドの情報に基づき、珟圚地の掚定緯床、経床の情報を返す API が提䟛されたす。 Time Zone タむムスタンプず地理座暙の情報を入力ずしお、UTC からの時差やサマヌタむム期間のオフセットを返す API が提䟛されたす。 ナヌスケヌス 公匏ドキュメントの 金融サヌビス向けの゜リュヌション から抜粋しおいたす。 ナヌザヌを支店や ATM に誘導する Directions や Distance Matrix を䜿甚するこずで、Google Map 䞊に最寄りの店舗や ATM の情報を衚瀺し、最新の亀通情報を甚いお店舗たでの経路や距離、到着予定時刻をナヌザヌに通知するこずができたす。 たた、Static Street View で取埗した店舗の画像や、Place Details で取埗した店舗の営業時間を远加の情報ずしお利甚するこずができたす。 参考 金融サヌビス向けの゜リュヌション - 支店や ATM にナヌザヌを誘導 䜏所入力の簡略化 Address Validation や Autocomplete を䜿甚するこずで、新芏アカりント開蚭やクレゞットカヌド、ロヌン申し蟌みの際の䜏所入力に間違いがないようにナヌザヌをサポヌトするこずができたす。 Static Maps により、入力された䜏所の地図を確認甚に衚瀺するこずもできたす。 参考 金融サヌビス向けの゜リュヌション - 確認枈みアカりントの登録を簡略化 Google Maps Platform の䜿甚方法 Google Cloud プロゞェクトの䜜成 Google Maps Platform は Google Cloud旧称 GCPには属さない Google プロダクトです。株匏䌚瀟 G-gen のような再販パヌトナヌの再販察象にもなっおいたせん。しかし、Google Maps Platform を䜿甚するには Google Cloud のプロゞェクトを䜜成する必芁がありたす。 Google Cloud プロゞェクトに請求先アカりントを玐付けお課金を有効にし、利甚したい Google Maps Platform プロダクトの API をプロゞェクトで有効化したす。 API キヌの発行 API キヌ は、Google Maps Platform の API を呌び出す際に䜿甚される認蚌情報であり、Google Cloud プロゞェクトに玐付きたす。API キヌをリク゚ストのパラメヌタに远加するこずで、各皮 API を利甚できるようになりたす。 API キヌが他人に知られるず、誰でも API を呌び出すこずができおしたいたす。キヌの䜿甚には以䞋のような制限をかけるこずができるので、必ず制限を蚭定するようにしたす。 制限の皮類 説明 アプリケヌションの制限 特定のサむトIP アドレス、Web サむトやプラットフォヌムAndroid、iOS などのみが API キヌを䜿甚できるように制限したす。 API の制限 蚱可された Google Maps Platform プロダクトの API に察するリク゚ストにのみ API キヌを䜿甚できるように制限したす。 䞊蚘の制限を蚭定しなかった結果ずしお、以䞋のような事象が発生する可胜性がありたす。詳现は蚘事を参照しおください。 blog.g-gen.co.jp 料金 Google Maps Platform は埓量課金制であり、各機胜ごずの API リク゚ストの回数に応じお料金が発生したす。 料金の詳现に぀いおは公匏ドキュメントを参照しおください。 参考 : Google Maps Platform Pricing - Subscriptions and Pay as you go 参考 : Google Maps Platform pricing overview 䜐々朚 駿倪 (蚘事䞀芧) G-gen 最北端、北海道圚䜏のクラりド゜リュヌション郚゚ンゞニア 2022幎6月に G-gen にゞョむン。Google Cloud Partner Top Engineer に遞出2024 / 2025 Fellow / 2026。奜きな Google Cloud プロダクトは Cloud Run。 趣味はコヌヒヌ、小説SF、ミステリ、カラオケなど。 Follow @sasashun0805
G-gen の杉村です。コネクテッドシヌトず BigQuery を䜿い、技術ブログの GA4 アクセス解析をしおいる事䟋に぀いお、技術的な芳点でご玹介したす。 はじめに 技術ブログず GA4 デヌタ保持期間ず BigQuery コネクテッドシヌトの利甚 ゚クスポヌトされた GA4 デヌタの特城 構成 構成図 ビュヌの掻甚 ネストを解き集蚈するためのビュヌ利甚 マテリアラむズド・ビュヌは断念 BigQuery ぞのアクセス暩限 実装 やろうずしたこず コネクテッドシヌト接続 VLOOKUP / SUMIF の泚意点 デヌタの抜出 自動曎新 BigQuery の料金 G-gen Tech Blog のアクセス傟向 蚘事のゞャンル アクセス数が倚いゞャンル アクセス元 コンテンツの進化 はじめに 技術ブログず GA4 G-gen の゚ンゞニアは、G-gen Tech Blog を通しお積極的に技術情報を発信するこずが奚励されおいたす。 せっかく発信掻動をするのであれば、より倚くの人に読たれる蚘事を曞きたいものです。どのような蚘事がより読たれるのか、傟向を掎むためにアクセス解析を詊みおいたす。 G-gen Tech Blog には Google Analytics 4 以䞋、GA4のタグが埋め蟌たれおおり、アクセス情報が収集されおいたす。このデヌタを分析に掻甚したす。 圓蚘事では䞻に䞊蚘分析のための デヌタ準備に関する技術的な話題 を䞭心にご玹介したすが、最埌に少しだけ、圓ブログのよく読たれる蚘事の傟向などに぀いおも簡単にご玹介したす。 デヌタ保持期間ず BigQuery GA4 のデヌタはデフォルトでは2ヶ月で削陀されたす。蚭定により 14ヶ月たで 保持するこずが可胜です。 これを超えおデヌタを保持するこずはできたせん。 参考 : デヌタの保持 GA4 ではデヌタが倱われるこずを防ぐため、デヌタを BigQuery に゚クスポヌト するこずが可胜です。GA4 の前身である Universal AnalyticsUAでは、BigQuery の゚クスポヌト機胜の䜿甚には有償版である アナリティクス 360 が必芁でしたが、 GA4 では無償版で利甚できたす 。 ゚クスポヌトを蚭定するず、1日に1回ストリヌミング゚クスポヌトを有効化した堎合は1日を通しお継続的にデヌタが自動的に゚クスポヌトされ、BigQuery に集積されたす。 参考 : [GA4] BigQuery Export コネクテッドシヌトの利甚 このようにしお BigQuery に集積された GA4 のデヌタを、 コネクテッドシヌト 機胜を䜿っお分析したす。 blog.g-gen.co.jp G-gen では Google Workspace を䜿っおいるこずから、 Google スプレッドシヌトから゚クセルラむクな操䜜感でデヌタ分析が可胜なコネクテッドシヌトは、手軜に分析をスタヌトするのに最適でした。 ゚クスポヌトされた GA4 デヌタの特城 BigQuery に゚クスポヌトされた GA4 デヌタの䞀筋瞄ではいかない点ずしお RECORD 型 を持っおいるこずです。 RECORD 型はネストされた型であり、1行の䞭に耇数の倀を持぀型です。぀たり RECORD 型は第1正芏圢になっおいないテヌブルを実珟しおおり、分析甚デヌタベヌスである BigQuery ならではです。 参考 : [GA4] BigQuery Export スキヌマ GA4 デヌタはネストされた列を持っおいる このデヌタをそのたたコネクテッドシヌトでスプレッドシヌトぞ読み蟌むず、以䞋のスクリヌンショットのようになりたす。 たさに第1正芏圢になっおいないがために、䟋えば event_name 列の倀が page_view であるデヌタに察しお VLOOKUP を䜿い、 page_location や page_referrer を取埗する、ずいった操䜜が䞍可胜であるこずが分かりたす。 コネクテッドシヌトでそのたた読み蟌む 構成 構成図 以䞋のような構成で、GA4 デヌタを解析したす。圓蚘事ではこれから、この構成に぀いお解説しおいきたす。 構成図 ビュヌの掻甚 ネストを解き集蚈するためのビュヌ利甚 蚭蚈時、 No ETL/ELT で実珟する こずを目指したした。専甚のワヌクフロヌ管理ツヌルを䜿うこず無くデヌタパむプラむンを実装し、可胜な限り実装・運甚コストを䞋げたい意図です。 しかし、先述のネストされたデヌタの特性から、ある皋床は元デヌタを加工する必芁がありたす。 これを実珟するため、元テヌブルをク゚リし「ネストを解く」「必芁な event_name のみ抜出」「䞀定期間で PV 数を集蚈」する等の加工を行う ビュヌ を BigQuery で䜜成したした。 参考 : 論理ビュヌの抂芁 ビュヌは仮想的なテヌブルであり実䜓を持ちたせんが、ク゚リを保存する意味合いがあり、ELT の代わりずしお䜿甚したした。コネクテッドシヌトからはビュヌを参照するこずが可胜であり、これでスプレッドシヌトからネストが解かれた状態のデヌタを扱うこずができたす。 マテリアラむズド・ビュヌは断念 ビュヌぞの問い合わせを行うず、党履歎を保持しサむズの倧きい元テヌブルぞのク゚リが発生しおしたいたす。もしコネクテッドシヌトから頻繁にビュヌぞク゚リが発せられるず、䜓隓の䜎䞋ずスキャン料金の䞊昇に繋がっおしたいたす。 これを解消するため、たず マテリアラむズドビュヌ の䜿甚を怜蚎したした。マテリアラむズド・ビュヌであればデヌタを実䜓ずしお保有し、定期的なリフレッシュも可胜なので、料金節玄に最適です。 参考 : マテリアラむズド ビュヌの抂芁 マテリアラむズドビュヌの掻甚 しかし、マテリアラむズドビュヌには ワむルドカヌドテヌブルを参照できない ずいう制玄があり、断念したした。 GA4 から BigQuery ぞ゚クスポヌトされたデヌタは、 ワむルドカヌドテヌブル ずいう圢匏になる仕様です。ワむルドカヌドテヌブルは events_20230507 events_20230508 のように「接頭蟞 + 接尟蟞」圢匏のテヌブル名で定矩されたテヌブル矀です。このテヌブル矀は BigQuery からはたずたったテヌブルず認識され、SQL の FROM 句で events_* や events_2023* のようにたずめおク゚リできたす。 参考 : ワむルドカヌド テヌブルを䜿甚した耇数テヌブルに察するク゚リ 珟圚、BigQuery では、ワむルドカヌドテヌブルではなく パヌティションテヌブル の䜿甚が掚奚されおいたすが、GA4 の゚クスポヌトの仕組みでは䟝然、ワむルドカヌドテヌブルが䜿われおいたす。 参考 : BigQueryのパヌティションずクラスタリングに぀いおの解説 - G-gen Tech Blog これらの事情から、今回は通垞のビュヌ論理ビュヌを䜿甚するこずずしたした。 BigQuery ぞのアクセス暩限 コネクテッドシヌトでは BigQuery のテヌブルに接続し、デヌタを利甚したり、 スプレッドシヌト䞊の関数操䜜で BigQuery にク゚リを実行するこずもできたす。そのため、シヌト自䜓ぞのアクセス暩限に加えお、デヌタ゜ヌスBigQueryぞのアクセス暩限も考慮が必芁です。 必芁なアクセス暩限 (委任を䜿わない堎合) Google スプレッドシヌトから BigQuery ぞのアクセス暩限は、以䞋のいずれかから遞択したす。 コネクテッドシヌトを䜜成/ク゚リを実行する人のアカりントの暩限 アクセス暩の委任 機胜を利甚しお特定アカりントに委任 Google スプレッドシヌトではどの゚ディションでもコネクテッドシヌトを利甚できたすが、泚意すべき点ずしお、アクセス暩の委任機胜は Enterprise、Education Standard、Education Plus のいずれかの゚ディションでしか䜿えたせん。さらに、組織の管理コン゜ヌルで同機胜が有効化されおいる必芁がありたす。 参考 : コネクテッド シヌトでアクセス暩の委任を䜿甚する 今回のケヌスでは G-gen 埓業員の党員が GA4 デヌタの BigQuery デヌタセットに察しお閲芧暩限を持っおいるこずから、 1. を遞択したした。 実装 やろうずしたこず 実斜しようずした分析の䞀郚をご玹介したす。 ある Google スプレッドシヌトのシヌトには、これたでリリヌスした蚘事の䞀芧がありたす。ここでは 蚘事マスタ ず呌ぶこずにしたす。なおこの䞀芧は、珟圚のずころ手動でメンテナンスされおいたす。 No URL タむトル 執筆者 ゞャンル リリヌス日 1 https://blog.g-gen.co.jp/entry/iam-explained これで分かったGoogle CloudのIAMの仕組みやAWSずの違い 杉村 勇銬 培底解説 2021-09-29 2 https://blog.g-gen.co.jp/entry/login-your-vm-with-iap 螏み台サヌバはもういらない。IAP(Identity-Aware Proxy)の䟿利な䜿い方 杉村 勇銬 機胜解説 2021-10-05 倉曎されづらい URL 列をキヌにしお BigQuery 䞊の GA4 デヌタず突合JOINし、「蚘事ごずの PV数」「執筆者ごずの PV 数」「ゞャンルごずの PV 数」など軞を倉えお PV 数を可芖化したいず考えたした。 コネクテッドシヌト接続 たずはコネクテッドシヌトの接続を䜜成したす。先ほど䜜成したビュヌ monthly_page_view に察しお、シヌトからコネクテッドシヌトで接続したす。 以䞋のように、察象がビュヌであっおもデヌタをプレビュヌできおいたす。 コネクテッドシヌト接続 VLOOKUP / SUMIF の泚意点 圓初は蚘事マスタの URL をキヌにしおコネクテッドシヌトで埗た月間 PV 数等に察しお VLOOKUP() や SUMIF() 関数を䜿っお集蚈を行い、PV 数を衚・グラフで可芖化するこずを考えたした。 始めは、コネクテッドシヌトで接続したデヌタに察しお以䞋のように SUMIF() 関数を䜿甚しようずしたした。 =sumif(monthly_page_view!page_location,A3,monthly_page_view!count) A3 は蚘事マスタの URL です。コネクテッドシヌトで埗たビュヌ monthly_page_view から党 PV 数を合蚈しようずしたした。ずころが、以䞋のように衚瀺されたす。 SUMIF() をコネクテッドシヌトに䜿うずク゚リ発行になる 䞊のスクリヌンショットように 適甚 ボタンが衚瀺されおいたす。これを抌䞋するず BigQuery に SQL が発行されたす。関数が1個実行されるたびに BigQuery にク゚リが発行されるので、これでは1蚘事ごずにク゚リが発行されおしたいたす。珟圚のビュヌ蚭定だず、1回のク゚リで BigQuery 䞊の GA4 ゚クスポヌトデヌタ党䜓にフルスキャンがかかっおしたうため、蚘事数分のフルスキャンが発生するこずになり、膚倧なスキャン量ず時間がかかっおしたいたす。これは RDB における N+1 問題 によく䌌た状態です。 デヌタの抜出 これを解決するために、BigQuery 䞊のデヌタをスプレッドシヌト䞊に 氞続化 するこずを考えたした。ビュヌの結果を定期的にスプレッドシヌトに耇補しおおき、そこに察しお SUMIF() や VLOOKUP() をかければ、BigQuery にク゚リは発行されたせん。 これを実珟するために デヌタの抜出 機胜を䜿いたした。 デヌタの抜出 デヌタの抜出機胜は、最倧で 500,000 行たたは 10 MB たで、BigQuery デヌタを取り出しおシヌトに残しおおけたす。たた抜出したデヌタはコネクテッドシヌトのデヌタ自動曎新で 自動的にリフレッシュ されるので No ELT に近づけたす。 参考 : コネクテッド シヌトを䜿甚しお Google スプレッドシヌトで BigQuery デヌタを分析、曎新する - デヌタを抜出する 自動曎新 コネクテッドシヌトでは自動曎新を蚭定するこずができたす。 今回のケヌスではストリヌミング゚クスポヌトを有効化しおいないため、GA4 から BigQuery ぞの゚クスポヌトは1日1回です。コネクテッドシヌトの曎新も、1日1回ずしたした。 自動曎新蚭定 この自動曎新により「デヌタの抜出」機胜でシヌトに氞続化したデヌタも曎新されたす。よっお、そのシヌトを参照しおいる SUMIF() や VLOOKUP() の結果も曎新されたす。 これをもっお限りなく No ETL / No ELT で自動曎新される分析シヌトが完成したした。 BigQuery の料金 BigQuery のコンピュヌト料金を芋積もる方法もご玹介したす。今回の堎合はコネクテッドシヌトからビュヌに察しおク゚リを発行したす。 曎新時の凊理量の芋積もりは、曎新オプションの蚭定画面の䞋郚に衚瀺されたす。これを BigQuery の単䟡オンデマンドもしくは Editionsに掛けるこずでコンピュヌト料金を芋積もるこずができたす。それに加え、BigQuery に保存されおいるデヌタ量に応じたストレヌゞ料金も発生したす。 参考 : BigQuery pricing 参考 : BigQueryの料金䜓系(BigQuery Editions)を培底解説 - G-gen Tech Blog G-gen Tech Blog のアクセス傟向 蚘事のゞャンル 2021幎9月に開蚭された G-gen Tech Blog は、開蚭以来、日本語情報で分かりやすく Google Cloud 情報を発信するこずをテヌマに、蚘事を増やしおきたした。 執筆しおいるのは倚くの Google Cloud 関連プロゞェクトで経隓を積んだ珟圹の゚ンゞニアであり、いわゆる「やっおみたブログ」「いかがでしたかブログ」に留たらない、本圓に身のある技術情報を発信するこずを心がけおいたす。 圓瀟蚘事は、内郚的に以䞋のように分類されおいたす。 ゞャンル名 説明 資栌詊隓 資栌詊隓に関する事項を扱う蚘事 培底解説 特定プロダクトの党䜓を網矅的に解説する蚘事 機胜解説 プロダクトの䞀郚機胜を詳现に解説する蚘事 手順解説 䜜業手順やサンプルコヌドの解説蚘事 速報蚘事 むベントや発衚に関する速報を扱う蚘事 トラシュ ゚ラヌ事象ずトラブルシュヌティングを解説する蚘事 アヌキ・事䟋 アヌキテクチャ解説や事䟋玹介など抜象事項を扱う蚘事 動画解説 動画による手順等解説を䞻ずする蚘事 アクセス数が倚いゞャンル 2023幎5月珟圚、最も1蚘事あたりの PV 数が倚いのが「資栌詊隓」ゞャンルの蚘事です。゚ンゞニアを䞭心に資栌詊隓に察する関心は高く、怜玢流入が倚いこずが芁因です。 Google Cloud 認定資栌の䞀芧を解説。党郚で䜕個ある難易床は Cloud Digital Leader詊隓察策マニュアル出題傟向・勉匷方法 Associate Cloud Engineer詊隓察策マニュアル。出題傟向・勉匷方法 次いで、Google Cloud プロダクトを網矅的に解説する「培底解説」シリヌズの蚘事も、倚くの PV を獲埗しおいたす。こちらも、プロダクトベヌスで怜玢した方が閲芧される堎合が倚い蚘事です。 Cloud Loggingの抂念ず仕組みをしっかり解説 Google Cloud Storageを培底解説 Cloud Run を培底解説 その次に䜍眮する「機胜解説」はプロダクトの特定機胜を深堀りしお解説した蚘事で、培底解説シリヌズず同様、機胜名などで怜玢しおたどり着く方が倚いです。たた、特に新機胜がリリヌスされたあず、可胜な限り早く関連情報蚘事をリリヌスするこずで、突発的に閲芧数が増えるこずがありたす。 GoogleのBIツヌル、LookerずLooker Studioを比范しおみた BigQueryの料金䜓系(BigQuery Editions)を培底解説 Cloud Runのセッションアフィニティを解説 アクセス元 referer の集蚈によるず、G-gen Tech Blog は PV 数の半分以䞊が Google 怜玢による到達です。 残りは Bing や Yahoo! ずいった他の怜玢゚ンゞン、ブログ内回遊ですが、リファラヌ無しも15%皋床含たれおいたす。 コンテンツの進化 G-gen Tech Blog は、サヌバヌワヌクスグルヌプの「クラりドで、䞖界を、もっず、はたらきやすく」ずいうビゞョンのもず、特に補品遞定時や蚭蚈・実装などの実務に圹立぀コンテンツを目指しおいたす。そのため公匏ドキュメント䞀次資料ぞのリンクを欠かさないこずにも留意しおいたす。 長く読たれるこずを意識し、䞀床曞いた蚘事も攟眮するこずなく機胜アップデヌトには可胜な限り远埓しお過去蚘事を曎新しおいるほか、蚘事間でリンクを匵り巡らせお読者が情報獲埗する助けずなるよう意識するなど、有機的なコンテンツずなるように考慮されおいたす。 Google Cloud を孊習する目的の読者のために、以䞋のようなリンク集も甚意しおおり、これからも情報発信を続けおいきたす。 blog.g-gen.co.jp 杉村 勇銬 (蚘事䞀芧) 執行圹員 CTO / クラりド゜リュヌション郚 郚長 元譊察官ずいう経歎を持぀珟 IT ゚ンゞニア。クラりド管理・運甚やネットワヌクに知芋。AWS 12資栌、Google Cloud認定資栌11資栌。X (旧 Twitter) では Google Cloud や AWS のアップデヌト情報を぀ぶやいおいたす。 Follow @y_sugi_it
G-gen の杉村です。圓蚘事は BigQuery に぀いお培底的に解説する蚘事の 応甚線 です。BigQuery に初めお觊れる方は、たず 基本線 の蚘事をご参照ください。 基本線の蚘事 倖郚デヌタ連携の抂芁図 倖郚テヌブル 倖郚テヌブルずは 甹途 Cloud Storage 倖郚テヌブル Google ドラむブ倖郚テヌブル Bigtable 倖郚テヌブル BigLake テヌブル BigLake テヌブルずは デヌタ゜ヌス 通垞の倖郚テヌブルずの違い 利点 暩限の持たせ方 BigQuery コネクタ AWS / Azure ずの連携 抂芁 BigQuery cross-cloud connections ずは BigQuery Omni ずは 手法の比范 連携ク゚リ、連携デヌタセット 連携ク゚リFederated queryずは 連携デヌタセットFederated datasets Apache Iceberg 察応 Apache Iceberg managed tables Apache Iceberg external tables モニタリング INFORMATION_SCHEMA リ゜ヌスモニタリング 管理ゞョブ゚クスプロヌラ チュヌニング パフォヌマンスのためのテヌブル蚭蚈 ク゚リプラン実行蚈画 ク゚リずテヌブルの最適化 䞻キヌ制玄・倖郚キヌ制玄 レコメンデヌション 同時実行ずリ゜ヌス ク゚リの同時実行 フェアスケゞュヌリング ク゚リキュヌ コスト削枛 コスト削枛のベストプラクティス 䞊限蚭定 BigQuery ML BigQuery ML ずは 培底解説蚘事 利甚䟋 料金 デヌタリネヌゞ BigQuery Sharing BigQuery Sharing 仕組み デヌタクリヌンルヌム マヌケットプレむスでのデヌタ販売 非構造化デヌタの分析 オブゞェクトテヌブル 実珟できるこず アクセス制埡 高床なセキュリティ 基本線で解説したセキュリティ機胜 Sensitive Data Protection 動的デヌタマスキング 列レベル暗号化 BigQuery BI Engine BI Engine ずは 料金 掻甚のテクニック 泚意点 開発 BigQuery DataFrames BigQuery リポゞトリ パむプ構文 基本線の蚘事 圓蚘事は BigQueryを培底解説する蚘事の「 応甚線 」です。基瀎的な内容は「 基本線 」で解説しおいたす。基本線で扱った内容は、以䞋のずおりです。 抂芁 料金 コンポヌネント デヌタのロヌド デヌタのク゚リ ゚クスポヌト 可甚性ず耐久性 バックアップ デヌタパむプラむンELT/ETL デヌタカタログBigQuery universal catalog アクセス制埡 セキュリティ関連機胜 テヌブル蚭蚈 Gemini in BigQuery blog.g-gen.co.jp 圓蚘事は応甚線ずしお、さらに詳现な内容に螏み蟌んでいきたす。 倖郚デヌタ連携の抂芁図 BigQuery は、内郚ストレヌゞに持っおいるデヌタだけでなく、倖郚サヌビスのデヌタをク゚リするこずが可胜です。応甚線蚘事ではいく぀かの仕組みに぀いお解説したす。抂芁は以䞋の図のようになっおいたす。 倖郚デヌタの取埗 この図に衚されおいる倖郚テヌブル、連携ク゚リFederated query、BigQuery cross-cloud connections、BigQuery Omni、BigLake に぀いおは、それぞれ圓蚘事内で解説したす。 倖郚テヌブル 倖郚テヌブルずは 倖郚テヌブル は BigQuery ストレヌゞの倖にあるデヌタを BigQuery から盎接ク゚リできる仕組みです。以䞋のようなデヌタ゜ヌスに察応しおいたす。 Cloud Storage Cloud Bigtable Google ドラむブ 倖郚テヌブルではスキヌマ定矩ずメタデヌタだけを持ち、デヌタの実䜓は倖郚に眮いたたたです。そのため BigQuery 内郚のデヌタをク゚リするよりも、パフォヌマンスは劣りたす。その代わり、デヌタを定期的に BigQuery にロヌドするこずなく最新のデヌタが埗られたり、ELT パむプラむン構築の必芁性が無いずいうメリットがありたす。 参考 : 倖郚テヌブルの抂芁 なお Cloud Storage ぞの倖郚テヌブル定矩の堎合、倖郚テヌブルの発展系である BigLake テヌブル 埌述の利甚が掚奚されおいたす。BigLake テヌブルのほうが、よりきめ现かい制埡が可胜なうえ、テヌブルのアクセス制埡ずデヌタ゜ヌスぞのアクセス制埡を分離できるため、運甚の簡玠化にも぀ながりたす。 参考 : オブゞェクト ストア䞊の BigLake テヌブル 甹途 倖郚テヌブルの甚途ずしお、ELT 凊理の䞭で倖郚テヌブルに察しお CREATE TABLE xxx AS SELECT 〜 や INSERT INTO xxx SELECT 〜 を行い BigQuery ぞのデヌタロヌドを行ったり、あるいは頻繁に倉曎がある倖郚デヌタを、郜床 BigQuery に取り蟌むこずなく分析するなどが挙げられたす。 倖郚テヌブルでは倖郚デヌタ゜ヌスにアクセスするオヌバヌヘッドがあるため、通垞のテヌブルに比べるずパフォヌマンスは劣りたす。倖郚テヌブルは、倖郚からのデヌタのロヌドや、小芏暡なマスタヌデヌタの SELECT など、適切なポむントで利甚する必芁がありたす。 Cloud Storage 倖郚テヌブル Cloud Storage に察する倖郚テヌブルでは、以䞋のファむル圢匏に察応しおいたす。 CSV JSON改行区切り Avro ORC Parquet Datastore ゚クスポヌト Firestore ゚クスポヌト 䟋ずしお、業務システムから定期的に Cloud Storage ぞデヌタをアップロヌドするような仕組みにしおおき、BigQuery からは定期的に Cloud Storage 䞊のファむルを倖郚テヌブルから INSERT INTO xxx SELECT 〜 するパむプラむンを構築すれば、疎結合なデヌタ受け枡し堎所ずしお Cloud Storage が利甚可胜です。 参考 : Cloud Storage 倖郚テヌブルを䜜成する Google ドラむブ倖郚テヌブル Google ドラむブに察する倖郚テヌブルでは、以䞋のファむル圢匏に察応しおいたす。 CSV JSON改行区切り Avro Google スプレッドシヌト BigQuery は、CSV や JSON のほか、Google スプレッドシヌトのデヌタもテヌブルずしお認識できたす。そのため、埓業員が普段䜿っおいるスプレッドシヌトの台垳をテヌブルずしお䜿い、ELT や分析に䜿うこずが容易です。倖郚テヌブルぞのク゚リでは垞に最新のデヌタが埗られるため、リフレッシュのためのバッチ凊理が䞍芁です。 参考 : ドラむブデヌタをク゚リする 以䞋の蚘事も参考にしおください。 blog.g-gen.co.jp Bigtable 倖郚テヌブル Bigtable は、Google Cloud のマネヌゞドな NoSQL デヌタベヌスサヌビスです。 Bigtable は行ず列の抂念を持ちたすが、NoSQL であるため独特のスキヌマ構造をしおいたす。詳现は以䞋のドキュメントをご参照ください。 参考 : Bigtable の倖郚テヌブルを䜜成する BigLake テヌブル BigLake テヌブルずは BigLake テヌブル は、アクセス暩限の委任を䜿甚しお、BigQuery 倖郚のストレヌゞにあるデヌタをク゚リするための仕組みを䜿ったテヌブルのこずです。BigLake テヌブルは、BigLake 倖郚テヌブルずも呌ばれるこずから、倖郚テヌブルの䞀皮であるこずがわかりたす。 BigLake テヌブルでは「ナヌザからテヌブルぞのアクセス暩限」ず「テヌブルBigQueryからデヌタ゜ヌスぞのアクセス暩限」を分けお考えたす。テヌブルをク゚リするナヌザは、BigLake テヌブルぞのアクセス暩限だけがあればよく、デヌタ゜ヌスからテヌブルぞデヌタを取埗する暩限は接続connectionsに玐付けられた サヌビスアカりント の暩限で行われたす。 BigLake テヌブル なお BigQuery cross-cloud connections や BigQuery Omni を䜿うテヌブルは、垞に BigLake テヌブルです。これらの仕組みにより、接続connectionsに AWS の IAM ロヌルの認蚌情報等を持たせるこずで、Amazon S3 等に栌玍された CSV や Parquet 等のデヌタをク゚リできたす。 参考 : BigLake 倖郚テヌブルの抂芁 デヌタ゜ヌス BigLake テヌブルに察応しおいるデヌタ゜ヌスは、以䞋です。 Cloud Storage Amazon S3BigQuery cross-cloud connections / BigQuery Omni Azure Blob StorageBigQuery cross-cloud connections / BigQuery Omni 通垞の倖郚テヌブルずの違い BigLake テヌブルず倖郚テヌブルの違い BigLake テヌブルではない通垞の倖郚テヌブルでは、テヌブルをク゚リするナヌザは、テヌブルぞのアクセス暩限ず同時にデヌタ゜ヌスぞのアクセス暩限も持぀必芁がありたす。 すなわち、通垞の倖郚テヌブルず BigLake テヌブルの違いは、ク゚リを行うナヌザがデヌタ゜ヌスぞのアクセス暩限を持っおいる必芁があるか、ないか、ずいう点になりたす。 利点 BigLake の最倧の利点は、暩限管理運甚の簡玠化です。 通垞の倖郚テヌブルでは、テヌブルを新芏䜜成したり、あるいは既存の倖郚テヌブルぞアクセスできる人を増やす、あるいは枛らす堎合などに「Cloud Storage 等のデヌタ゜ヌスぞのアクセス暩限」ず「テヌブルぞのアクセス暩限」の 䞡方を線集する必芁 がありたす。BigLake ではこれらの暩限が分離され疎結合になるため、運甚の簡玠化に繋がりたす。 たた、BigLake テヌブルではデヌタ゜ヌスぞのアクセス暩限ずテヌブルレベルのアクセス暩限を分けられるため、以䞋のような機胜が䜿えるようになりたす。 行レベル・列レベルセキュリティ 動的デヌタマスキングCloud Storage のみ BigLake テヌブルでなければ、ナヌザはデヌタ゜ヌスのファむルぞのアクセス暩限をたるごず持぀ため、䞊蚘のような现かい制埡は意味を成したせん。BigLake ではナヌザのアクセス暩限をテヌブルレベルで制埡できるため、䞊蚘のような现かい粒床でのアクセス制埡ができるようになりたす。 これらの利点から、特に Cloud Storage ぞの倖郚テヌブルを䜜成する堎合は、BigLake テヌブルを利甚するこずが掚奚されおいたす。 参考 : BigLake 倖郚テヌブルの抂芁 - オブゞェクト ストア䞊の BigLake テヌブル 暩限の持たせ方 接続connectionsを䜜成する際に、BigLake の皮類を遞択したす。接続先環境によっお、暩限を持たせるための手順は異なりたす。 Cloud Storage 甚の BigLake 接続を䜜成するず、サヌビスアカりント ID が払い出されるので、そのサヌビスアカりントに、察象の Cloud Storage の読み取り暩限を持たせたす。 Amazon S3 甚の BigLake 接続では、IAM ロヌルの ARN を指定し、IAM ロヌル偎の信頌関係ポリシヌで接続の ID を信頌したす。 Azure Blob Storage では Federated Identity の利甚有無により、方法が異なりたす。 それぞれ、詳现は公匏ドキュメントをご参照ください。 参考 : Cloud リ゜ヌス接続を䜜成しお蚭定する 参考 : Amazon S3 に接続する 参考 : Blob ストレヌゞに接続する BigQuery コネクタ BigQuery コネクタ BigLake コネクタは、BigLake の远加機胜の䞀぀です。 BigQuery コネクタにより、Apache Spark、Apache Hive、TensorFlow、Trino、Presto など、BigQuery 以倖のデヌタ凊理ツヌルから、BigLake テヌブルぞのアクセスが可胜になりたす。 参考 : BigLake 倖郚テヌブルの抂芁 - コネクタ AWS / Azure ずの連携 抂芁 Amazon Web ServicesAWSの Amazon S3 や、Microsoft Azure の Azure Blob Storage 䞊にある、CSV や Parquet 等のフォヌマットのファむルを、BigQuery からク゚リするこずができたす。 前述の BigLake テヌブルを䜜成するこずで、AWS / Azure ずの接続を確立できたす。この BigLake テヌブルに察しおク゚リを投入するこずで、S3 バケットや Blob Storage コンテナのファむルに察しおク゚リを発行できたす。 これを実珟する方法ずしお、以䞋の2皮類がありたす。 BigQuery cross-cloud connections BigQuery Omni BigQuery cross-cloud connections ずは BigQuery cross-cloud connections を䜿うず、AWS / Azure ずの接続を確立し、Amazon S3 や Azure Blob Storage 䞊のファむルをク゚リする BigLake テヌブルを䜜成できたす。 埌述の BigQuery Omni ず異なり、すべおのリヌゞョンに察応しおいるこずが特城です。AWS 東京・倧阪リヌゞョンにある S3 バケット等に察しお、BigQuery からク゚リを実行し、オンデマンドな分析や、INSERT 〜 SELECT によるデヌタの転送などを実珟できたす。 参考 : Create cross-cloud connections BigQuery Omni ずは BigQuery Omni も BigQuery cross-cloud connections 同様、AWS / Azure ずの接続を確立しお Amazon S3 や Azure Blob Storage 䞊のファむルをク゚リする BigLake テヌブルを䜜成するための仕組みです。 BigQuery cross-cloud connections ずの違いは、BigQuery Omni の堎合、ク゚リ凊理が AWS や Azure 偎に Google がデプロむする独自のコンピュヌトリ゜ヌスを䜿っお行われる点です。ク゚リ結果のみが BigQuery に返されるため、AWS や Azure 偎でのデヌタのアりトバりンド転送料金が最小限で枈みたす。 参考 : BigQuery Omni の抂芁 ただしこの特殊な仕組み䞊、2026幎8月珟圚、Amazon S3、Azure Blob Storage ずもに 日本囜内のリヌゞョン東京・倧阪に未察応である 点に泚意が必芁です。 たた BigQuery Omni では、通垞のク゚リずは異なる料金䜓系が適甚されたす。 参考 : BigQuery Omni pricing 手法の比范 BigQuery Omni ず BigQuery cross-cloud connections の詳现な比范に぀いおは、以䞋の蚘事を参照しおください。 blog.g-gen.co.jp 連携ク゚リ、連携デヌタセット 連携ク゚リFederated queryずは 連携ク゚リ Federated queryは BigQuery から他のデヌタベヌス゚ンゞンぞク゚リを送信し、結果を返しおもらう機胜です。 倖郚テヌブルずの違いは、ク゚リの盞手先がデヌタベヌス゚ンゞンであり、盞手先のコンピュヌトリ゜ヌスを䜿っお凊理された結果を BigQuery が受け取るずいう点です。 連携ク゚リは、以䞋のデヌタ゜ヌスに察応しおいたす。 Spanner Cloud SQL AlloyDB for PostgreSQL SAP Datasphere2026幎8月珟圚、Preview ク゚リを実行する BigQuery のロケヌションリヌゞョンず、連携ク゚リの察象デヌタベヌスのロケヌションは同じである必芁がある、などの制限がありたす。詳现は公匏ドキュメントを確認しおください。 参考 : 連携ク゚リの抂芁 連携デヌタセットFederated datasets 連携デヌタセット Federated datasets、たたは 倖郚デヌタセット External datasetsずは、Spanner のデヌタベヌス党䜓を BigQuery ず連携し、テヌブル䞀芧やスキヌマ情報の閲芧を可胜にするほか、BigQuery から Spanner ぞの読み取りク゚リを可胜にする機胜です。 連携ク゚リでは、BigQuery で接続connectionsを䜜成し、EXTERNAL_QUERY 関数で Spanner デヌタベヌス内のテヌブルを指定しおク゚リを実行する䞀方、連携デヌタセットでは BigQuery で倖郚デヌタセットを䜜成するこずで、FROM 句で倖郚デヌタセット内のテヌブルを盎接指定しおク゚リを実行できたす。 詳现は、以䞋の蚘事を参照しおください。 blog.g-gen.co.jp Apache Iceberg 察応 Apache Iceberg managed tables Apache Iceberg managed tables 旧称 BigLake tables for Apache Iceberg in BigQuery機胜により、Cloud Storage に保存された Iceberg テヌブルをク゚リしたり、倉曎したりするこずができたす。 Apache Iceberg は、倧芏暡な分析甚テヌブルを効率的に管理するために蚭蚈されたオヌプン゜ヌスのテヌブルフォヌマットです。Iceberg では、デヌタファむルずメタデヌタファむルのセットを䜿っおテヌブルを定矩したす。これにより、デヌタ倉曎の远跡、スキヌマの進化、タむムトラベルク゚リ、アトミックなトランザクションなどの高床な機胜を実珟したす。Iceberg はデヌタファむル圢匏ずしお ORC、Avro、Parquet などをサポヌトしおいたすが、BigQuery では Parquet に察応しおいたす。 なお圓機胜では、BigLake テヌブルの仕組みである接続connectionsにより Cloud Storage に認蚌し、Cloud Storage 䞊に保存された Iceberg デヌタを読み曞きしたす。 参考 : Apache Iceberg managed tables Apache Iceberg external tables Apache Iceberg external tables 旧称 Apache Iceberg read-only external tablesは、前述の Apache Iceberg managed tables ずは異なり、読み取り専甚の定矩方法です。 Cloud Storage のほか、Amazon S3 や Azure Blob Storage 䞊に保存された Iceberg テヌブルを読み取るこずができたす。 定矩方法には「Lakehouse runtime catalog を䜿う方法」「AWS Glue Data Catalog を䜿う方法AWS に掚奚」「Iceberg JSON metadata ファむルを指定する方法Azure に掚奚」の3皮類がありたす。 参考 : Create Apache Iceberg external tables モニタリング INFORMATION_SCHEMA INFORMATION_SCHEMA は、BigQuery の各皮オブゞェクトの情報を栌玍したシステムビュヌです。INFORMATION_SCHEMA は読み取り専甚であり、倚くの堎合、リアルタむムで最新の情報が栌玍されおいたす。 このビュヌをク゚リするこずで、BigQuery のテヌブル、ゞョブ、むンデックスなどの各皮情報を確認するこずができたす。以䞋は、代衚的なものだけをピックアップしたものです。 ビュヌ名 内容 TABLES テヌブル情報。テヌブル名、スキヌマ、䜜成時間、曎新時間、DDL 等 TABLE_STORAGE テヌブルのストレヌゞ情報。テヌブル名、物理バむト、論理バむト、タむムトラベルストレヌゞ量、フェむルセヌフストレヌゞ量等 SCHEMATA デヌタセット情報。名称、䜜成日時、曎新日時、ロケヌション、DDL 等 JOBS ゞョブ情報。ID、キャッシュヒット有無、䜜成日時、終了日時、゚ラヌコヌド、SQL 等 ク゚リ時は、以䞋のようにプロゞェクト ID省略可やロケヌション名などを付䞎しおク゚リしたす。 SELECT * FROM `region-asia-northeast1`.INFORMATION_SCHEMA.TABLES; INFORMATION_SCHEMA のビュヌには、プロゞェクト単䜍や組織単䜍など、耇数のレベルのビュヌが甚意されおいるこずがありたす。 INFORMATION_SCHEMA のビュヌの䞀芧は、以䞋の公匏ドキュメントを参照しおください。 参考 : Introduction to INFORMATION_SCHEMA リ゜ヌスモニタリング BigQuery の Web コン゜ヌル画面やシステムビュヌには、各皮モニタリングツヌルが甚意されおおり、以䞋のような芁玠を可芖化できたす。 ゞョブの履歎や䜿甚したリ゜ヌス 予玄reservationsの䜿甚状況 マテリアラむズドビュヌの䜿甚状況 BI Engine の䜿甚状況 具䜓的な方法に぀いおは、以䞋のドキュメントを参考にしおください。 参考 : BigQuery Monitoring の抂芁 管理ゞョブ゚クスプロヌラ 管理ゞョブ゚クスプロヌラ administrative jobs explorer、たたは単に ゞョブ゚クスプロヌラ は、プロゞェクトで実行されたゞョブの䞀芧を確認するこずができる画面です。 同画面では、ゞョブ䞀芧を各皮属性でフィルタしたり、゜ヌトするこずができたす。時間がかかっおいるゞョブを確認し、最適化するために圹立おるこずができたす。 たた、ゞョブごずのスキャン量や占有したスロット量も確認できるため、 コスト最適化 に甚いるこずができたす。BigQuery の料金を節玄したいずき、たずゞョブ゚クスプロヌラでスキャン量やスロット占有量が倧きいゞョブを特定するこずが有甚です。 参考 : 管理ゞョブ ゚クスプロヌラを䜿甚する 管理ゞョブ゚クスプロヌラ チュヌニング パフォヌマンスのためのテヌブル蚭蚈 BigQuery においおパフォヌマンスを最適化するためのテヌブル蚭蚈は、たずは基本線で解説した「パヌティショニング」ず「クラスタリング」、たた「非正芏化」などのテクニックが重芁です。 BigQuery では䞀般的な RDBMSリレヌショナルデヌタベヌスマネゞメントシステムずは異なり、むンデックスを甚いた怜玢パフォヌマンス最適化は、特定のケヌスでのみ行われたす。 詳现は、基本線の蚘事の「テヌブル蚭蚈」の項を参照しおください。 参考 : BigQueryを培底解説(基本線) - G-gen Tech Blog - テヌブル蚭蚈 ク゚リプラン実行蚈画 BigQuery では、䞀般的な DBMS では EXPLAIN ステヌトメント等で取埗できるような、 ク゚リプラン 実行蚈画の確認が可胜です。 ク゚リゞョブが投入されるず、BigQuery は SQL を耇数の ク゚リステヌゞ に分割し、さらにク゚リステヌゞは现かい ステップ に分割されたす。耇数のワヌカヌがク゚リステヌゞを䞊列実行するため、高速に凊理されたす。たたク゚リゞョブの進捗は タむムラむン で衚珟され、保留䞭・実行䞭・完了枈の䜜業単䜍が確認できたす。 ク゚リプランは、Google Cloud コン゜ヌルでゞョブごずに確認できたす。「実行の詳现」タブでは詳现を、「実行グラフ」タブではグラフィカルなフロヌ図を確認できたす。 実行グラフ 参考 : ク゚リプランずタむムラむン 参考 : In-memory query execution in Google BigQuery ク゚リずテヌブルの最適化 想定よりもク゚リが遅い堎合は、ク゚リプランやタむムラむンを参考に、SQL をチュヌニングしたす。たた SQL の蚘述方法やテヌブル蚭蚈のベストプラクティスに沿うこずも重芁です。䟋ずしお、以䞋のようなベストプラクティスがありたす。 テヌブルを非正芏化しお ネスト STRUCT 列や REPEATED 列を䜿う WHERE 句は STRING や BYTE より、 BOOL 、 INT 、 FLOAT 、 DATE の方が高速 REGEXP_CONTAINS() ではなく LIKE を䜿甚 䞍芁な列を SELECT しない パヌティションやクラスタリングを䜿甚 JOIN の前にデヌタを枛らす 耇雑で長倧なク゚リをマルチステヌトメントク゚リに分割し䞀時テヌブルを掻甚 自己結合よりりむンドり関数 詳现は、以䞋の公匏ドキュメントも参照しおください。以䞋のペヌゞをはじめ、公匏ドキュメントにはク゚リパフォヌマンスを最適化するための Tips が数倚く甚意されおいたす。 参考 : ク゚リ パフォヌマンスの最適化の抂芁 参考 : ク゚リ蚈算を最適化する 䞻キヌ制玄・倖郚キヌ制玄 BigQuery には、 䞻キヌ制玄 Primary Key Constraintsず 倖郚キヌ制玄 Foreign Key Constraintsが存圚したす。 参考 : 䞻キヌず倖郚キヌを䜿甚する しかし、これらの制玄に匷制力は無く NOT ENFORCED 、䞻キヌ制玄を蚭定した列でも倀が重耇できたすし、倖郚キヌ制玄を入れた列も行の远加・削陀等に制限がかかりたせん。これらの制玄の存圚理由は、 実行蚈画の最適化 にありたす。 BigQuery で䞻キヌ制玄・倖郚キヌ制玄を定矩するず、それらに基づいおク゚リオプティマむザがク゚リプランを最適化し、JOIN 凊理が高速化やスキャンボリュヌムの最適化に繋がる可胜性がありたす。ク゚リプランの最適化は、コンピュヌト料金の最適化にも繋がりたす。 ただし「䞻キヌ制玄をかけた列は NULL でなく䞀意であるこず」たた「倖郚キヌ制玄をかけた列は参照先テヌブルで䞻キヌであるこず」などの本来の制玄条件はシステム的には匷制されないため、これを守る矩務はナヌザヌ偎にありたす。デヌタが制玄に違反しおいる堎合、 誀った結果が返されるこずがある ずされおいたす。 詳现な抂念ずしお、Inner Join Elimination内郚結合解陀、Outer Join Elimination倖郚結合解陀、Join Reordering結合順序倉曎が以䞋の公匏蚘事で玹介されおいたす。 参考 : BigQuery の䞻キヌず倖郚キヌで結合を最適化 レコメンデヌション BigQuery の Web コン゜ヌルBigQuery Studioでは、パフォヌマンスチュヌニングやコスト削枛に圹立぀ 掚奚事項 Recommendationsを䞀芧衚瀺できたす。BigQuery は、AI/ML も掻甚し、以䞋のような掚奚事項を衚瀺したす。 パヌティショニングずクラスタリングの掚奚事項 マテリアラむズド ビュヌの掚奚事項 IAM の掚奚事項 䟋えば、「パヌティショニングずクラスタリングの掚奚事項」では過去30日間の利甚実瞟に基づいお、どのテヌブルのどの列にパヌティショニングやクラスタリングを蚭定すべきかを掚奚しおくれたす。詳现は以䞋のドキュメントも参照しおください。 掚奚事項はプロゞェクト単䜍で閲芧できるほか、適切な暩限を持っおいれば組織レベルでも閲芧できたす。 参考 : 掚奚事項の抂芁 掚奚事項Recommendations 同時実行ずリ゜ヌス ク゚リの同時実行 BigQuery はサヌバヌレスのサヌビスであり、分散アヌキテクチャを採甚しおいるため、高床な䞊列凊理が可胜です。 ク゚リの同時実行数は、オンデマンドモヌドの堎合はプロゞェクトごずに、BigQuery Editions を䜿っおいる堎合は予玄Reservationごずに決たりたす。 オンデマンドモヌドのプロゞェクトでは、ク゚リの最倧同時実行数は 動的 に決たりたす。 䞀方で予玄Reservationを䜿っおいるプロゞェクト、すなわち Editions が割り圓おられおいるプロゞェクトでは、最倧同時実行数を 明瀺的に蚭定 できたす。 参考 : ク゚リキュヌを䜿甚する フェアスケゞュヌリング ク゚リが䞊列で実行される際、リ゜ヌススロットの割り圓おは BigQuery によっお動的に決たりたす。この割り圓おの仕組みを フェアスケゞュヌリング ず呌びたす。 フェアスケゞュヌリングにより、プロゞェクト間やゞョブ間で自動的にスロットが分配されたす。スロットを倧きく芁するク゚リには倧きなスロット数が、そうでないク゚リには少ないスロット数が動的に割り圓おられたす。 参考 : スロットに぀いお - BigQuery のフェア スケゞュヌリング ク゚リキュヌ オンデマンドモヌドであるか、Editions であるかに関わらず、BigQuery には ク゚リキュヌ の抂念がありたす。前述の仕様で決定した最倧同時実行数を超えたク゚リは、キュヌに溜たりたす。 むンタラクティブク゚リの堎合は最倧 1,000、バッチク゚リの堎合は最倧 20,000 ク゚リがキュヌに滞留するこずができ、それを超えたク゚リ投入ぱラヌになりたす。 参考 : ク゚リキュヌを䜿甚する コスト削枛 コスト削枛のベストプラクティス BigQuery にはコスト削枛のためのベストプラクティスも存圚したす。以䞋の蚘事をご参照ください。 blog.g-gen.co.jp blog.g-gen.co.jp 䞊限蚭定 BigQuery のオンデマンド課金が䞀定以䞊にならないように、ク゚リ量に䞊限蚭定をするこずが可胜です。以䞋をご参照ください。 blog.g-gen.co.jp BigQuery ML BigQuery ML ずは BigQuery ML ずは、BigQuery の SQL むンタヌフェむスを䜿っお機械孊習モデルをトレヌニングしたり、掚論を実行できる機胜です。トレヌニングや掚論には、BigQuery 内のデヌタをシヌムレスに利甚できたす。 機械孊習の専門知識がなくおも、SQL による呌び出しで、以䞋のような組み蟌みモデルをトレヌニング可胜です。 線圢回垰 ロゞスティック回垰 K-means クラスタリング 行列分解Matrix factorization 䞻成分分析 (PCA) 時系列予枬 たた Vertex AI や AutoML でトレヌニングしたモデルを利甚するこずも可胜です。こちらではディヌプニュヌラルネットワヌクやランダムフォレスト、ブヌストツリヌなども利甚できたす。 BigQuery ML のモデルを Vertex AI Model Registry に登録しお、オンラむン掚論甚の゚ンドポむントにデプロむするこずも可胜です。 参考 : BigQuery の ML の抂芁 培底解説蚘事 以䞋の蚘事では BigQuery ML を詳现に解説しおいたすので、ご参照ください。 blog.g-gen.co.jp 利甚䟋 以䞋のように SQL 構文で BigQuery ML を利甚するこずができたす。以䞋は、モデル䜜成の䟋です。 #standardSQL CREATE MODEL `bqml_tutorial.sample_model` OPTIONS(model_type= ' logistic_reg ' ) AS SELECT IF (totals.transactions IS NULL , 0 , 1 ) AS label, IFNULL(device.operatingSystem, "" ) AS os, device.isMobile AS is_mobile, IFNULL(geoNetwork.country, "" ) AS country, IFNULL(totals.pageviews, 0 ) AS pageviews FROM `bigquery- public -data.google_analytics_sample.ga_sessions_*` WHERE _TABLE_SUFFIX BETWEEN ' 20160801 ' AND ' 20170630 ' 䞊蚘は bqml_tutorial デヌタセットの䞭に sample_model ずいうモデルを䜜成しおいたす。 パブリックデヌタセット䞊のデヌタ bigquery-public-data.google_analytics_sample.ga_sessions_* を利甚しおロゞスティック回垰モデルをトレヌニングしおいたす。 掚論は以䞋のように行いたす。 #standardSQL SELECT country, SUM (predicted_label) as total_predicted_purchases FROM ML.PREDICT(MODEL `bqml_tutorial.sample_model`, ( SELECT IFNULL(device.operatingSystem, "" ) AS os, device.isMobile AS is_mobile, IFNULL(totals.pageviews, 0 ) AS pageviews, IFNULL(geoNetwork.country, "" ) AS country FROM `bigquery- public -data.google_analytics_sample.ga_sessions_*` WHERE _TABLE_SUFFIX BETWEEN ' 20170701 ' AND ' 20170801 ' )) GROUP BY country ORDER BY total_predicted_purchases DESC LIMIT 10 モデルが掚論した結果は predicted_(元カラム名) ずいう列に出力されたす。 匕甚元 : SQL を䜿甚しお BigQuery ML で ML モデルを䜜成する 料金 BigQuery の課金モヌドがオンデマンドの堎合、凊理したデヌタ量に応じお課金が発生したす。モデル䜜成ず掚論では料金単䟡が異なる点に泚意が必芁です。 BigQuery Editions を利甚する堎合は、BigQuery ML 内郚モデルの䜜成・掚論には Editions の QUERY 割り圓おが利甚されたす。Vertex AI など倖郚モデルの利甚には ML_EXTERNAL が䜿われたす。 BigQuery ML 倖郚モデルの堎合は Vertex AI などの利甚料金も発生したす。 料金衚は以䞋をご参照ください。 参考 : BigQuery pricing - BigQuery ML pricing デヌタリネヌゞ BigQuery では、 デヌタリネヌゞ を衚瀺するこずができたす。デヌタリネヌゞずは、ある BigQuery テヌブルのデヌタがどこから来お、どこに枡されおいるかなど、デヌタの出自を特定できる情報です。デヌタリネヌゞは、 Dataplex の1機胜ずしお提䟛されおいたす。 有効化するず、テヌブルごずにグラフが生成され、BigQuery のコン゜ヌル画面BigQuery Studioからデヌタの流れをグラフィカルに確認するこずができたす。 INSERT SELECT や CREATE TABLE AS SELECT などのゞョブが远跡され、以䞋の画像のようなリネヌゞグラフずしお衚瀺可胜になりたす。 参考 : デヌタリネヌゞに぀いお 参考 : BigQuery テヌブルのデヌタリネヌゞを远跡する 詳现は、以䞋の蚘事を参照しおください。 blog.g-gen.co.jp BigQuery Sharing BigQuery Sharing BigQuery Sharing は、BigQuery のデヌタセットを、他の組織に安党に共有したり、販売しお収益化するための機胜です。埓来は Analytics Hub ず呌ばれおいたしたが、2025幎4月に改名されたした。 BigQuery Sharing では、BigQuery デヌタセットが共有可胜なほか、Pub/Sub トピックを共有するこずで、ストリヌミングデヌタを共有するこずもできたす。 BigQuery Sharing には、远加の料金は発生したせん。 参考 : Introduction to BigQuery sharing 仕組み デヌタを共有する偎はパブリッシャヌPublisherず呌ばれたす。パブリッシャヌは、デヌタをパブリック゚クスチェンゞPublic Exchangeたたはプラむベヌト゚クスチェンゞPrivate Exchangeに公開するこずで、デヌタを共有したす。 デヌタを共有される偎は、 サブスクラむバヌ Subscriberず呌ばれたす。゚クスチェンゞからサブスクラむブSubscribeするこずで、デヌタを利甚可胜になりたす。 サブスクラむバヌが BigQuery デヌタセットをサブスクラむブするず、 リンクされたデヌタセット Linked datasetsずいう圢でデヌタが利甚可胜になりたす。サブスクラむバヌは自分の環境にデヌタセットをコピヌする必芁はなく、リンクされたデヌタセットを通じお、盎接パブリッシャヌのデヌタにアクセスするこずができたす。 パブリッシャヌは、 Data egress options を䜿うこずで、サブスクラむバヌがデヌタをコピヌしたり、ファむルずしお゚クスポヌトするこずを犁止するこずができたす。このようなオプションにより、デヌタを安党に共有するこずが可胜です。 参考 : Introduction to BigQuery sharing - Data egress options (BigQuery shared datasets only) デヌタクリヌンルヌム BigQuery Sharing の デヌタクリヌンルヌム Data clean roomsは、セキュリティが匷化された環境で、機密情報を安党に共有するための仕組みです。 パブリッシュずサブスクラむブのモデルを採甚しおいる点では、通垞の BigQuery Sharing によるデヌタ共有ず同じです。しかし、デヌタクリヌンルヌムでは、 分析ルヌル や Data egress controls などの仕組みにより、よりきめ现かいアクセス制埡が可胜になっおいたす。 分析ルヌル では、デヌタぞの盎接アクセスを犁止しお、集蚈ク゚リの実行のみを蚱可するなど、现かい制埡が可胜です。 参考 : Share sensitive data with data clean rooms マヌケットプレむスでのデヌタ販売 BigQuery Sharing では、 Google Cloud Marketplace を通じお、デヌタを販売しお収益化するこずができたす。 Google Cloud Marketplace にデヌタをリスティングするには、Google による審査を受ける必芁がありたす。たた、特定の芁件を満たしおいる必芁がありたす。 参考 : Commercialize listings on Google Cloud Marketplace 参考 : Requirements for Google Cloud Marketplace 非構造化デヌタの分析 オブゞェクトテヌブル オブゞェクトテヌブル は、Cloud Storage 内の非構造化デヌタを分析するための仕組みです。オブゞェクトテヌブルは Cloud Storage 内のオブゞェクトのメタデヌタを栌玍し、1行が1オブゞェクトに察応したす。 非構造化デヌタ ずは、RDB のテヌブルのように型typeを含むスキヌマが決たった構造化デヌタや、CSV や JSON のように型が決たっおいないが構造を有する半構造化デヌタずは異なり、 スキヌマが決たっおいないデヌタ を指したす。画像、動画、PDF、テキストファむルなどは非構造化デヌタです。 オブゞェクトテヌブルはこれらのデヌタのメタデヌタを管理したす。たた仮想列である data にアクセスするこずで、そのデヌタの RAW バむトにアクセスするこずができたす。 参考 : オブゞェクト テヌブルの抂芁 実珟できるこず オブゞェクトテヌブルの利甚により、Cloud Storage 内の非構造化デヌタに察しお以䞋のようなこずが実珟できたす。 BigQuery ML による画像等の非構造化デヌタを䜿った掚論 Cloud Vision API による画像の掚論 Cloud Translation API による翻蚳 Cloud Natural Language API による感情分析 Apache Tika を甚いた PDF のメタデヌタ抜出 アクセス制埡 オブゞェクトテヌブルは、デヌタ゜ヌスぞのアクセスに BigLake の仕組みを利甚したす。BigQuery は接続connectionsに玐付けられたサヌビスアカりント暩限を䜿っお、Cloud Storage にアクセスしたす。 参考 : オブゞェクト テヌブルの抂芁 - アクセス制埡 高床なセキュリティ 基本線で解説したセキュリティ機胜 基本線でもいく぀かのセキュリティ機胜を解説しおいたす。基本線の以䞋の芋出しをご参照ください。 アクセス制埡 ネットワヌク IAM によるアクセス制埡 Dataplex によるアクセス制埡 承認枈みビュヌず承認枈みデヌタセット セキュリティ関連機胜 デフォルトの暗号化・CMEK 暗号化 列レベルの暗号化 列レベルのアクセス制埡、行レベルのセキュリティ VPC Service Controls その他のセキュリティ blog.g-gen.co.jp Sensitive Data Protection Sensitive Data Protection は、機密性の高いデヌタを自動的に怜出し、保護するためのフルマネヌゞドサヌビスです。BigQuery ずは別の Google Cloud プロダクトですが、BigQuery ず密に連携できたす。 Sensitive Data Protection を䜿うず、以䞋の方法で機密情報の所圚を特定できたす。 デヌタプロファむルの䜜成Sensitive Data Protection が BigQuery テヌブルを自動でスキャンしお䜜成 オンデマンド怜査明瀺的に指瀺しおテヌブルたたは列をスキャン デヌタのプロファむリングを行うず「リスクレベル」「機密性」などのむンサむトがプロゞェクトレベル、テヌブルレベル、列レベルで埗られたす。 単䞀プロゞェクトに察しおプロファむルを行うこずも、組織やフォルダレベルで指定しお配䞋プロゞェクト党䜓にプロファむルを行うこずも可胜です。 参考 : Sensitive Data Protection を䜿甚した BigQuery デヌタのスキャン 参考 : 機密デヌタの怜出の抂芁 動的デヌタマスキング 動的デヌタマスキング は、セキュリティ目的で、ク゚リ結果を列レベルで動的にマスキングする機胜です。 列レベルでアクセス制埡をするずいう点で「列レベルのアクセス制埡」ず䌌おいたすが、同機胜では暩限が無いアカりントがアクセス制埡がかかった列にアクセスしようずするず暩限゚ラヌずなる䞀方で、動的デヌタマスキングでぱラヌずならずに、難読化null 化、マスキング、ハッシュ化などされた倀が返っおきたすので、既存の SQL を倉曎する必芁がないずいう利点がありたす。 この機胜は列レベルのアクセス制埡ず同様に分類Taxonomyやポリシヌタグを利甚したす。これらの抂念に぀いおは参考ドキュメントをご参照ください。 参考 : デヌタ マスキングの抂芁 参考 : BigQueryの列レベルのアクセス制埡・行レベルのセキュリティを解説 列レベル暗号化 Cloud KMS で暗号鍵を管理するこずで、透過的な暗号化ずは別に、 列レベルの暗号化 をするこずができたす。 列レベルの暗号化は、デヌタを暗号化するずきに䜿う鍵、すなわち Data Encryption KeyDEKずその暗号鍵をさらに暗号化する鍵である Key Encryption KeyKEKを分けるこずで、キヌの挏掩リスクを䞋げる手法である゚ンベロヌプ暗号化で行われたす。KEK は Cloud KMS で管理され、そのアクセス管理は IAM によっお行われたす。 暗号化は、INSERT/UPDATE 時の暗号化関数によっお行いたす。確定的deterministicな暗号化関数ず非確定的non-deterministicな暗号化関数があり、前者はむンプットが同じであれば暗号文が同䞀になり、埌者はむンプットが同じでも、出力される暗号文が異なるものになりたす。前者の確定的暗号化を甚いるず、暗号化枈みのテキストを䜿っお集玄や JOIN などの分析凊理を行うこずができたす。 埩号は SELECT 時に埩号関数を甚いるこずで行われたす。ク゚リするナヌザは、察象のテヌブル・列に察するアクセス暩限ず同時に、Cloud KMS 鍵に察する暩限も持っおいなければ、デヌタを埩号するこずはできたせん。 参考 : Cloud KMS による列レベルの暗号化 参考 : AEAD 暗号化のコンセプト 列レベルの暗号化の詳现は、以䞋の蚘事をご参照ください。 blog.g-gen.co.jp BigQuery BI Engine BI Engine ずは BigQuery BI Engine たたは単に BI Engineずは、Looker Studio や Looker、Tableau などの BI ツヌルを䞻な察象ずしお、ク゚リ結果をメモリにキャッシュするこずで高速化する機胜です。 BI Engine は BigQuery API ず統合されおおり、BI ツヌルや API などから BigQuery が利甚された際には自動的に BI Engine のキャッシュが適甚されるので、アプリケヌション偎に倉曎が必芁ありたせん。 参考 : BI Engine ずは 料金 BI Engine では、 予玄 ずいうオブゞェクトをプロゞェクト内䜜成するこずでメモリ容量が確保されたす。この確保した容量の GiB 数に応じお課金が発生したす。 2026幎8月珟圚の東京リヌゞョンでは、$0.0499/GiB/hour です。 たた BigQuery Editions でコミットメントを賌入した堎合、賌入スロット数に応じお無料の BI Engine の GiB 枠が利甚可胜になりたす。 最新の料金は以䞋の公匏ペヌゞをご参照ください。 参考 : BigQuery pricing - BI Engine pricing 掻甚のテクニック BI Engine では特にキャッシュを利甚させたいテヌブルを指定しお、 優先テヌブル ずしおマヌクできたす。 たた BI Engine を掻甚するテクニックずしお、BI Engine を䜿甚させたいク゚リだけを別プロゞェクトに切り出し、そのプロゞェクトで BI Engine 予玄を䜜成し、キャッシュを䜿わせたいク゚リをそのプロゞェクトに集䞭させるずいう方法もありたす。これを優先テヌブルず組み合わせるこずで、確保した BI Engine 予玄を有効に掻甚するこずができたす。 参考 : BI Engine ずは - BI Engine に関する考慮事項 泚意点 泚意点ずしお、BI Engine ではワむルドカヌドテヌブルを参照するク゚リをサポヌトしおいたせん。 たた他にも倖郚テヌブルぞのク゚リやナヌザ定矩関数など、サポヌトされおいない機胜もありたす。 参考 : BI Engine の抂芁 - BI Engine のその他の制限事項 開発 BigQuery DataFrames BigQuery DataFrames は、BigQuery API を介したデヌタの倉換や機械孊習を容易に行える Python のオヌプン゜ヌスパッケヌゞです。 BigQuery DataFrames を甚いるず、BigQuery 䞊のデヌタを pandas のような操䜜感で凊理ができ、scikit-learn のような操䜜感でモデルトレヌニングず評䟡、予枬が行えたす。 参考 : BigQuery DataFrames の抂芁 以䞋の蚘事で詳现に解説しおいたすので、ぜひご参照ください。 blog.g-gen.co.jp BigQuery リポゞトリ BigQuery リポゞトリ は、BigQuery ず Git リポゞトリを連携する機胜です。Google Cloud コン゜ヌルBigQuery Studio䞊で、組み蟌みの Git リポゞトリたたは GitHub 等の Git リポゞトリず接続しお、SQL ファむル等のバヌゞョン管理をしたり、Git ワヌクフロヌを操䜜するこずができたす。 詳现は以䞋の蚘事を参照しおください。 blog.g-gen.co.jp パむプ構文 BigQuery では、暙準的な SQL である Google SQL のほか、 パむプ構文 Pipe syntaxでもク゚リを蚘述するこずができたす。 参考 : パむプク゚リの構文を䜿甚する 以䞋の䟋のように、構文をパむプで぀なぐこずで、順番に凊理を蚘述するこずができたす。凊理の順に蚘述ができるため、アドホックな分析や、ログの分析の際に䟿利です。 FROM `myproject.mydataset.employee_master` |> WHERE location = ' Tokyo ' |> JOIN `myproject.mydataset.sales` USING (employee_id) |> WHERE sales_date >= ' 2024-04-01 ' |> AGGREGATE SUM (sales_amount) AS total_amount GROUP BY employee_id, employee_name |> WHERE total_amount > 10000 |> ORDER BY total_amount DESC |> LIMIT 2 詳现は、以䞋の蚘事を参照しおください。 blog.g-gen.co.jp 杉村 勇銬 (蚘事䞀芧) 執行圹員 CTO 元譊察官ずいう経歎を持぀ IT ゚ンゞニア。クラりド管理・運甚やネットワヌクに知芋。AWS 認定資栌および Google Cloud 認定資栌はすべお取埗。X旧 Twitterでは Google Cloud や Google Workspace のアップデヌト情報を぀ぶやいおいたす。 Follow @y_sugi_it
こんにちは、G-gen の荒井です。Google Cloud を利甚䞭に、プロゞェクトを間違っお消しおしたったもしくは、消しそうになっお、ヒダッずした。なんお経隓がある方も倚いのではないでしょうか。今回はそういった誀操䜜によるプロゞェクト削陀を防止するリヌ゚ンを蚭定䜿っおみたので蚘事にしおみたした。 はじめに リヌ゚ンずは ナヌスケヌス リヌ゚ンに関する泚意事項 リヌ゚ン蚭定方法 alpha コマンドである 指定できる restrictions 事前準備 プロゞェクトの準備 リヌ゚ン蚭定方法 リヌ゚ンの䜜成 リヌ゚ン蚭定の確認 リヌ゚ンの削陀 はじめに リヌ゚ンずは Google Cloud における リヌ゚ン ずは、リ゜ヌスに察しお実行できる操䜜を制限する制玄です。事前にリヌ゚ン蚭定を行っおおくこずで、リヌ゚ン蚭定埌に発生した操䜜よりリヌ゚ン蚭定が優先されたす。 聞き慣れない蚀葉だったので調べおみたずころ、䞍動産業界ではよく䜿われる蚀葉で「先取特暩抵圓暩」などず呌ばれおいるようです。 参考 : リヌ゚ンによるプロゞェクトの偶発的削陀からの保護 参考 : REST reference - Lien ナヌスケヌス リヌ゚ン蚭定を行うこずで、プロゞェクトを誀操䜜による削陀から保護するこずができたす。 以䞋のようなケヌスがありたしたら、リヌ゚ンの出番です。 本番システムのプロゞェクトを誀操䜜による削陀から保護したい 耇数人が䜿甚する怜蚌環境で、間違っお削陀されないようにしたい リヌ゚ンに関する泚意事項 リヌ゚ン蚭定方法 リヌ゚ンの蚭定は2023幎5月珟圚、Google Cloud コン゜ヌルからの蚭定はできず、gcloud コマンドからのみ実行するこずができたす。 Cloud Shell からの実行、たたは Cloud SDK の準備 が必芁ずなりたす。 alpha コマンドである gcloud コマンドは、倧きく3぀のリリヌスレベルがありたす。今回䜿甚するリヌ゚ンのコマンドは alpha コマンドずなりたす。2023幎5月時点 そのため今埌予告なく倉曎がある堎合もありたす。ご䜿甚の際は自己責任ずなりたすので、ご泚意ください。 なおリヌ゚ン機胜は、コマンド自䜓は alpha リリヌスですが、機胜ずしおは GA (䞀般公開) されおいたす。 gcloud コマンドのリリヌスレベルに぀いおは、以䞋のドキュメントをご参照ください。 cloud.google.com 指定できる restrictions ドキュメント では、restrictions の倀ずしお resourcemanager.projects.delete が蚘茉されおいたす。 䟋えば、restrictions の倀を compute.instances.delete などに倉曎するこずで、プロゞェクト削陀防止以倖の甚途にも䜿えないかず考えるのが自然ですが、珟圚では利甚できたせん。 珟時点では restrictions にはプロゞェクト削陀防止目的の resourcemanager.projects.delete のみが指定できたす。 事前準備 プロゞェクトの準備 【手順1】 Google Cloud ぞログむン Google Cloud にログむンし Cloud Shell を起動したす。 Cloud SDKなど gcloud コマンドが実行できれば Cloud Shell 以倖でも構いたせん。 【手順2】 プロゞェクトの移動 察象プロゞェクトに移動したす。 [ 入力コマンド ] gcloud config set project <project_id> [ 出力䟋 ] $ gcloud config set project lien-demo Updated property [core/project]. $ 【手順3】 プロゞェクトの確認 指定のプロゞェクトに切り替わったこずを確認したす。 [ 入力コマンド ] gcloud config list [ 出力䟋 ] project = の項目が、察象プロゞェクトになっおいるこず。 $ gcloud config list [accessibility] screen_reader = True [component_manager] disable_update_check = True [compute] gce_metadata_read_timeout_sec = 30 [core] account = <Google アカりント> disable_usage_reporting = True project = lien-demo [metrics] environment = devshell Your active configuration is: [cloudshell-26733] リヌ゚ン蚭定方法 参考 : gcloud alpha resource-manager liens リヌ゚ンの䜜成 【手順4】 リヌ゚ンの䜜成 以䞋のコマンドを入力し、プロゞェクトにリヌ゚ンを䜜成したす。 [ 入力コマンド ] gcloud alpha resource-manager liens create \ --project < project_id > \ --restrictions=resourcemanager.projects.delete \ --reason= < 説明 > [ 出力䟋 ] $ gcloud alpha resource-manager liens create \ --project lien-demo \ --restrictions=resourcemanager.projects.delete \ --reason="重芁プロゞェクトのためリヌ゚ンで削陀保護" $ 詳现なコマンドの構文は リファレンス の確認をお願いしたす。 リヌ゚ン蚭定の確認 【手順5】 リヌ゚ン蚭定確認 以䞋のコマンドを入力し、リヌ゚ンが䜜成されおいるこずを確認したす。 [ 入力コマンド ] gcloud alpha resource-manager liens list [ 出力䟋 ] $ gcloud alpha resource-manager liens list NAME: xxxxxxxxxxxxx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ORIGIN: < Google アカりント > REASON: 重芁プロゞェクトのためリヌ゚ンで削陀保護 $ 【手順6】 削陀テスト 削陀防止が働いおいるかプロゞェクト削陀をテストしたす。 ナビゲヌションメニュヌ > IAMず管理 > リ゜ヌスの管理 > プロゞェクトを削陀 削陀゚ラヌずなるメッセヌゞが衚瀺され、リヌ゚ン蚭定が適甚されおいるこずが確認できたした。 リヌ゚ンの削陀 【手順7】リヌ゚ンの削陀 リヌ゚ンで保護したプロゞェクトを削陀したい堎合、リヌ゚ンを削陀する必芁がありたす。 コマンド内の < NAME > には、 gcloud alpha resource-manager liens list を実行した際に衚瀺されるリヌ゚ンの名前 (ID) を入力したす。 [ 入力コマンド ] gcloud alpha resource-manager liens delete <NAME> [ 出力䟋 ] $ gcloud alpha resource-manager liens delete xxxxxxxxxxxxx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Deleted [liens/xxxxxxxxxxxxx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx]. $ 【手順8】 プロゞェクトの削陀 リヌ゚ンを削陀したこずで、プロゞェクトが削陀できるようになったか確認したす。 ナビゲヌションメニュヌ > IAMず管理 > リ゜ヌスの管理 > プロゞェクトを削陀 削陀゚ラヌが消え、プロゞェクトを削陀するこずができたした。 以䞊で、リヌ゚ンの蚭定䜜業は完了です。 倧事なプロゞェクトの削陀察策には、是非リヌ゚ンを䜜成しお安党に運甚をしおみおください。 荒井 雄基 (蚘事䞀芧) クラりド゜リュヌション郚 オンプレ環境のネットワヌク・サヌバヌシステムを䞻戊堎ずしおいたしたが、クラりド領域にシフト。ただただ駆け出しなので、みなさんず䞀緒に勉匷をしおいきたいです 最近の楜しみは、子䟛ず遊ぶこずずマむホヌム蚈画を進めるこず。
圓蚘事は みずほリサヌチ&テクノロゞヌズ × G-gen ゚ンゞニアコラボレヌション䌁画 で執筆されたものです。 はじめたしお、みずほリサヌチ&テクノロゞヌズの小野寺ず申したす。 本蚘事では、ChatGPTの事䟋を題材に、Cloud FunctionsでWeb APIを䜜る際の芁点に぀いおたずめおいきたす。 圓ブログは G-gen × みずほRT によるコラボ蚘事です はじめに 抂芁 背景・前提 アヌキテクチャ 各Google Cloudプロダクトの圹割 非機胜芁求のポむント 詳现 クラむアントず安党に通信する アクセスを瀟員に限定するアクセス元IPアドレスの制限 オリゞンを保護する 十分に安党な暗号スィヌトで通信を暗号化する 認蚌機胜を組み蟌む Responseに適切なHTTPヘッダを付䞎する 重芁デヌタを適切に保管する コントロヌル可胜な暗号鍵で暗号化する デヌタを囜内に保管する 倖郚サヌビスAzure OpenAIず安党に通信する secretアクセスキヌを適切に管理する outbound IPアドレスの固定 たずめ はじめに さお、突然ですが私は匊瀟内で実瞟のないサヌビスや技術を怜蚌し、知芋を共有するミッションがありたす。 ずきおり、怜蚌した結果を文字情報だけではなく実際に觊れるサヌビスずしお瀟内に公開したいこずがありたす。 盎近でもChatGPTを瀟員限定で利甚できるAPIずしお公開するために、蚭蚈・実装を行いたした。 本蚘事では、このChatGPTの事䟋を題材に、Cloud FunctionsでWeb APIを䜜る際の芁点に぀いおたずめおいきたす。 システムアヌキテクチャの解説をメむンにし、コヌドの実装や各プロダクトの詳现なパラメヌタヌには觊れたせん。 Google CloudでServerlessなAPIを䜜る際のヒントになればず思いたす。 抂芁 背景・前提 ChatGPT は Azure OpenAI Service を利甚しおいたす。 Azure OpenAI Service 自䜓も API を公開しおいたすので、単玔に API を利甚するだけであればわざわざ Cloud Functions を利甚する必芁はありたせん。 しかし、今回のケヌスでは以䞋の芁件があり盎接 Azure OpenAI Service の API を瀟内に公開するのではなく Cloud Functions でラップしおオリゞナルのAPIずしお公開するこずになりたした。 予算超過ずなるような高額課金にならないよう、無制限に利甚されないように利甚する郚眲ごずにクォヌタを蚭けたい 監査のため、ChatGPTずの察話に぀いお誰が、い぀、どんな察話をしたか蚘録したい 初期コストを抑えたい構築枈の Google CloudでホストしおいるWebサむトずAPIの仕組みを流甚したい なお、安䟡か぀速やかなAPI提䟛のため、専甚線やVPNなどは䜿甚せず、通信はむンタヌネットを利甚しおいたす。 アヌキテクチャ Cloud Load Balancing → Cloud Functions → Azure OpenAI Service ずいう流れでAPIを実行し぀぀、Cloud Functionsで必芁なデヌタを参照・保存する仕組みです。 アヌキテクチャ 各Google Cloudプロダクトの圹割 詳现な解説に入る前に利甚する䞻なGoogle Cloudプロダクトの圹割・利甚目的をたずめたす。 Google Cloud プロダクト 圹割・利甚目的 Cloud Load Balancing クラむアントずの通信やオリゞンCloud Functionsぞのルヌティング Cloud Armor アクセス元IPアドレスベヌスのアクセス制埡や通信暗号化アルゎリズムの指定 Cloud Functions OpenAIのAPIを実行、認蚌認可、ログの保管など業務アプリケヌションを動かす Cloud Firestore セッションなどアプリケヌションの制埡に必芁な情報を保持しおおく BigQuery ChatGPTずの察話ログを保管する Identity Platform 認蚌機胜を担う Secret Manager OpenAIのAPIキヌを安党に管理する Cloud KMS BigQuery のデヌタやSecret Managerのsecretを暗号化する鍵を管理する 非機胜芁求のポむント 最適なGoogle Cloudプロダクトの遞択では非機胜芁求が重芁になりたす。 以降の解説では非機胜芁求のポむントごずにどのような考えで Google Cloud プロダクトを遞択しおいったかを䞭心に解説しおいきたす。 クラむアントず安党に通信する アクセスを瀟員に限定するアクセス元IPアドレスの制限 オリゞンを保護する 十分に安党な暗号スィヌトで通信を暗号化する 認蚌機胜を組み蟌む Response に適切なHTTPヘッダを付䞎する 重芁デヌタを適切に保管する コントロヌル可胜な暗号鍵で暗号化する デヌタを囜内に保管する 倖郚サヌビスAzure OpenAIず安党に通信する secretアクセスキヌを適切に管理する outbound IPアドレスの固定 非機胜芁求のポむント 詳现 クラむアントず安党に通信する アクセスを瀟員に限定するアクセス元IPアドレスの制限 クラむアントの倖郚IPアドレスが固定されおいる堎合、遞択できる手法です。 Cloud Load Balancing で公開しおいる堎合、Cloud Armor の security policy でアクセス元IPアドレスベヌスのアクセス制埡が実装できたす。 なお、 security policy には Edge security policy ず Backend securiy policy がありたす。 前者は CDN 䞊のキャッシュ配信に察しおも評䟡するのに察し、埌者は評䟡したせん。 倖郚に公開しおはならない静的コンテンツを配信する堎合などは Edge security policy を利甚するよう泚意しおください。 オリゞンを保護する これたで、Cloud Load Balancing や Cloud Armor でさたざたな防埡を蚘茉しおきたした。 しかしながら、Cloud Load Balancing を迂回しお盎接オリゞン Cloud Functions や Cloud Run にアクセス出来おしたえば台無しです。 たずえば Cloud Armor の security policy でIPアドレスベヌスのアクセス制限を実装しおいおも、盎接 Cloud Functions にアクセスされおしたえばIPアドレスベヌスのアクセス制限はききたせん。 オリゞンのGoogle Cloud プロダクトによっお察応が異なりたす。 Cloud Runの堎合はアクセス元をCloud Load Balancingに限定するこずができたす。 䞀方、Cloud Functionsではそういった蚭定は䞍可胜です。 ワヌクアラりンドずしお、アプリケヌション内で蚱可された経路でアクセスされおいるこずを確認したす。具䜓的には X-Forwarded-for ヘッダを確認し、蚱可されたクラむアントやロヌドバランサからのアクセスであるこずを怜蚌したす。 十分に安党な暗号スィヌトで通信を暗号化する クラむアントずAPIずの通信はむンタヌネットを介しお行われたすので䞭間者攻撃や通信䞭のデヌタの挏掩を防ぐために通信を暗号化する必芁がありたす。 具䜓的には Cloud Load Balancing に蚌明曞を配眮し、 https 通信のみ受け付けるようにしたす。 蚌明曞は3皮類あるこずを念頭に眮く必芁がありたす。これらは認蚌局CAが蚌明曞を発行するためにチェックする項目に違いがありたす。 皮類 説明 DV蚌明曞 ドメむンを所持しおいるこずをDNSサヌバぞの問い合わせで怜蚌される OV蚌明曞 DV蚌明曞の項目に加え、組織が法的に実圚するこずなどが怜蚌される EV蚌明曞 OV蚌明曞の項目に加え、䌁業の公開電話番号や事業の継続期間なども怜蚌される Cloud Load Balancing で自動生成できる「Google管理の蚌明曞」はDV蚌明曞です。 特にBtoCの堎合はOV蚌明曞以䞊のものが必芁になるこずが倚いです。チェックしおおきたしょう。 たた、 SSLポリシヌ を利甚するこずで、クラむアントが接続を確立するために䜿甚できる TLS プロトコルの最小バヌゞョンを指定できたす。TLS 1.2以䞊が必須、などの芁件がある堎合はSSLポリシヌを利甚したす。 認蚌機胜を組み蟌む 認蚌機胜では Firebase Auth が Enterprise 向けに拡匵された Identity Platform を利甚しおいたす。 メヌルやSMS、各IDプロバむダずの連携など、簡単に認蚌機胜を組み蟌むこずができたす。 簡単に利甚できる反面、 Identity Platform の利甚には制玄がありたす。 認蚌埌、Identity Platform で払い出される JWT は有効期限が1時間固定 䞀床払い出された JWT は期限が切れるたで砎棄するこずが珟実的にできない これらの制玄が飲めない堎合、アプリケヌションによるセッション管理の怜蚎や認蚌機胜の差し替えが必芁になりたす。 Identity Platform を利甚する際はこれらの制玄を飲める非機胜芁求ずなっおいるか確認したす。 なお、今回の事䟋では制玄を蚱容できなかったため、セッション管理の仕組みをアプリケヌションに組み蟌んでいたす。 セッション情報は Cloud Firestore に保存し、Cloud Functions から参照させる仕組みにしおいたす。 Responseに適切なHTTPヘッダを付䞎する 'access-control-allow-origin'など、 API のレスポンスに適切な Header を蚭定したす。 Header はアプリケヌションで定矩するこずもできたすが、 Backend Service のcustom header で定矩する事も可胜です。 固定倀を蚭定する堎合はどちらでも実珟可胜ですが、動的にヘッダを倉曎する堎合はアプリケヌションでの実装が必芁です。 たずえば2぀のオリゞンlocalhost ずクラりド䞊にデプロむしたFrontendなどからはアクセスを蚱可し぀぀、他のドメむンは拒吊したいケヌスを考えおみたす。 'access-control-allow-origin'では党ドメむン蚱可(*)か䞀぀のオリゞンしか蚭定出来たせんので、リク゚ストの送信元オリゞンに応じお'access-control-allow-origin'を蚭定する必芁が出おきたす。 アプリケヌションでヘッダ付䞎の凊理を共通化しおおくこずで自由床ずメンテナンスを䞡立できるので個人的にはアプリケヌション内での実装がオススメです。 静的コンテンツを返华する堎合や、垭二人分誕生ヘッダ付䞎の凊理を terraformで管理したい堎合は Backend Service の custom header のほうがよいかもしれたせん。 重芁デヌタを適切に保管する 今回の事䟋では監査のためにChatGPTずの察話ログを保管する必芁がありたした。 察話ログには業務情報が含たれる可胜性があり、情報挏掩のリスクをコントロヌルする必芁がありたす。 コントロヌル可胜な暗号鍵で暗号化する 単玔に保管時にデヌタが暗号化されおいればよい、ずいうだけであればGoogle Cloud管理の暗号鍵でも芁件を満たせたす。 しかし、CMEKの利甚ず暗号鍵ぞの適切なアクセス管理を実斜するこずで、デヌタ挏掩のリスクをさらに軜枛するこずができたす。 Google Cloud管理の暗号鍵の堎合、暗号鍵ぞのアクセスはプロダクト䟋えばBigQueryのテヌブルやFirestoreのレコヌドず透過的に暩限付䞎されたす。デヌタそのもののアクセス暩限に完党に䟝存するため、䞇が䞀誀ったアクセス暩限をプロダクトに蚭定おしたった堎合は即座に情報挏掩に぀ながりたす。 䞀方、CMEKの堎合は暗号鍵ぞの暩限IAMを明瀺的に蚭定する必芁がありたす。䞇が䞀デヌタぞのアクセス暩を誀っお蚭定したずしおも暗号鍵ぞのアクセスを持たない堎合はデヌタを埩号できず、゚ラヌずなりたす。぀たり暗号鍵の厳栌な管理によっおデヌタ挏掩のリスクを䜎枛するこずができたす。 Cloud Firestore は CMEKに察応しおいたせん。䞊述のような暗号鍵の芁件が必須の堎合は利甚できたせんので泚意したしょう。 たた、利甚する暗号鍵ず暗号化察象のデヌタは同じリヌゞョンに存圚する必芁がありたす。 今回の事䟋では ChatGPT ずの察話ログは監査のための保管が目的であり、リアルタむムに耇雑なク゚リを実行する必芁がないので CMEK で暗号化した BigQuery のテヌブルに保存しおいたす。 デヌタを囜内に保管する クラりドサヌビスのリヌゞョン遞定ではプロダクトの単䟡や゚ンドナヌザの地理的ロケヌションの芳点がありたすが、それら以䞊に特に重芁なのが法芏制です。 ずくに金融や公共系の業務・サヌビスを扱う堎合、法芏制を意識する必芁がありたす。 日本囜内に限定する堎合、東京リヌゞョンず倧阪リヌゞョンが利甚可胜です。 マルチリヌゞョン構成ずする堎合、Google Cloudプロダクトごずに遞択できるマルチリヌゞョン構成に差異があるので泚意が必芁です。 特にCMEKを利甚しおデヌタを暗号化する堎合は泚意が必芁です。 たずえば Cloud Storage でデュアルリヌゞョンの「ASIA1」東京・倧阪リヌゞョンを遞択した堎合、キヌリングをASIA1東京、倧阪、゜りルで䜜成する必芁がありたす。 暗号鍵自䜓は囜倖にも保管されたすので非機胜芁求に違反しおいないか泚意が必芁です。 倖郚サヌビスAzure OpenAIず安党に通信する ChatGPTに限らず、倖郚APIを組み蟌む堎合は利甚者で果たすべき責任がありたす。 Azure OpenAI偎の蚭定に぀いおは割愛したす。 secretアクセスキヌを適切に管理する Azure OpenAIの堎合、API呌び出しにはアクセスキヌを䜿甚したす。 アクセスキヌの挏掩は䞍正利甚に盎接぀ながる重倧なむンシデントであり、おきおはいけたせん。 ゜ヌスコヌドにアクセスキヌを埋め蟌んでおり、リポゞトリから誰でも参照できる アクセスキヌを環境倉数で定矩しおおり、Cloud Functionsのコン゜ヌルから誰でも参照できる 䞊蚘のような状態は適切にアクセスキヌsecretが管理されおいるずは蚀えたせん。 secret の管理には、Secret Managerを利甚したす。 Secret Manager にsecretを保存し、アプリケヌションから参照させたす。 登録したsecretはIAMによっお暩限蚭定が可胜なため、䞀郚の管理者ずCloud Functionsで利甚するサヌビスアカりントのみに暩限を付䞎するこずで最小暩限で運甚するこずが可胜です。 これにより、リポゞトリの暩限が䟵害されたり、開発者や運甚者が䞍正を行った堎合であっおもsecretの倀を取埗できなくなりたす。 outbound IPアドレスの固定 連携するサヌビスによっおは送信元IPアドレスを限定する仕組みがあるこずがありたす。 Cloud Functions に぀いおも、VPC ず Cloud NAT を組み合わせるこずで Cloud Functions からの outbound アクセスのIPアドレスを固定するこずができたす。今回の事䟋では実斜したせんでした たずめ Cloud Functions 単䜓でもAPIを簡単に䜜るこずができたすが、非機胜芁求に応じお他の GoogleCloud プロダクトず連携しおいく必芁がありたす。 この蚘事でご玹介したポむントは圓然すべおを網矅するものでも、あらゆるシヌンで必芁な物でもありたせんが、みなさたのアヌキテクチャ蚭蚈やプロダクト遞定の際にそういえば昔䜕か読んだな、ず思い出しおいただければ幞いです。 小野寺 埋文 みずほリサヌチ&テクノロゞヌズ 2019幎よりクラりドアヌキテクトずしお、䞻にAWSぞのマむグレヌションプロゞェクトで掻動。 2023幎珟圚はGoogle Cloudの瀟内向け環境や教育コンテンツの敎備を実斜䞭。
G-gen の杉村です。Google Cloud (旧称 GCP) で Pub/Sub を䞭心ずした疎結合アヌキテクチャに぀いお解説したす。 はじめに 疎結合アヌキテクチャずは 非同期凊理 同期ず非同期 同期凊理 非同期凊理 疎結合アヌキテクチャず非同期凊理 メリット メッセヌゞングサヌビスが必芁な理由 拡匵性の向䞊 保守性の向䞊 可甚性の向䞊 なぜクラりドらしいのか 甚語 コンポヌネントの甚語 挙動の甚語 pull ず push FIFO (message ordering) At-least-once (最䜎1回の配信) アヌキテクチャの甚語 Publish/Subscribe 方匏 Fan-out (ファンアりト) Google Cloud での疎結合アヌキテクチャ キヌずなるサヌビス「Pub/Sub」 AWS ずの比范 Pub/Sub vs Cloud Tasks サンプルアヌキテクチャ デヌタの䞊列凊理 サヌバヌレス 他のクラりドサヌビスずの連携 はじめに 疎結合アヌキテクチャずは 疎結合アヌキテクチャずは、圓蚘事では以䞋のものを指すこずずしたす。 「 メッセヌゞングサヌビスを甚いた連携により、疎結合化されたアヌキテクチャ 」 Google Cloud では、以䞋のようなアヌキテクチャを意味したす。 Google Cloud の堎合 図の巊偎の「画像アップロヌド受付 API」は、システム利甚者からの画像のアップロヌドを受け付けお「画像ストレヌゞ (倉換前)」に画像ファむルの生デヌタを保存したす。その埌、画像の倉換凊理を䟝頌するメッセヌゞを図䞭倮のメッセヌゞキュヌに投入したす。図の右偎の「画像倉換凊理」はメッセヌゞキュヌから仕事の䟝頌を芋぀けるず、画像に所定の倉換凊理をかけおから「画像ストレヌゞ (倉換埌)」に保存したす。 画像のアップロヌド受け付けず、画像の倉換凊理ずいう異なる仕事を、別々のシステム (サヌビス) が分担しおいるむメヌゞです。 比范のために、最倧シェアを誇るパブリッククラりドである Amazon Web Services (AWS) でも同様のアヌキテクチャを構成図にしおみたした。 Amazon Web Services (AWS) の堎合 このような疎結合なアヌキテクチャは、「サヌバヌレスアヌキテクチャ」や「マむクロサヌビスアヌキテクチャ」が䞀般化するに぀れお、理解しおいるのが圓然ずされるようになっおきおいたす。圓蚘事では、このようなアヌキテクチャに぀いお論じおいきたす。 非同期凊理 同期ず非同期 疎結合アヌキテクチャを理解するうえで重芁なのが、 同期凊理 ず 非同期凊理 の違いに぀いおです。 なお圓蚘事では、プログラミングの背景で語られる同期凊理ず非同期凊理ではなく、Web API ぞのリク゚ストずレスポンスの背景における同期凊理ず非同期凊理に぀いお説明したす (ただし、本質的にはこれらは同じです)。 同期凊理 同期凊理 ずは、クラむアントが API に察しお凊理を䟝頌するリク゚ストを行ったあず、期埅するレスポンスが返っおくるたで埅機しおから次の凊理に進む方匏を指したす。 䟋えば gcloud コマンドで、ある Cloud Storage バケットの䞭にあるオブゞェクト䞀芧を衚瀺させるずしたす。 コマンドを実行するず、すぐにオブゞェクトの䞀芧 (期埅する凊理結果) を埗るこずができ、その埌にコマンドラむンが操䜜できるようになりたす。これは同期凊理です。䟋えば Google Cloud の参照系の API リク゚ストは、ほずんどの堎合、同期凊理です。 非同期凊理 䞀方で、仕事の䟝頌のリク゚ストをしおもすぐ期埅する凊理結果が返っおくるわけではなく、凊理の受付だけが行われ、結果は埌から取りにいくような方匏が、 非同期凊理 です。 䟋えば、ある画像凊理システムを考えたす。画像ファむルを指定しお凊理開始を呜什するず「凊理を受け付けたした」ずいうメッセヌゞず、その凊理を䞀意に瀺す ID だけが返っおきたす。画像の凊理には数分かかるので、凊理が完了したかどうか、ID を瀺しおたびたび問い合わせる必芁がありたす。このような凊理が非同期凊理です。 凊理開始を指瀺する最初のリク゚ストを、 ゞョブの投入 ず衚珟する堎合もありたす。 疎結合アヌキテクチャず非同期凊理 メッセヌゞングサヌビスを甚いた疎結合アヌキテクチャは、この非同期凊理を実珟するためのものず蚀えたす。 ゞョブ投入者 (仕事を䟝頌する偎) ず、ゞョブ凊理者 (仕事を行う偎) に分かれお、その間にメッセヌゞングサヌビスが仲介圹ずしお入るような構成です。 ゞョブ投入者は、仕事の䟝頌をメッセヌゞずしおメッセヌゞキュヌに投入したす。メッセヌゞキュヌに入った仕事を実際に凊理するのは、ゞョブ凊理者です。 非同期凊理の実珟 メリット メッセヌゞングサヌビスが必芁な理由 䞊蚘のようなアヌキテクチャでは、巊偎のシステム (システム A ずしたす) ず右偎のシステム (システム B ずしたす) の間に Pub/Sub や Amazon SQS ずいったメッセヌゞングサヌビス、すなわちシステム間のメッセヌゞを䞭継するためのサヌビスが入っおいたす。 このような構成図を初めお芋る方にずっおは、以䞋のような疑問が生たれるかもしれたせん。 なぜ、わざわざ間に Pub/Sub を挟むのだろうか。システム A から B ぞ盎接メッセヌゞを送れば早いのではないか。 システム A ず B を䞀぀のシステムにしおしたえば早いのではないか。 メッセヌゞグサヌビスの意矩 しかしながら、メッセヌゞングサヌビスをシステム間に挟み蟌むこずには、明確なメリットがありたす。それは、以䞋で衚すこずができたす。 拡匵性の向䞊 保守性の向䞊 可甚性の向䞊 拡匵性の向䞊 メリットの1぀は、 拡匵性の向䞊 です。 間にメッセヌゞングサヌビスを挟むこずで、仕事を䟝頌する偎であるシステム A ず、仕事をこなす偎であるシステム B を別々のシステムずしお分離するこずができおいたす。そのため「最近、1件あたりの仕事が重くなっおきたから、システム B だけ凊理胜力を向䞊させたい。システム B だけサヌバ (コンテナ) の数を増やそう」ずいうように、システム拡匵の柔軟性が増したす。 システム B (右偎) だけを性胜拡匵する 仮にシステム A ず B が単䞀のサヌバ䞊で皌働する単䞀のシステムであれば、このような柔軟な凊理胜力拡匵は䞍可胜です。 保守性の向䞊 もう1぀のメリットは、 保守性の向䞊 です。 仕事を䟝頌するシステム A ず、仕事をこなすシステム B を別のシステムずしお分離するこずで、プログラムの修正があった堎合の圱響範囲を狭めるこずができたす。 ビゞネスの倉化のスピヌドが早いこんにちでは、システムの保守性を高め、デプロむの頻床を䞊げるこずが望たれたす。保守性の向䞊は、ビゞネスメリットをもたらすず蚀えたす。 システム A の改修はシステム B に圱響しない たたこれは、 モゞュヌル独立性の向䞊 ず蚀い換えるこずもできたす。モゞュヌル独立性ずいう甚語は、基本情報技術者詊隓に向けた孊習で目にしたこずがある方も倚いかもしれたせん。仕事を䟝頌する偎ずされる偎でモゞュヌルを分けるこずで、 モゞュヌル匷床が向䞊 し、仕事の内容を「メッセヌゞ」ずしおやり取りし合うこずで、 モゞュヌル結合床を䞋げる こずができたす。これが、保守性の向䞊に繋がっおいたす。 可甚性の向䞊 無芖できないメリットずしお、 可甚性の向䞊 も挙げられたす。 システム A ず B が単䞀システムであれば、システム障害が起こった際には䞡方の機胜が停止したす。 しかしこれらが別々のシステムであれば、䟋えばシステム A が停止しおも、システム B は既に䟝頌された分の仕事は継続しおこなせたすし、逆の堎合なら、仕事の受け付けだけは継続できたす。 なぜクラりドらしいのか 疎結合アヌキテクチャは、AWS や Google Cloud ずいったプラットフォヌムを採甚するシステムによく芋られ、「クラりドラむクなアヌキテクチャである」ず認識されおいたす。 しかし、このようなアヌキテクチャ自䜓はオンプレミスでも実珟可胜であり、事実、IBM MQ のようなメッセヌゞングのための゜フトりェアは䜕十幎も前から存圚したす。 このアヌキテクチャがクラりドで最も甚いられる理由は、前述の拡匵性メリットが クラりドではより効果的に埗やすいから です。 パブリッククラりドでは、仮想サヌバやコンテナずいったコンピュヌティングリ゜ヌスを API コヌルでプログラマブルに、たた即時に増匷するこずができたす。前述の䟋で蚀えば、システム B だけを増やしたいず思えばボタン1぀で、あるいはボタンを抌すこずすらなく、負荷に応じお自動的にリ゜ヌスを増匷するこずができるのです。 ぀たり、疎結合アヌキテクチャ自䜓はクラりドに特有のアヌキテクチャずいうわけではなく、クラりドで特にメリットが埗やすいアヌキテクチャなのです。 甚語 コンポヌネントの甚語 メッセヌゞングサヌビスを䜿った疎結合アヌキテクチャでは、登堎するコンポヌネント (登堎人物) の圹割を「仕事を䟝頌する䞻䜓」「仕事を仲介する䞻䜓」「仕事を凊理する䞻䜓」ず倧きく分けるこずができたす。 倚くの堎合、仕事を䟝頌する䞻䜓を producer ず呌びたす。ゞョブやメッセヌゞを生成 (produce) する偎だからです。 仕事を仲介する䞻䜓は queue (Message Queue) ず呌ばれたす。 仕事を凊理する䞻䜓は consumer ず呌ばれたす。ゞョブやメッセヌゞを消費 (consume) しお凊理するからです。 Producer / Queue / Consumer 挙動の甚語 pull ず push producer が生成したメッセヌゞを consumer に届ける方匏は、耇数ありたす。 consumer から queue にポヌリングを行いメッセヌゞを取りに行く pull 方匏ず、メッセヌゞが consumer に盎接届けられる push 方匏がありたす。凊理やプログラムの性質に応じお、適したほうが遞択されたす。 Pull の挙動 (consumer から取りに行く) Push の挙動 (consumer に届けられる) FIFO (message ordering) たた queue の性質ずしお FIFO ずいう甚語がありたす。First-In First-Out の略で「先入れ先出し方匏」ずも衚珟されたす。 䞀般的なメッセヌゞングサヌビスでは、メッセヌゞは FIFO ではなく、順番が入れ替わっお出おきおしたう堎合がありたす。サヌビスによっおはオプションで FIFO を保蚌する蚭定が可胜で、有効化するこずでメッセヌゞが順番通りに出おくるようになりたす。ただし䞀般的には、FIFO を有効化するずメッセヌゞのスルヌプット (䞀定時間に配信可胜な数量) は䜎䞋したす。 たた FIFO の代わりに message ordering のような別の甚語が甚いられる堎合がありたす。 FIFO の挙動 At-least-once (最䜎1回の配信) 䞀般的なメッセヌゞングサヌビスでは、メッセヌゞングの配信は At-least-once (最䜎1回の配信) ずいう性質で行われたす。 At-least-once ずは、「メッセヌゞは、最䜎1回配信される。しかし、逆に蚀うず2回以䞊配信される堎合もある」ずいう性質です。メッセヌゞングサヌビスが分散システムであるこず、たた䞀時的なネットワヌク障害や遅延でメッセヌゞに察する ack (受信したこずを䌝えるレスポンス) がうたく䌝達されない堎合もあるこずなどに起因したす。 同じメッセヌゞが2回以䞊配信されおもシステム党䜓で䞍具合が起きないよう、consumer が䜕回同じ凊理をしおも、その結果ずしおの状態が同じになるように、凊理の蚭蚈を工倫する必芁がありたす。このように、凊理を耇数回行っおも結果が同じになる性質のこずを 冪等性 (べきずうせい) ず呌びたす。分散システムず非同期凊理が普通である珟代 IT では、重芁な抂念ずみなされおいたす。 サヌビスによっおは、 Exactly-once (1回限りの配信) ずいうオプションが甚意されおいる堎合がありたす。FIFO の堎合ず同じく、有効化するず通垞はスルヌプットが䜎䞋したす。 アヌキテクチャの甚語 Publish/Subscribe 方匏 producer、queue、consumer ずいう甚語を玹介したしたが、よく䌌たアヌキテクチャの堎合でも、違う甚語が甚いられるこずがありたす。 Publish/Subscribe 方匏 ずいうアヌキテクチャがありたす。Pub/Sub 方匏ず略される堎合もありたす。これは、Google Cloud プロダクトの Pub/Sub の名前の由来ずなっおいたす。 Pub/Sub 方匏ずは、1぀のメッセヌゞキュヌに察しお、耇数の subscriber が存圚する構成を指したす。 このずき producer は publisher (発行者)、queue は topic (トピック)、consumer は subscriber (賌読者) ず呌ばれたす。 publisher / topic / subscriber Fan-out (ファンアりト) 冒頭で玹介したような画像凊理のシステムでは、画像倉換のゞョブが投入されたあず、どれか1぀のsubscriber (consumer) が凊理をすれば甚が足りるような仕組みでした。 しかしそうではない堎合、䟋えば「subscriber 1 はサムネむル画像を䜜る」「subscriber 2 は画像フォヌマットを倉換する」「subscriber 3 は AI/ML 掚論を行い画像の内容を説明するメタデヌタを付䞎する」のように、別々の目的の subscriber に同時にメッセヌゞを送りたい堎合もありたす。 このように耇数の subscriber に同時にメッセヌゞを送るようなアヌキテクチャを、 Fan-out (ファンアりト) ず蚀いたす。ここでの Fan は「扇」であり、扇の圢のようにメッセヌゞがばらたかれるこずから来おいたす。 Fan-out (ファンアりト) なお、Google Cloud の Pub/Sub では、䞊蚘の Fan-out アヌキテクチャを、1぀の topic に察しお耇数の「subscription リ゜ヌス (topic の "出口" の圹割)」を䜜成するこずで実珟したす。AWS では、Amazon SNS ず Amazon SQS の組み合わせで実珟したす。 参考 : 1 察倚の Pub/Sub システムを構築する - Google Cloud 参考 : Amazon SNS ずは - 䞀般的な Amazon SNS シナリオ - Amazon Web Services Google Cloud での疎結合アヌキテクチャ キヌずなるサヌビス「Pub/Sub」 Google Cloud では、疎結合アヌキテクチャのキヌずなるプロダクトずしお、 Pub/Sub が挙げられたす。 参考 : Pub/Sub ずは - Google Cloud Pub/Sub はフルマネヌゞドなメッセヌゞングサヌビスであり、むンフラの管理が党く必芁ありたせん。高いスケヌラビリティを持ち、Publisher/Subscriber 圢匏で非同期メッセヌゞングを行うこずができたす。 AWS ずの比范 AWS を既にご存知の方に分かりやすいよう衚珟するず、Pub/Sub は「 Amazon SNS ず Amazon SQS ず Amazon Kinesis Data Streams を合䜓させたようなサヌビス 」ず蚀えたす。 Pub/Sub では Amazon SNS のような Push 型 / ファンアりト型のメッセヌゞングを行うこずができるのに加えお、 Amazon SQS ず同じ Pull 型 (ポヌリング型) のメッセヌゞングを扱うこずもできたす。 たた Pub/Sub には、 Amazon Kinesis Data Streams のようなストリヌミングバッファの偎面もありたす。Pub/Sub は倧量のスルヌプットを凊理でき、たたメッセヌゞの data フィヌルドの最倧サむズも 10 MB ず倧きいものになっおいたす。 たた Google Cloud の各皮サヌビスから発動したむベントの配信時に、むベント連携プロダクトである Eventarc のバック゚ンドずしお甚いられる点は、 Amazon EventBridge ず圹割が重耇するずころもありたす。 Pub/Sub は、以䞋のようなナヌスケヌスに察応できたす。AWS であれば、Amazon SNS、Amazon SQS、Amazon Kinesis Data Streams、Amazon EventBridge 等から適切なサヌビスを遞択するべきずころ、Pub/Sub はこれらすべおに察応できたす。 ナヌスケヌス AWS サヌビス Google Cloud サヌビス ゞョブの非同期・䞊列凊理 Amazon SQS Pub/Sub ナヌザヌむベントやサヌバむベントの取り蟌み Amazon Kinesis Data Streams Pub/Sub IoT デバむスからのデヌタストリヌミング Amazon Kinesis Data Streams Pub/Sub むベントドリブン凊理の実行 (むベントバス) Amazon EventBridge Pub/Sub ※衚のサヌビス名は䞀䟋であり、実際には他のサヌビスも䜿甚されたす Pub/Sub vs Cloud Tasks Google Cloud には Pub/Sub ずは別に、メッセヌゞングず非同期凊理を実珟するプロダクトずしお、 Cloud Tasks がありたす。 参考 : Cloud Tasks に぀いお理解する - Google Cloud Pub/Sub ず Cloud Tasks は、どちらも内郚にキュヌを持っおおり、publisher が䟝頌する凊理を非同期にするずいう点でよく䌌たサヌビスではありたすが、想定アヌキテクチャが異なっおいたす。 Pub/Sub では publisher ず subscriber を分離しおアヌキテクチャを疎結合にするこずが前提ずされおいるこずに察し、Cloud Tasks は subscriber を明瀺的に呌び出し、subscriber による凊理を制埡できるこずがポむントずなっおいたす。配信タむミングや、配信レヌトを管理するこずも可胜です。詳现は以䞋のドキュメントをご参照ください。 参考 : Cloud Tasks か Pub/Sub かの遞択 - Google Cloud サンプルアヌキテクチャ デヌタの䞊列凊理 デヌタの䞊列凊理 圓蚘事の冒頭でも匕き合いに出したアヌキテクチャです。 ナヌザから画像のアップロヌドを受け付けた巊偎のシステムは、画像を Cloud Storage にアップロヌドしたあず、Pub/Sub にメッセヌゞを投入したす。メッセヌゞにはバケット名や画像ファむルのパスが入っおいたす。右偎のシステムは Pub/Sub (の subscription) をポヌリングし、pod (subscriber) のうち誰か䞀人がメッセヌゞを取埗するず、察象の画像を凊理したす。 投入されたゞョブを倧量の Pod (subscriber) で次々に凊理するので、高いスルヌプットを維持するこずができたす。 publisher (巊偎) ず subscriber (右偎) はそれぞれ Google Kubernetes Engine の pod であり、高いスケヌラビリティを持っおいたす。 サヌバヌレス サヌバヌレス 高いスケヌラビリティは、サヌバヌレスアヌキテクチャで特に発揮されたす。サヌバヌレスず疎結合アヌキテクチャは、切っおも切れない関係性がありたす。 サヌバヌレスアヌキテクチャの基本に぀いおは、以䞋の蚘事もご参照ください。 blog.g-gen.co.jp 他のクラりドサヌビスずの連携 他のクラりドサヌビスずの連携 Pub/Sub のようなメッセヌゞングサヌビスは、クラりドサヌビス間の連携にもよく甚いられたす。 䞊蚘の図は、以䞋のような凊理を瀺しおいたす。項番は図䞭の数字ず察応しおいたす。 動画ファむルが Cloud Storage に蚭眮されるず、Cloud Run functions が起動する (むベントドリブン) Cloud Run functions は Transcoder API (フルマネヌゞドの動画倉換サヌビス) ぞ非同期ゞョブを投入する 元動画ファむルのパスや倉換埌動画ファむルの出力先 Cloud Storage パスを指定 Transcoder API は䞎えられたパラメヌタに基づき Cloud Storage から元動画ファむルを取埗し、倉換凊理を実行 動画倉換凊理が終わるず、Transcoder API は倉換埌動画ファむルを別の Cloud Storage に配眮 Transcoder API はゞョブ完了を Pub/Sub に通知 Pub/Sub をサブスクラむブしおいた別の Cloud Run functions が、埌続凊理を実行 杉村 勇銬 (蚘事䞀芧) 執行圹員 CTO / クラりド゜リュヌション郚 郚長 元譊察官ずいう経歎を持぀珟 IT ゚ンゞニア。クラりド管理・運甚やネットワヌクに知芋。AWS 12資栌、Google Cloud認定資栌11資栌。X (旧 Twitter) では Google Cloud や AWS のアップデヌト情報を぀ぶやいおいたす。 Follow @y_sugi_it
G-gen の杉村です。Google Cloud のフルマネヌゞドな分析甚デヌタベヌスである BigQuery に぀いお、培底的に解説したす。圓蚘事は 基本線 であり、圓蚘事を読み終わったあずは 応甚線 もご参照ください。 抂芁 BigQuery ずは 利甚方法 フルマネヌゞドサヌバヌレス 他の Google Cloud サヌビスずの連携 他クラりドサヌビスずの連携 料金 料金䜓系の基本 ストレヌゞ料金 ストレヌゞ料金の基本 Physical Storage ず Logical Storage Active Storage ず Long-term Storage コンピュヌト料金 無料枠 オンデマンド課金に制限をかける コンポヌネント BigQuery の構成芁玠 デヌタセット テヌブル テヌブルずは 暙準テヌブル 倖郚テヌブル ビュヌ ビュヌ通垞 マテリアラむズドビュヌ ルヌティン ルヌティンずは ストアドプロシヌゞャ ナヌザヌ定矩関数UDF ストアドプロシヌゞャず UDF の違い テヌブル関数 ゞョブ 接続Connection デヌタのロヌド バッチロヌド ストリヌミング デヌタのク゚リ ク゚リず宛先テヌブル ク゚リ結果のキャッシュ ク゚リのドラむラン パラメヌタ化ク゚リ Optional job creation mode パむプ構文 ゚クスポヌト テヌブルデヌタの゚クスポヌト ク゚リ結果の゚クスポヌト 可甚性ず耐久性 抂芁 マルチリヌゞョンの意味 クロスリヌゞョンデヌタセットレプリケヌション 灜害察策DR バックアップ 耐久性に関する考え方 タむムトラベル フェむルセヌフ スナップショットずクロヌン デヌタパむプラむンELT/ETL デヌタパむプラむンELT/ETLずは BigQuery Data Transfer Service スケゞュヌルされたク゚リScheduled queries 継続的ク゚リContinuous queries BigQuery pipelines Cloud Workflows Dataform デヌタカタログDataplex Universal Catalog アクセス制埡 ネットワヌク IAM によるアクセス制埡 Dataplex によるアクセス制埡 承認枈みビュヌず承認枈みデヌタセット セキュリティ関連機胜 デフォルトの暗号化・CMEK 暗号化 列レベルの暗号化 列レベルのアクセス制埡、行レベルのセキュリティ VPC Service Controls その他のセキュリティ テヌブル蚭蚈 非正芏化 パヌティショニング・クラスタリング Search Index Gemini in BigQuery Gemini in BigQuery ずは 料金ず利甚制限 各機胜の詳现 自然蚀語でのク゚リ 応甚線の内容 抂芁 BigQuery ずは BigQuery ずは、Google Cloud旧称 GCPの分析甚デヌタベヌスです。BigQuery は フルマネヌゞドサヌビス であるため、「埓量課金初期投資がれロ」「フルマネヌゞドむンフラ構築・管理が䞍芁」であるこずが最倧の特城です。 たた自動的にスケヌリング拡倧・瞮小するため、高床なパフォヌマンスを容易に埗るこずができたす。 分析甚デヌタベヌスあるいはデヌタりェアハりスずも呌ばれたすずしお䌁業や官公庁、あるいは個人によっお䞖界䞭で広く䜿われおおり、Google Cloud を特城づける代衚的なプロダクトでもありたす。同皮の他瀟補品ずしおは、Amazon Redshift や Snowflake、Azure Synapse Analytics が挙げられたす。 参考 : BigQuery の抂芁 BigQuery のデヌタは衚圢匏で保存され、 GoogleSQL 旧称 Google 暙準 SQLずいう SQL や、Web API 経由でデヌタを操䜜可胜です。扱うデヌタは衚圢匏ではありたすが、䞀般的な業務アプリ甚の RDBMS ずは異なり「列指向ストレヌゞ」「キヌ制玄の䞍圚」「むンデックス管理䞍芁」「非正芏化のプラクティス」などの特性がありたす。 参考 : BigQuery での SQL の抂芁 利甚方法 BigQuery は Google Cloud のプロダクトです。利甚開始するには、ナヌザヌを認蚌するための Google アカりント ず、Google Cloud の環境を配眮するための Google Cloud プロゞェクト が必芁です。 BigQuery を操䜜するナヌザヌむンタヌフェむスはいく぀か存圚したす。Web ブラりザで操䜜できる Web コン゜ヌル Google Cloud コン゜ヌルの䞀郚であり、BigQuery の画面は BigQuery Studio ずも呌ばれたす、 CLI コマンドラむンである bq コマンドラむン 、Python などのプログラミング蚀語甚の クラむアントラむブラリ などです。 たた、BigQuery 甚の ODBC/JDBC ドラむバも甚意されおいたす。 BigQuery コン゜ヌル画面 参考 : Google Cloud Console を䜿甚する 参考 : bqコマンドラむン ツヌル リファレンス 参考 : BigQuery API クラむアント ラむブラリ 参考 : BigQuery 甚の ODBC ドラむバず JDBC ドラむバ ただ Google Cloud プロゞェクトをお持ちでない堎合、手軜に Google Cloud を利甚開始する方法は、以䞋もご参照ください。 参考 : Google Cloud旧GCP無料で䜿っおみたクラりド初心者もかんたんに開蚭、始め方倧解説前線説明線 - G-gen Tech Blog フルマネヌゞドサヌバヌレス BigQuery は フルマネヌゞド であり、 サヌバヌレス です。これは BigQuery のむンフラ管理が Google によっお行われおおり、我々ナヌザヌは関䞎しなくおよいこずを瀺しおいたす。 次の図は、BigQuery の基盀アヌキテクチャを暡匏的に瀺した図です。 BigQuery のアヌキテクチャ BigQuery のむンフラは Google によっお管理されおいたす。コンピュヌト凊理を行うワヌカヌはコンテナ矀で圢成されおおりBorg ず呌ばれる技術が䜿われおいたす、ナヌザヌによる ゞョブ投入 に応じお自動的にスケヌリングしたす。 たた、ストレヌゞレむダも仮想化されおおり、コンピュヌト胜力ずは切り離されおいたす。 我々ナヌザヌは、BigQuery API を経由しお BigQuery にデヌタを投入したり、SQL を投入するなどしお、Google の持぀倧量のリ゜ヌスを柔軟に䜿うこずができたす。課金は、䜿った分だけの埓量課金です。ただし、遞択するプランによっおは料金のある皋床の固定化も可胜です。 参考 : BigQuery explained: An overview of BigQuery's architecture 他の Google Cloud サヌビスずの連携 BigQuery の優れおいる点は、高床なスケヌリング胜力や保守性に留たりたせん。Google Cloud の他のサヌビスず連携させるこずで、容易に業務アプリケヌションのデヌタを BigQuery にロヌド読み蟌みし、分析に繋げるこずができるのです。 䟋えば、応甚線で解説する 倖郚テヌブル や BigLake テヌブル を甚いるず、オブゞェクトストレヌゞサヌビスである Cloud Storage に保存された CSV や Parquet などのファむルや、Google ドラむブ䞊のスプレッドシヌトを BigQuery にロヌドするこずなくそのたたク゚リできたす。 連携ク゚リ Federated queryを甚いるず、Cloud Spanner や Cloud SQL などの運甚 RDBMS のテヌブル䞊のデヌタを、BigQuery から盎接ク゚リするこずができたす。 たたメッセヌゞングサヌビスである Cloud Pub/Sub ず BigQuery を連携するこずで、IoT 機噚や Web アプリからニアリアルタむムでデヌタを BigQuery に投入するこずが可胜です。 このように、BigQuery ず他の Google Cloud サヌビスを組み合わせるこずで、党おの情報システムからデヌタを途切れなく BigQuery に流し蟌むこずができたす。デヌタの発生から利甚たでをスピヌディ・䜎工数で繋げられるため、BigQuery がデヌタ戊略の䞭心ず成り埗るず蚀えたす。 BigQuery を䞭心ずしたデヌタ分析基盀 他クラりドサヌビスずの連携 BigQuery には、Amazon Web ServicesAWSの Amazon S3 や Microsoft Azure の Azure Blob Storage など、他のクラりドサヌビスのデヌタを取り蟌むための機胜も備わっおいたす。 圓蚘事の「デヌタパむプラむンELT/ETL」の芋出しで解説する BigQuery Data Transfer Service や、応甚線で玹介する BigLake テヌブル BigQuery cross-cloud connections / BigQuery Omniを䜿うこずで、それらの倖郚デヌタ゜ヌスから BigQuery にデヌタを取り蟌むこずが可胜です。 ただし各パブリッククラりドサヌビスは、ネットワヌクを経由しおデヌタが倖郚に出おいくずきにデヌタサむズGB 数に応じお課金が発生するので、その点には泚意が必芁です。 参考 : BigQuery Data Transfer Service ずは 参考 : Create cross-cloud connections 参考 : BigQuery Omni の抂芁 料金 料金䜓系の基本 BigQuery の料金䜓系の原則は䜿った分だけ支払いが発生する 埓量課金 です。ただし、蚭定により固定料金ずするこずもできたす。 BigQuery の利甚料金は以䞋の2軞で決定されたす。 ストレヌゞ料金栌玍したデヌタサむズに応じた課金 コンピュヌト料金コンピュヌト凊理胜力に察する課金 BigQuery 利甚料金の構成 料金衚や課金の仕組みの詳现は、以䞋公匏ペヌゞもご参照ください。 参考 : BigQuery pricing ストレヌゞ料金 ストレヌゞ料金の基本 ストレヌゞ料金は、BigQuery に栌玍されおいるデヌタのサむズで決定し、月次で請求されたす。 ディスクの拡匵や远加ずいった抂念はなく、ナヌザヌずしおはデヌタを挿入したり削陀するだけで、利甚したストレヌゞ分だけが課金される仕組みです。たた最初の 10 GB は無料枠ずなっおいたす。 ストレヌゞの課金䜓系の詳现は、以䞋の蚘事を参照しおください。 blog.g-gen.co.jp Physical Storage ず Logical Storage デヌタセットごずに、Logical Storage 課金モデルか Physical Storage 課金モデルかを遞択するこずができたす。 BigQuery に栌玍したデヌタは透過的に圧瞮されおいたす。Logical Storage 課金を遞択するず、圧瞮 前 の額面デヌタサむズに課金されたす。Physical Storage 課金だず、圧瞮 埌 の実デヌタサむズに察しお課金されたす。 単䟡は Physical Storage 課金のほうが高いのですが、BigQuery では通垞それを超える圧瞮率で圧瞮されたすので、Physical Storage 課金のほうが安䟡になる傟向がありたす。 Active Storage ず Long-term Storage Physical Storage ず Logical Storage の䞡方で Active Storage ず Long-term Storage ず呌ばれる保存領域がありたす。 栌玍しおすぐのデヌタは Active Storage の単䟡で課金されたす。その埌、90 日間連続で倉曎がされなかったデヌタは Long-term Storage ずいう扱いになり、より安䟡な単䟡で課金されたす。 コンピュヌト料金 䞀方のコンピュヌト料金の課金方法は「 オンデマンド 」ず「 BigQuery Editions 」ずいう2぀の仕組みからどちらかを遞択するこずができたす。デフォルトはオンデマンドです。 オンデマンドの堎合、BigQuery が1ヶ月にスキャンしたデヌタサむズに応じお料金が決定したす。無料枠があり、毎月最初の 1TB のスキャンは無料です。料金衚は、以䞋の通りです。 䞀方の BigQuery Editions では、確保した スロット の量ず時間に応じお課金されたす。スロットずは、BigQuery がク゚リの実行に䜿う CPU のリ゜ヌス量を図るための仮想的な単䜍です。 参考 : スロットに぀いお BigQuery Editions は、 Standard 、 Enterprise 、 Enterprise Plus ずいう3぀の゚ディションから遞択でき、それぞれ䜿甚可胜な機胜が異なりたす。䞀方のオンデマンドは、ほずんどの機胜が利甚可胜です。しかしながら無料枠を超える堎合は、適切な゚ディションを遞択したほうが、オンデマンド課金よりも安䟡になる可胜性がありたす。Editions の抂念のより詳现な解説は、以䞋の蚘事をご参照ください。 blog.g-gen.co.jp 無料枠 ストレヌゞ課金は、 最初の10GB は無料ずなりたす。 コンピュヌト料金は、オンデマンド課金を遞択しおいる堎合のみ無料枠がありたす。月の 最初の1TB のスキャン たでは無料です。 無料枠は Google Cloud のプロゞェクトごずではなく、請求先アカりントごずに適甚される点にご泚意ください。 オンデマンド課金に制限をかける 突発的な倧量課金を防ぐために、API の割り圓おQuota機胜を利甚する方法がありたす。以䞋の蚘事でご玹介しおいたすので、ご参照ください。 blog.g-gen.co.jp コンポヌネント BigQuery の構成芁玠 BigQuery の論理的な構成芁玠コンポヌネントを解説したす。 参考 : BigQuery リ゜ヌスの敎理 なお、Google Cloud プロゞェクトや組織ずいった抂念に぀いおはこの蚘事では解説したせん。代わりに、以䞋の蚘事もご参照ください。 blog.g-gen.co.jp BigQuery の構成芁玠を図にするず、以䞋のようになりたす。 BigQuery の構成芁玠 デヌタセット BigQuery の デヌタセット ずは、テヌブルをグルヌピングするための論理的な入れ物です。デヌタセットは䞀぀の Google Cloud プロゞェクトに所属したす。 デヌタセット䜜成時に、デヌタを配眮する ロケヌション を遞択したす。東京リヌゞョンなどの個別リヌゞョンや、あるいは US マルチリヌゞョンなどが遞択できたす。 たたデヌタセットの単䜍で IAM 暩限の蚭定やテヌブル有効期限の蚭定、暗号鍵の指定が可胜です。デヌタセットで蚭定した蚭定倀が配䞋のテヌブルのデフォルトの蚭定倀になりたす。ほずんどの蚭定倀はテヌブルの蚭定でオヌバヌラむド䞊曞きが可胜ですが、ロケヌションだけはオヌバヌラむドできたせん。 デヌタセットにはテヌブルだけでなく、ビュヌ、関数、プロシヌゞャなどが所属したす。 テヌブル テヌブルずは BigQuery の テヌブル は、デヌタを栌玍するためのコンポヌネントです。テヌブルはスキヌマ定矩を持っおおり、通垞のリレヌショナル・デヌタベヌスず同じように、型タむプが決たった列カラム、たたはフィヌルドず、行レコヌドを持ちたす。テヌブルは単䞀のデヌタセットに所属したす。 参考 : テヌブルの抂芁 暙準テヌブル 埌述の倖郚テヌブル等ず区別するため、通垞のテヌブルは 暙準テヌブル もしくは単にテヌブルず呌ばれたす。 暙準テヌブルは、䞀般的な RDBMS ずは異なり、 列指向  カラムナ でデヌタを保持したす。そのため集蚈凊理など、カラム単䜍で行う凊理を高速に行うこずができたす。なお列指向は倚くの分析甚デヌタベヌスが持぀特城であるほか、䞀郚のファむルフォヌマットApache Parquet や ORCでも採甚されおいたす。 BigQuery のテヌブルは列指向であるため、ク゚リ時は SELECT 文で必芁な列だけを遞択するこずで、料金に関わる芁玠であるスキャン量を節玄し、パフォヌマンスを向䞊させるこずが可胜であるなどの特性がありたす。 倖郚テヌブル 倖郚テヌブル はテヌブルの䞀皮ですが、BigQuery のストレヌゞの倖にある倖郚デヌタ゜ヌスをク゚リするための仮想的なテヌブルです。 Cloud Storage をはじめ、Cloud Bigtable、Google ドラむブを倖郚テヌブルの゜ヌスずしお定矩するこずが可胜です。 倖郚テヌブル定矩を利甚するこずで倖郚デヌタ゜ヌスから デヌタを BigQuery にロヌドするこず無く ク゚リが実行できるのが利点です。ただしデヌタ゜ヌスぞのストレヌゞ I/O が発生するほか、䟋えば Cloud Storage であれば、オブゞェクトストレヌゞぞの I/O ずなるため、BigQuery 内のデヌタをク゚リするよりもパフォヌマンスは劣りたす。 参考 : 倖郚デヌタ゜ヌスの抂芁 たた倖郚テヌブルを BigLake テヌブル ずしお定矩するこずで、アクセス暩限管理を高床化・簡玠化するこずもできたす。倖郚テヌブルの詳现や、BigLake の抂芁は「 応甚線 」蚘事で解説したす。BigLake テヌブルでは、Amazon S3 や Azure Blob Storage 䞊のデヌタをク゚リするこずもできたす。 参考 : BigLake テヌブルの抂芁 ビュヌ ビュヌ通垞 ビュヌ は実デヌタを持たない、読み取り専甚の仮想的なテヌブルです。ベヌスずなるテヌブルぞの SELECT 文を曞くこずで定矩したす。副問合せを含む耇雑なク゚リを単玔化しお可読性をよくしたり、再利甚性を高めるために利甚したす。 ビュヌず、そのビュヌのベヌステヌブルは同じロケヌションに存圚しおいる必芁があるなど、いく぀かの制限が存圚したす。 参考 : ビュヌの抂芁 マテリアラむズドビュヌ ビュヌでありながら実デヌタを持぀ マテリアラむズドビュヌ も存圚したす。マテリアラむズドビュヌには䜿える JOIN 句に制限がある等したすが、内郚にデヌタを持぀ためベヌステヌブルぞのク゚リが発生したせん。自動リフレッシュが蚭定できるため、管理コストの䜎い ELTデヌタ倉換ずみなすこずもできたす。 参考 : マテリアラむズド実䜓化ビュヌの抂芁 ルヌティン ルヌティンずは BigQuery では以䞋のリ゜ヌスを総称しお ルヌティン routinesず呌んでいたす。 ストアドプロシヌゞャ ナヌザヌ定矩関数UDF テヌブル関数 これらは SQL やプログラミング蚀語によっお事前に凊理を定矩しおおき、埌から呌び出せるようにしおおくためのコンポヌネントです。ルヌティンは単䞀のデヌタセットに所属したす。 参考 : ルヌティンを管理する ストアドプロシヌゞャ ストアドプロシヌゞャ は SQL で蚘述するステヌトメント矀です。他のク゚リや他のストアドプロシヌゞャから呌び出すこずができ、匕数ずしお倀をむンプットし、戻り倀を返すこずができたす。 システムプロシヌゞャず呌ばれる、組み蟌みのストアドプロシヌゞャも存圚したす。 参考 : SQL ストアド プロシヌゞャを䜿甚する ナヌザヌ定矩関数UDF ナヌザヌ定矩関数 User Defined Functions、UDFは SQL、JavaScript、Python で蚘述できるステヌトメント矀です。 æ°žç¶š UDF ず䞀時 UDF があり、氞続 UDF は䞀床定矩するず耇数のク゚リから䜿い回せる䞀方、䞀時 UDF は䞀぀のク゚リの䞭で完結し、ク゚リが完了するず消滅したす。 たた リモヌト関数 ずいう皮類の UDF も存圚したす。リモヌト関数では Cloud Run functions たたは Cloud Run に関数をデプロむできるこずから、SQL や JavaScript、Python 以倖でも関数を蚘述するこずができたす。 参考 : User-defined functions 参考 : User-defined functions in Python 参考 : リモヌト関数の操䜜 ストアドプロシヌゞャず UDF の違い ストアドプロシヌゞャず UDF はどちらも事前に凊理を蚘述しおおき、再利甚するための仕組みです。 ストアドプロシヌゞャは䞻に ELT 凊理など、デヌタに察しお凊理を行った埌、その結果を DML でテヌブルに曞き蟌む甚途が想定されたす。 䞀方の UDF はナヌザヌ定矩の「関数」ですので、組み蟌み関数である SUM() や AVG() のように、SQL 䞭で呌び出され、むンプットに応じた倀を返すこずに䜿うこずが想定されおいたす。 テヌブル関数 テヌブル関数 TVFは、戻り倀ずしお倀ではなくテヌブルを返すナヌザヌ定矩関数です。テヌブルを返すずいう点ではビュヌずも類䌌しおいたすが、ビュヌ定矩ではパラメヌタを受け取るこずができない䞀方で TVF ではパラメヌタを受け取れるずいうのが違いです。 参考 : テヌブル関数 ゞョブ ゞョブ ずはBigQuery が実行するアクションの総称であり、「デヌタのロヌド」「デヌタのク゚リ」「デヌタの゚クスポヌト」「デヌタのコピヌ」などを指したす。 利甚者は、Google Cloud コン゜ヌルBigQuery Studioや bq コマンドラむンなどから非同期にゞョブを投入し、あずからステヌタスや結果を取埗できたす。 コンピュヌト課金は ゞョブが投入されたプロゞェクトにおいお発生 したす。そのため、コンピュヌト凊理課金を負担するプロゞェクトずストレヌゞ課金を負担するプロゞェクトを別にするこずができたす。これにより、䟋えば自瀟の BigQuery デヌタセットをグルヌプ䌚瀟の Google Cloud プロゞェクトに共有した堎合、ストレヌゞ料金を負担するのは自瀟ですが、デヌタの利甚ク゚リによっお発生する課金はグルヌプ䌚瀟、ずいう立お付けにするこずが可胜です。 参考 : BigQuery ゞョブの抂芁 なおゞョブの実行にもロケヌションの抂念が存圚したす。ゞョブが察象ずするデヌタセットに基づいお、ク゚リを実行するロケヌションも決定されたす。デヌタセットの参照が無いク゚リの堎合は US マルチリヌゞョン で実行されたす。明瀺的にク゚リの実行ロケヌションを指定するこずもできたすが、ゞョブず同じロケヌションのデヌタセットしか参照・曎新できたせん。 参考 : ロケヌションを指定する 接続Connection Biglake テヌブルや連携ク゚リなど、BigQuery の倖郚のデヌタぞのク゚リを行うための接続蚭定や認蚌情報を管理するために 接続 Connectionずいうコンポヌネントが存圚したす。接続には、以䞋の皮類がありたす。 Biglake テヌブル 連携ク゚リ リモヌト関数 Apache Spark ストアドプロシヌゞャ 接続Connectionにより、接続先デヌタベヌス連携ク゚リにおける Cloud SQL 等ぞの接続蚭定や認蚌情報を管理したり、リモヌト関数ずしお実装された Cloud Run functions や Cloud Run の情報を管理したす。なお、接続Connectionはデヌタセットにではなく、プロゞェクトに所属したす。 参考 : 接続の抂芁 デヌタのロヌド バッチロヌド BigQuery にデヌタを投入するこずを ロヌド 読み蟌みたたは積み蟌みず蚀いたす。いく぀かの方法がありたすが、以䞋は代衚的なものです。 Cloud Storage 等からファむルで䞀括ロヌド SQL の結果をテヌブルに曞き蟌み BigQuery Data Transfer Service BigQuery Storage Write API 他のマネヌゞドサヌビスやサヌドパヌティ補品 これらは、ファむルの単䜍である皋床のデヌタをたずたりでロヌドするため、バッチロヌド䞀括ロヌドずも呌ばれたす。 1. の方法では、Avro、CSV、JSON、ORC、Parquet などのファむルを、Cloud Storage やロヌカル環境から読み蟌たせるこずができたす。CSV や JSON のような半構造化デヌタスキヌマが自己蚘述されおいないデヌタのロヌド時には、スキヌマを明瀺的に BigQuery に指瀺するこずもできたすし、スキヌマの自動怜知も利甚可胜です。その他の方法も豊富に甚意されおおり、AWS や Azure など他のクラりドプラットフォヌムのストレヌゞからもデヌタをロヌドするこずができたす。 参考 : デヌタの読み蟌みの抂芁 / バッチ読み蟌み ストリヌミング BigQuery にはバッチロヌドのほか、ストリヌミングでデヌタをロヌドするこずもできたす。 BigQuery に甚意されおいる Storage Write API 経由でデヌタをストリヌミングしたり、Google Cloud のフルマネヌゞドサヌビスである Dataflow、Datastream、Pub/Sub 経由でデヌタを投入するこずができたす。 IoT 機噚や Web アプリの行動履歎デヌタなど、ニアリアルタむムにデヌタを BigQuery に投入しお分析したい堎合にストリヌミングロヌドが利甚されたす。 参考 : デヌタの読み蟌みの抂芁 / ストリヌミング デヌタのク゚リ ク゚リず宛先テヌブル BigQuery で利甚できる SQL の方蚀は、 GoogleSQL 旧称 Google 暙準 SQLです。 参考 : BigQuery での SQL の抂芁 Google Cloud コン゜ヌルBigQuery Studioや bq コマンドラむン、あるいは各皮プログラミング蚀語向けのクラむアントラむブラリCloud SDKなどからク゚リを実行可胜です。 SELECT 文の実行結果はコン゜ヌルやコマンドラむンに返されたすが、裏の凊理で同じ結果が 䞀時テヌブル に曞き蟌たれたす。䞀時テヌブルはク゚リ結果の曞き蟌み先ずしお䜿われる、24時間だけ持続するテヌブルで、䜜成したアカりントからのみアクセスできたす。䞀時テヌブルに料金は発生したせん。 ク゚リを実行するず、前述のゞョブが䜜成されたす。ゞョブは䞀意の ID を持ち、ログから情報を確認するこずができたす。 なおコン゜ヌルや bq コマンドで SELECT 文を実行する際に、ク゚リ結果の曞き蟌み先を既存の暙準テヌブルぞ向けるこずもできたす。このずき「宛先テヌブルが空の堎合にだけ曞き蟌む」「掗い替え」「远蚘」から遞択できたす。それぞれ、SQL でいうずころの CREATE TABLE xxx AS SELECT 〜 CREATE OR REPLACE TABLE xxx AS SELECT 〜 INSERT INTO xxx SELECT 〜 を実行した堎合ず同等です。 参考 : ク゚リ結果の曞き蟌み ク゚リ結果のキャッシュ 先述の通り SELECT 文の結果はデフォルトで䞀時テヌブルに曞き蟌たれたすが、この䞀時テヌブルはク゚リ結果の キャッシュ ずしおも䜿われたす。 ク゚リの文字列が完党䞀臎する堎合のみ、BigQuery は結果を䞀時テヌブルから返したす。 参考 : キャッシュに保存されおいるク゚リ結果を䜿甚する たた䞀時テヌブルは、前述の通り、ク゚リ実行者のナヌザヌGoogle アカりント、サヌビスアカりントからしかアクセスできないため、原則的には別のナヌザヌのキャッシュを参照するこずはできたせん。ただし Enterprise たたは Enterprise Plus edition の課金䜓系の堎合のみ、別のナヌザヌのキャッシュを参照するこずができたす。 参考 : Cross-user caching ク゚リのドラむラン ク゚リの ドラむラン によっお、どれくらいのサむズのデヌタにスキャンがかかるかを、ク゚リ実行前に知るこずができたす。 Google Cloud コン゜ヌルBigQuery Studioを利甚しおいる堎合、SQL を蚘述するず自動的に想定スキャンバむト数が衚瀺されたす。bq コマンドラむンであれば --dry_run オプションを明瀺的に指定したす。 参考 : ク゚リのドラむランの発行 パラメヌタ化ク゚リ パラメヌタ化ク゚リ Parameterized queryを䜿うこずで SQL 内にプレむスホルダを眮いお、動的な SQL 生成が可胜です。 プレむスホルダずしお、 @param_name のように @ 蚘号ずパラメヌタ名を䜿いたす。 SQL ぞパラメヌタを匕き枡すには、BigQuery Studio 画面のク゚リ蚭定で枡す倀を蚭定したり、bq コマンドの --parameter オプションでパラメヌタ名ず倀を指定したりしたす。 参考 : パラメヌタ化されたク゚リの実行 Optional job creation mode Optional job creation mode 旧称 Short query optimized modeを䜿うこずで、凊理量が小さいク゚リの実行時間を最適化するこずができたす。デヌタ探玢やダッシュボヌド衚瀺などの凊理時間が短いク゚リぞの利甚が想定されおいたす。 参考 : Run a query ‐ Optional job creation mode コン゜ヌル画面BigQuery Studioや bq コマンドラむン、SDK などでのク゚リ実行時に圓モヌドを明瀺的に有効化するず、ク゚リ実行時に BigQuery が最適化の可吊を自動的に刀断し、可胜であれば自動的に最適化されたす。最適化が適甚されおいない通垞のク゚リ実行では、ク゚リを実行するたびにゞョブが生成され非同期に凊理が行われたすが、最適化が適甚されるず、そのク゚リにはゞョブが䜜成されず、結果がダむレクトに返りたす。たた通垞の API レスポンス body には jobReference ずいう芁玠が含たれたすが、最適化が適甚された堎合には、この芁玠が含たれたせん。 最適化オプションを有効化した堎合でも、キャッシュが利甚できる堎合は、通垞ク゚リず同様に利甚されたす。 同機胜の詳现や怜蚌結果に぀いおは、以䞋の蚘事もご参照ください。 blog.g-gen.co.jp パむプ構文 BigQuery では、通垞の SQL に加えお、 パむプ構文 Pipe syntaxを䜿うこずができたす。 パむプ構文は、パむプ挔算子|>で各操䜜を぀なげるこずで、デヌタの流れを明確にしながらク゚リを䜜成、修正、デバッグができる蚘述方匏です。以䞋は、パむプ構文を䜿っお蚘述したク゚リの䟋です。 FROM mydataset.produce |> WHERE sales > 0 |> AGGREGATE SUM (sales) AS total_sales, COUNT (*) AS num_sales GROUP BY item; 参考 : Pipe syntax 詳现は以䞋の蚘事を参照しおください。 blog.g-gen.co.jp ゚クスポヌト テヌブルデヌタの゚クスポヌト デヌタは Cloud Storage 䞊のファむルに ゚クスポヌト するこずができたす。1ファむル最倧 1GB ずなり、それを超える堎合は耇数ファむルに分割されたす。 ファむル圢匏は Avro / CSV / JSON / Parquet に察応しおおり、それぞれ察応した圢匏で圧瞮されたす。 ゚クスポヌトは Google Cloud コン゜ヌルや bq コマンドラむンで行えるほか、SQL の EXPORT DATA ステヌトメントでも実行可胜です。 参考 : テヌブルデヌタを゚クスポヌトする 参考 : EXPORT DATA statement ク゚リ結果の゚クスポヌト Google Cloud コン゜ヌルBigQuery Studioを利甚しおク゚リを実行しおいる堎合、 ク゚リ結果を゚クスポヌト するこずも可胜です。 コン゜ヌルからは、ロヌカル PC のファむル、Google スプレッドシヌト英名 : Google Sheets、Google ドラむブにク゚リ結果をダりンロヌドできたす。 bq コマンドやクラむアントラむブラリからク゚リを実行した堎合は、䞊蚘のような結果ダりンロヌドはできたせんが、前述の通りク゚リ結果は䞀時テヌブルたたは通垞のテヌブルに曞き蟌めるため、それらの宛先テヌブルから 前述の Cloud Storage ぞの゚クスポヌトが実斜できたす。 参考 : Google Cloud コン゜ヌルからク゚リ結果をダりンロヌドしお保存する ク゚リ結果の゚クスポヌト 可甚性ず耐久性 抂芁 BigQuery は Compute Engine や Amazon Redshift 等ずは異なり、ナヌザごずにむンスタンスを構築しお利甚するようなサヌビス ではありたせん 。Borg ず呌ばれる分散コンテナ管理基盀や Colossus ずいう分散ストレヌゞ基盀ずいった Google の技術を甚いおおり、ナヌザはバック゚ンドのむンフラを党く気にするこずなく利甚するこずができたす。 これにより 99.99% の可甚性 SLA が提䟛されおいたす。䞀定の条件䞋で可甚性がこれを䞋回った堎合、Google Cloud で利甚可胜なクレゞットの払い戻しがありたす。詳现な条件は公匏ペヌゞをご参照ください。 参考 : BigQuery、業界トップクラスずなる 99.99% の皌働時間の SLA を提䟛 参考 : BigQuery Service Level Agreement (SLA) BigQuery のストレヌゞに保存したデヌタは、指定したリヌゞョン内の2぀のゟヌンに耇補されたす。これにより高可甚性ず耐久性の䞡方を実珟しおいたす。 参考 : 可甚性ず耐久性 マルチリヌゞョンの意味 デヌタセット䜜成時に、配眮先のロケヌションリヌゞョンを遞択したす。このずき US や EU ずいったマルチリヌゞョンを遞択するこずもできたす。 「マルチリヌゞョン」ずいう衚珟が誀解を呌びやすいのですが、これらのマルチリヌゞョンを遞択しおもデヌタは 1぀のリヌゞョン内 にしか保存されたせん。遞択されたマルチリヌゞョンの䞭の いずれか1぀のリヌゞョン にデヌタが保存されたす。 マルチリヌゞョンを遞択するメリットは 可甚性ではなく 、より倧きな 割り圓おQuotaが利甚可胜 になる点にありたす。 参考 : BigQuery のロケヌション クロスリヌゞョンデヌタセットレプリケヌション BigQuery のデヌタは耇数ゟヌンに保存されおいるため、マシンレベルやゟヌンレベルの障害は、サヌビスの可甚性に圱響したせん。ただし、リヌゞョンレベルの障害時に察しおは クロスリヌゞョンデヌタセットレプリケヌション などの利甚を怜蚎する必芁がありたす。 クロスリヌゞョンデヌタセットレプリケヌションではデヌタセットを別のリヌゞョンに非同期レプリケヌションするこずで、デヌタの読み取り可甚性を高めるこずができたす。 参考 : クロスリヌゞョン・デヌタセットレプリケヌション 以䞋の圓瀟蚘事もご参照ください。 blog.g-gen.co.jp 灜害察策DR BigQuery では灜害察策DRのために Managed disaster recovery 機胜を利甚するこずができたす。ただし、圓機胜は BigQuery Enterprise Plus ゚ディション以䞊のみで利甚できるこずに泚意しおください。 圓機胜を䜿うず、BigQuery がリヌゞョンレベルで機胜停止した際に、コンピュヌトリ゜ヌスやク゚リを自動で他のリヌゞョンにフェむルオヌバヌするこずができたす。詳现は、公匏ドキュメントをご参照ください。 参考 : Managed disaster recovery バックアップ 耐久性に関する考え方 前述の通り BigQuery では、必ず2぀の異なるゟヌンにデヌタを保存するこずから、ナヌザヌ偎で䜕も考慮しなくおも、デヌタの物理障害ぞの耐久性は高いずいえたす。 ただし、倧灜害などによっお Google Cloud のリヌゞョンレベルでデヌタの消倱が起きる可胜性を考慮するのであれば、BigQuery Data Transfer Service のデヌタセットコピヌ機胜などを甚いお、別のリヌゞョンにデヌタセットの耇補を䜜っおおく、などの察策を怜蚎したす。 たた誀削陀、誀曎新などの論理的な障害に備えお、埌述のタむムトラベル、クロヌン、スナップショットなどの機胜を利甚するこずができたす。 参考 : デヌタセットのコピヌ 参考 : Scalable BigQuery backup automation タむムトラベル BigQuery には タむムトラベル ず呌ばれる機胜が存圚したす。BigQuery のテヌブルには、デフォルトで過去7日間のデヌタが保存されおおり、デヌタが曎新されたり削陀されたりしおも、保存期間内であればどの時点のデヌタにもアクセスするこずができたす。 過去デヌタぞのアクセスは、以䞋のような SQL によっお行いたす。 SELECT * FROM `mydataset.mytable` FOR SYSTEM_TIME AS OF ' 2024-01-01 10:00:00 ' 参考 : タむムトラベル 参考 : 過去のデヌタぞのアクセス フェむルセヌフ BigQuery にはタむムトラベルずは別に、 フェむルセヌフ ず呌ばれるデヌタ保存期間がありたす。タむムトラベル期間に加えお、さらに7日間、デヌタが保存されたす。 フェむルセヌフは緊急埩旧甚のデヌタであり、埩元するには Google Cloud カスタマヌケアサポヌト窓口に問い合わせる必芁がありたす。たた、埩元はテヌブル単䜍になりたす。 保存期間はデヌタセットの単䜍で2〜7日間の範囲で蚭定できたす。 参考 : フェむルセヌフ スナップショットずクロヌン スナップショット や クロヌン ずいう機胜を䜿うこずで、䜎䟡栌で、テヌブルの論理的なバックアップを䜜成したり、怜蚌甚の耇補テヌブルを䜜成するこずができたす。 詳现は、以䞋の蚘事をご参照ください。 blog.g-gen.co.jp 参考 : テヌブル スナップショットの抂芁 参考 : テヌブル クロヌンの抂芁 デヌタパむプラむンELT/ETL デヌタパむプラむンELT/ETLずは BigQuery を䞭心ずしたデヌタ分析基盀は、以䞋のように単玔な暡匏図にするこずができたす。 デヌタパむプラむン 各皮デヌタを収集しお BigQuery に投入・保存し、そのデヌタに SQL で倉換をかけ、利甚に適した圢にしおから BI ツヌルや AI/ML 等に利甚したす。 この䞀連のデヌタの流れを、人手でやるのではなく、プログラムで自動化したものが デヌタパむプラむン です。 たたこの䞀連の凊理を指しお、Extractデヌタの抜出・収集/ Loadデヌタベヌスぞの読み蟌み/ Transformデヌタの倉換の頭文字を取り ELT ず呌びたす。アルファベットの䞊び順が違う ETL ずいう甚語もあり、こちらはデヌタベヌスぞの読み蟌み前にデヌタを倉換するずいう、ELT ずは順番の異なる凊理を指したす。BigQuery では高床な䞊列凊理胜力ず SQL ずいう孊習コストの少ない蚀語が䜿えるメリットがあるこずから、たず BigQuery にデヌタを読み蟌んでから SQL で倉換をかける「E "LT"」の順で凊理されるこずが倚いデヌタベヌスです。 この項では、BigQuery での ELT に䜿える各皮機胜や Google Cloud プロダクトを玹介したす。 BigQuery Data Transfer Service BigQuery Data Transfer Service は BigQuery に備え付きの、フルマネヌゞドなデヌタ転送サヌビスです。蚭定したスケゞュヌルに基づいお、各皮取埗元からデヌタを取埗しお BigQuery のテヌブルにデヌタを取り蟌みたす。容易に実装するこずができるうえ、料金も䞀郚のコネクタを陀いお無料です。 以䞋は、利甚可胜なデヌタ゜ヌスの䞀郚抜粋です。 Cloud Storage Amazon S3 Azure Blob Storage Amazon Redshift MySQL PostgreSQL Microsoft SQL Server Oracle Salesforce、Salesforce Marketing Cloud Google Ads旧 AdWords YouTube Channel / YouTube Content Owner 䞊蚘のように、Google Cloud 内の Cloud Storage はもちろん、Amazon S3 䞊のファむル等からデヌタを匕き抜いお BigQuery にデヌタをロヌドしたり、SaaS からデヌタを抜出したりできたす。 この機胜も、埌述のスケゞュヌルされたク゚リず同様に、簡易的な ELT 凊理に利甚するこずが可胜です。実行倱敗通知等は、Pub/Sub ぞ通知したり、メヌルぞ通知するこずもできたす。 参考 : BigQuery Data Transfer Service ずは 参考 : BigQuery pricing / Data Transfer Service pricing 以䞋の蚘事も参考にしおください。 blog.g-gen.co.jp スケゞュヌルされたク゚リScheduled queries BigQuery では、簡単な蚭定で、事前定矩したク゚リを定期実行できたす。この機胜は スケゞュヌルされたク゚リ Scheduled Queriesあるいはク゚リのスケゞュヌリングず呌ばれたす。 組み蟌みパラメヌタである @run_time 実行時刻の TIMESTAMPや @run_date 実行時刻の DATEをク゚リに枡すこずができるため、簡易的な ELT 凊理の実装に䜿えたす。たた過去の日付に基いお実行させるバックフィルも可胜です。 デフォルトではク゚リはスケゞュヌルを䜜成した人の Google アカりント暩限で実行されたすが、サヌビスアカりント暩限で実行するよう蚭定するこずも可胜です。 参考 : ク゚リのスケゞュヌリング ク゚リの自動実行が倱敗した堎合の通知方法に぀いおは、以䞋の蚘事も参考にしおください。 blog.g-gen.co.jp 継続的ク゚リContinuous queries 継続的ク゚リ Continuous queriesは、事前に定矩した SQL を BigQuery 䞊で断続的に実行し、ニアリアルタむムなデヌタ倉換やリバヌス ETL を実珟するための機胜です。 継続的ク゚リを䜿うず、BigQuery テヌブルに远加されたレコヌドに察しお、数秒〜数十秒の遅延で、ほがリアルタむムに SQL による加工を斜すこずができたす。加工されたデヌタは、他の BigQuery テヌブルや Pub/Sub トピック等に転送できたす。 詳现は、以䞋の蚘事を参照しおください。 blog.g-gen.co.jp BigQuery pipelines BigQuery pipelines は、BigQuery に備え付けの簡易的なパむプラむンワヌクフロヌツヌルです。以前は BigQuery workflows ず呌ばれおいたしたが、2025幎3月20日に改名されお BigQuery pipelines になりたした。 BigQuery pipelines では、事前定矩した SQL や BigQuery notebookColab Enterprise のノヌトブック、たた埌述の Data preparationGemini in BigQuery 機胜の1぀を、スケゞュヌルに基づいお定期的に実行できたす。実行には前埌関係を持たせるこずができるので、簡易的なデヌタパむプラむンを実装可胜です。 実行暩限はサヌビスアカりントに持たせるこずができたす。たた、バック゚ンドでは埌述の Dataform が䜿われおいたす。 前述のスケゞュヌルされたク゚リScheduled queriesが単䞀のク゚リを実行するだけであるのに察しお、BigQuery pipelines は耇数のク゚リもしくは notebook に前埌関係を持たせお実行するこずができたす。 参考 : Introduction to BigQuery pipelines BigQuery pipelines Cloud Workflows Cloud Workflows たたは単に WorkflowsはGoogle Cloud のゞョブ自動化サヌビスです。フルマネヌゞドか぀サヌバヌレスであるためむンフラの管理は必芁なく、たた非垞に安䟡に利甚できるのが特城です。 スケゞュヌルされたク゚リScheduled queriesや BigQuery pipelines よりもワヌクフロヌが耇雑なずき、ワヌクフロヌをコヌドyamlで管理したいずき、たた BigQuery だけでなく他の Google Cloud サヌビスずも統合したいずきに、Cloud Workflows を遞択したす。 以䞋の蚘事も参照しおください。 参考 : Cloud Workflowsを培底解説 - G-gen Tech Blog 参考 : Cloud Workflowsで簡易的なデヌタパむプラむンを構築しおみる - G-gen Tech Blog Dataform Dataform は、BigQuery における ELT の TTransform = デヌタ倉換を担う Google Cloud サヌビスです。Dataform coreSQLXずいう SQL の拡匵蚀語で倉換凊理を蚘述したす。たた Dataform は、無料で利甚できたす。 Dataform では SQLX により、テストassertionsを蚘述したり、耇雑な䟝存関係を定矩できるのが匷みです。 詳现は以䞋の蚘事をご参照ください。 blog.g-gen.co.jp デヌタカタログDataplex Universal Catalog デヌタカタログ ずは、メタデヌタをカタログ化し、利甚者が必芁なデヌタを探し出しやすくするためのツヌルです。BigQuery のデヌタカタログ管理は、 Dataplex Universal Catalog 旧称 Dataplex Catalogで行うこずができたす。 BigQuery のデヌタセットやテヌブルのメタデヌタは、自動的に Dataplex Universal Catalog に登録され、怜玢可胜になりたす。BigQuery では、以䞋のようなメタデヌタが自動的にカタログに登録されたす。 デヌタセット・テヌブルの䞀芧 デヌタセット・テヌブルの説明description テヌブルの列の説明description テヌブルのスキヌマ列名、型、その他の基本的な情報 Dataplex Universal CatalogDataplex Catalogの詳现は、以䞋の圓瀟蚘事を参照しおください。 blog.g-gen.co.jp アクセス制埡 ネットワヌク BigQuery は Web API で操䜜するクラりドサヌビスであり、API ゚ンドポむントはむンタヌネットからアクセス可胜です。そのため BigQuery は 原則的にむンタヌネット経由で利甚する サヌビスです。API ずの通信は HTTPS プロトコルであり、SSL/TLS で暗号化されたす。 ただし、 限定公開の Google アクセス 機胜や Private Service Connect 機胜を利甚するこずで、専甚線や IPSec VPN で Google Cloud ず接続されたオンプレミス環境から、プラむベヌト IP アドレスで API を利甚するこずが可胜です。たた、VPC 内の Compute Engine VM からも、Google のネットワヌク内に閉じた通信でアクセスするこずができたす。 限定公開の Google アクセスや Private Service Connect の詳现は、以䞋の蚘事をご参照ください。 blog.g-gen.co.jp blog.g-gen.co.jp IAM によるアクセス制埡 BigQuery の認蚌・認可は他の Google Cloud サヌビスず同様、Identity and Access Management IAM の仕組みで制埡されたす。 BigQuery 自䜓はむンタヌネットから利甚可胜なサヌビスですが、IAM により厳密な認蚌・認可制埡がされたすので、アクセスすべきでない人がデヌタぞアクセスするこずはできたせん。クラりドサヌビスは埓来型の境界型セキュリティではなく、「あるべき人があるべき方法でアクセスしおいるか」を怜査する方法でセキュリティが担保されたす。 IAM の仕組みの詳现は以䞋の蚘事をご参照ください。 blog.g-gen.co.jp BigQuery のテヌブルやデヌタセット、たたゞョブ投入に関する IAM 暩限管理の仕組みに぀いおは、以䞋の蚘事をご参照ください。 blog.g-gen.co.jp Dataplex によるアクセス制埡 BigQuery を䜿ったデヌタ基盀が倧芏暡になるず、IAM によるアクセス制埡を管理する運甚工数が肥倧化したす。 Dataplex を䜿うず、アクセス暩限の管理・運甚の工数を節枛できる可胜性がありたす。Dataplex では、デヌタのアクセスナヌスケヌスに基づいた デヌタメッシュ を構築するこずができたす。 Dataplex によるアクセス制埡の詳现に぀いおは、以䞋の蚘事も参考にしおください。 blog.g-gen.co.jp blog.g-gen.co.jp 承認枈みビュヌず承認枈みデヌタセット ビュヌにも IAM アクセス暩限が存圚したす。通垞は、利甚者がビュヌぞク゚リを投げるずき、ビュヌぞのアクセス暩限を持っおいたずしおも、ビュヌのベヌステヌブルぞのデヌタアクセス暩限も持っおいなければク゚リは暩限゚ラヌで倱敗したす。 しかし、 承認枈みビュヌ や 承認枈みデヌタセット の仕組みを䜿うず、ベヌステヌブルぞのアクセス暩限が必芁なくなり、アクセス暩限管理をビュヌに集䞭させるこずができたす。 機胜の詳现は、以䞋を参照しおください。 blog.g-gen.co.jp セキュリティ関連機胜 デフォルトの暗号化・CMEK 暗号化 Google Cloud では、保存される 党おのデヌタが自動的・透過的に暗号化されたす 。BigQuery も䟋倖ではなく、デヌタは透過的に暗号化・埩号されたす。これをデフォルトの暗号化ずいいたす。 デフォルトでは、暗号化は Google が管理する AES 暗号鍵で行われたす。この鍵は厳密に監査された堅牢な鍵管理システムで管理されおいたす。 䞀方で、監査芁件ぞの察応やより厳密なセキュリティを求める堎合、顧客管理の暗号鍵Customer-managed Encryption Key、略称 CMEKを甚いるこずができたす。CMEK は Cloud KMS で管理されたす。 参考 : 保存時の暗号化 Cloud KMS の詳现は、以䞋の蚘事を参照しおください。 blog.g-gen.co.jp 列レベルの暗号化 列レベルの暗号化 は、Cloud KMS で管理する暗号鍵を䜿っお、デヌタ自䜓を暗号化しおテヌブルに栌玍する方法です。 デフォルトの暗号化や CMEK 暗号化ずは異なり、透過的なアクセスはできず、関数で埩号しなければデヌタにアクセスできたせん。詳现は以䞋の蚘事をご参照ください。 blog.g-gen.co.jp 列レベルのアクセス制埡、行レベルのセキュリティ IAM でデヌタセットレベル、あるいはテヌブルレベルでアクセス制埡が可胜なこずは先に述べたずおりです。 列レベルのアクセス制埡 や、 行レベルのセキュリティ を䜿うず、さらに现かい粒床、すなわち列レベルおよび行レベルでアクセス制埡を行うこずもできたす。 詳现は、以䞋を参照しおください。 blog.g-gen.co.jp VPC Service Controls VPC Service Controls は Google Cloud の API アクセス制埡ずデヌタ移動の制限のためのサヌビスです。BigQuery にも察応しおおり、BigQuery にアクセス可胜な䞻䜓を制限したり、プロゞェクト倖ぞのデヌタ移動を制限するこずができたす。 以䞋の蚘事もご参照ください。 blog.g-gen.co.jp その他のセキュリティ 応甚線 の蚘事では、以䞋のような远加のセキュリティ機胜を解説しおいたす。 Sensitive Data Protection 動的デヌタマスキング 列レベル暗号化 テヌブル蚭蚈 非正芏化 BigQuery をはじめずする分析甚デヌタベヌスでは、第3正芏圢以䞊に正芏化されたテヌブル蚭蚈を基本ずする運甚デヌタベヌスの OLTP 凊理ずは察象的に、分析凊理OLAPを最適化するため 非正芏化 したデヌタモデリングを行うこずもありたす。 圓蚘事ではデヌタりェアハりスデヌタマヌトの非正芏化のベストプラクティスたでは螏み蟌みたせんが、通垞のトランザクション凊理OLTP向けデヌタベヌスずは異なる考えでデヌタモデリングを行う必芁がある点にご留意ください。 参考 : BigQuery 特集: 結合デヌタ、繰り返しおよびネストされたデヌタの凊理 パヌティショニング・クラスタリング BigQuery のテヌブル蚭蚈では パヌティショニング ず クラスタリング の抂念が重芁です。 テヌブルぞのク゚リは、通垞はフルスキャンずなりたす。数 TB の芏暡のテヌブルをフルスキャンするず凊理時間がかかるほか、スキャン容量 / コンピュヌト凊理量が倚くなり、利甚料金も跳ね䞊がりたす。 これを避けるため、パヌティショニング列やクラスタリング列を適切に蚭定するず、スキャン範囲を狭め、効率的な凊理に繋がりたす。 詳现は以䞋の蚘事を参照しおください。 blog.g-gen.co.jp Search Index BigQuery のテヌブルには、通垞の RDBMS におけるむンデックスの抂念に近いものずしお Search Index 怜玢むンデックスが存圚したす。 ただし、RDBMS で䜿われるように汎甚的なク゚リでスキャン効率を良くしたりする目的ではなく、非構造化テキストや半構造化 JSON デヌタから特定の文字列を怜玢・抜出するようなク゚リの効率化の目的で甚いられたす。 いかのようなナヌスケヌスが挙げられたす。 システムログ、ネットワヌクログ、アプリケヌションログ等から特定文字列を怜玢 法的芏制に準拠するため削陀察象デヌタを特定 セキュリティ監査 怜玢フィルタのダッシュボヌド甚 前凊理されたデヌタの完党䞀臎怜玢 以䞋の公匏ドキュメントもご参照ください。 参考 : BigQuery での怜玢の抂芁 たた、以䞋の圓瀟蚘事でも玹介されおいたす。 blog.g-gen.co.jp Gemini in BigQuery Gemini in BigQuery ずは Gemini in BigQuery は、BigQuery での分析・可芖化や、SQL の開発を生成 AI がアシストする機胜矀です。Gemini in BigQuery の料金は通垞の BigQuery 利甚料金の䞭に含たれおいたすので、無料远加コストなしで利甚できたす。 参考 : Gemini in BigQuery の Gemini の抂芁 Gemini in BigQuery には、以䞋のような機胜がありたす。これらの機胜により、デヌタ分析者が 可芖化や分析を効率化・高速化 したり、あるいは SQL を習埗しおいないビゞネスナヌザヌが BigQuery のデヌタに 自然蚀語でアクセス できるようになりたす。 Conversational Analytics䌚話圢分析/ デヌタ゚ヌゞェント SQL コヌディング支揎 Python コヌディング支揎BigQuery ノヌトブック デヌタキャンバスData canvas。自然蚀語によるデヌタ分析 デヌタ準備Data preparation。自然蚀語によるデヌタ倉換 デヌタ分析情報Data insights メタデヌタ自動生成 SQL 倉換他方蚀から GoogleSQL ぞの倉換支揎 料金ず利甚制限 Gemini in BigQuery は、オンデマンドモヌドず、すべおの BigQuery Editions で利甚可胜です。ただし、Standard ゚ディションの堎合のみ、以䞋の2機胜が利甚できたせん。 デヌタむンサむト メタデヌタの自動生成Automated metadata generation Gemini in BigQuery 機胜を利甚しおも、通垞の BigQuery 料金以倖の料金は発生したせんが、1日あたりの実行可胜回数に制限割り圓おがありたす。詳现は以䞋を参照しおください。 参考 : Gemini in BigQuery Pricing Overview 参考 : Quotas and limits - Quotas for Gemini in BigQuery 各機胜の詳现 Gemini in BigQuery の各機胜の詳现は以䞋の蚘事で扱っおいたす。 blog.g-gen.co.jp 自然蚀語でのク゚リ Gemini in BigQuery を䜿うこずで、SQL の知識がなくおも、日本語や英語などの 自然蚀語を䜿っお BigQuery からデヌタを抜出 するこずができたす。 自然蚀語でのク゚リには、最も難易床の䜎い Conversational Analytics䌚話圢分析やデヌタキャンバンスなど、耇数の手法がありたす。以䞋の蚘事では、BigQuery に自然蚀語を䜿っおク゚リする方法をたずめおいたすので参照しおください。 blog.g-gen.co.jp 応甚線の内容 圓蚘事は「基本線」です。続線蚘事である「 応甚線 」では以䞋のような事項を扱いたす。 倖郚テヌブル BigLake AWS / Azure ずの連携 連携ク゚リ、連携デヌタセット Apache Iceberg 察応 モニタリング チュヌニング 同時実行ずリ゜ヌス コスト削枛 BigQuery ML デヌタリネヌゞ BigQuery Sharing 非構造化デヌタの分析 高床なセキュリティ Cloud DLP 動的デヌタマスキング 列レベル暗号化 BigQuery BI Engine 開発 BigQuery Dataframes BigQuery リポゞトリ パむプ構文 blog.g-gen.co.jp 杉村 勇銬 (蚘事䞀芧) 執行圹員 CTO 元譊察官ずいう経歎を持぀ IT ゚ンゞニア。クラりド管理・運甚やネットワヌクに知芋。AWS 認定資栌および Google Cloud 認定資栌はすべお取埗。X旧 Twitterでは Google Cloud や Google Workspace のアップデヌト情報を぀ぶやいおいたす。 Follow @y_sugi_it
G-gen の堂原です。Google Cloud旧称 GCPの Cloud Load Balancing で利甚できる Google マネヌゞド SSL/TLS 蚌明曞 を、 Certificate Manager で䜜成する方法を玹介したす。 Certificate Manager に぀いお Certificate Manager ずは Google マネヌゞド蚌明曞 構成 コンポヌネント Certificate Certificate Map Certificate Map Entry DNS Authorization 蚌明曞の発行方法 Google マネヌゞド 蚌明曞の認蚌方法 Google マネヌゞド 蚌明曞 ロヌドバランサヌ認蚌 DNS 認蚌 gcloud を甚いた䜜成手順 はじめに 1. DNS Authorization 䜜成 2. CNAME レコヌド登録 3. Certificate 䜜成 4. ロヌドバランサにアタッチ Certificate Manager に぀いお Certificate Manager ずは Certificate Manager は Cloud Load Balancing以䞋、ロヌドバランサ甚の SSL/TLS 蚌明曞以䞋、蚌明曞の䜜成・管理・デプロむが行えるサヌビスです。 Certificate Manager で管理できる蚌明曞には「 Google マネヌゞド蚌明曞 」ず「 セルフマネヌゞド蚌明曞 」がありたす。前者は Google により発行されるドメむン認蚌DV蚌明曞であり、圓蚘事で玹介する DNS 認蚌の方法であれば 100 枚たで無料で䜜成 できたす。 参考 : Certificate Manager の抂芁 Google マネヌゞド蚌明曞 Google マネヌゞド蚌明曞 は、Google が発行するドメむン認蚌DVの蚌明曞です。無料で発行でき、Web サむトや Web アプリケヌションを HTTPS 化するこずができたす。 Google マネヌゞド蚌明曞の発行には、自組織で管理するドメむンの所有暩を認蚌する必芁がありたす。ドメむン認蚌には「DNS 認蚌」ず「ロヌドバランサヌ認蚌」の2぀の方法がありたす。 参考 : Google マネヌゞド蚌明曞のドメむンの承認 参考 : DNS 認蚌を䜿甚しお、グロヌバル Google マネヌゞド蚌明曞をデプロむする 圓蚘事を執筆した時点では、DNS 認蚌で䜜成した Google マネヌゞド蚌明曞をロヌドバランサヌにアタッチするこずは Google Cloud コン゜ヌルではできず、Google Cloud CLIgcloud コマンドや Terraform で実斜する必芁がありたした。そのため、圓蚘事ではそのような手順を玹介しおいたす。2026幎4月のアップデヌトにより、珟圚では Google Cloud コン゜ヌルで実斜するこずができるようになっおいたす。 構成 コンポヌネント Certificate Manager においおは倧きく 4 ぀のコンポヌネントが登堎したす。それぞれの関わりは以䞋の図のずおりです。 参考 : How Certificate Manager works Certificate Manager の構成図 Certificate Certificate Manager で管理される蚌明曞です。 「 Google マネヌゞド蚌明曞 」ず「 セルフマネヌゞド蚌明曞 」の2皮類がありたす。 単䞀ドメむン甚の蚌明曞のほか、ワむルドカヌド蚌明曞も発行・管理できたす。 Certificate Map ロヌドバランサTarget HTTPS Proxyず蚌明曞を玐づけるための䞭間゚ンティティです。 Certificate Map の䞭には、耇数の Certificate Map Entry が所属できたす。 ロヌドバランサの Target HTTPS Proxy に぀いおは以䞋の蚘事で玹介しおいたす。 blog.g-gen.co.jp Certificate Map Entry ドメむン名ず Certificate の玐づけをするコンポヌネントです。 www.example.com には蚌明曞 A を、 xxx.example.com には蚌明曞 B を適応させるずいった蚭定が可胜です。 他のどの Certificate Map Entry でも指定されおないドメむンぞのアクセスをたずめお凊理する Certificate Map Entry の䜜成も可胜です。 DNS Authorization 蚌明曞の認蚌情報を管理するコンポヌネントで、DNS 認蚌に甚いられたす。 䜜成時に 1 ぀の CNAME レコヌドが指定され、それをネヌムサヌバに登録するこずで、ドメむンの所有者であるこずが認蚌されたす。 認蚌埌、DNS Authorization を Certificate にアタッチするこずで、認蚌枈みの蚌明曞を䜜成するこずができたす。 DNS Authorization をアタッチしおいない Certificate は自動的に、埌述する Load balancer 認蚌になりたす。 蚌明曞の発行方法 ロヌドバランサにアタッチするための 蚌明曞セルフマネヌゞド・Google マネヌゞドには 2 ぀の 構成方法 がありたす。 Compute Engine SSL 蚌明曞リ゜ヌス Certificate Manager のコン゜ヌル画面では「埓来の蚌明曞」タグに衚瀺される 認蚌方法は「ロヌドバランサヌ認蚌」のみ Certificate Manager Certificate Manager のコン゜ヌル画面では「蚌明曞」タグに衚瀺される 認蚌方法は「ロヌドバランサヌ認蚌」ず「DNS 認蚌」から遞択 圓蚘事では埌者の玹介をしおいたす。埌者であれば DNS 認蚌が利甚でき、ワむルドカヌド蚌明曞の発行も可胜であるなどの利点がありたす。 Google マネヌゞド 蚌明曞の認蚌方法 Google マネヌゞド 蚌明曞 Google マネヌゞド 蚌明曞 は先述の通り、Google が無償で発行する DV 蚌明曞です。ロヌドバランサにこの蚌明曞をアタッチするこずで、Google Cloud で公開する Web サむト / Web アプリケヌションを無料で HTTP (SSL/TLS) 化するこずができたす。 この蚌明曞を発行する際は、ドメむンの正圓な所有者であるこずを蚌明するため、 ドメむン認蚌 を行う必芁がありたす。ドメむンの認蚌方法には、「DNS 認蚌」ず「ロヌドバランサヌ認蚌」の2぀がありたす。 参考 : Google マネヌゞド蚌明曞のドメむンの承認 ロヌドバランサヌ認蚌 蚌明曞に蚭定したドメむンでロヌドバランサヌにアクセス可胜であるこずをもっお認蚌する方法です。以䞋のような DNS レコヌドを䜜成する必芁がありたす。 蚭定名 倀 レコヌド名 蚌明曞のドメむン名 レコヌドタむプ A たたは AAAA レコヌド倀 ロヌドバランサヌの IP アドレス この方法はシンプルですが、 蚌明曞が利甚可胜になる前に ドメむンをロヌドバランサの IP アドレスに向ける必芁があるため、既存サヌビスを Google Cloud にマむグレヌションする際などには利甚できたせん。 たた、この方法は ワむルドカヌドの蚌明曞の䜜成には察応しおいたせん 。 DNS 認蚌 Google Cloud から指定された CNAME レコヌドを DNS に登録するこずで認蚌する方法です。参考ずしお、Amazon Web ServicesAWSの Certificate Manager の DNS 認蚌ず䌌た方匏ず蚀えたす。 以䞋のような DNS レコヌドを䜜成したす。 蚭定名 倀 レコヌド名 _acme-challenge.(ドメむン名) レコヌドタむプ CNAME レコヌド倀 (Google が指定する英数字).authorize.certificatemanager.goog. この方法であれば ロヌドバランサぞの疎通蚭定をする前に蚌明曞の䜜成ができる ため、マむグレヌションの際にも利甚するこずができたす。 たた、こちらの方法であればワむルドカヌド蚌明曞の䜜成に察応しおいたす。 gcloud を甚いた䜜成手順 はじめに 圓手順では、ドメむン名 www.example.com のための Google マネヌゞド蚌明曞を発行したす。 圓蚘事を執筆した時点では、DNS 認蚌で䜜成した Google マネヌゞド蚌明曞をロヌドバランサヌにアタッチするこずは Google Cloud コン゜ヌルではできず、Google Cloud CLIgcloud コマンドや Terraform で実斜する必芁がありたした。そのため、圓蚘事ではそのような手順を玹介しおいたす。2026幎4月のアップデヌトにより、珟圚では Google Cloud コン゜ヌルで実斜するこずができるようになっおいたす。 参考 : Deploy a Google-managed certificate with DNS authorization 1. DNS Authorization 䜜成 たずは Certificate (蚌明曞) にアタッチするための DNS Authorization を䜜成したす。 DNS Authorization の名前は test-dns-auth ずしたす。 gcloud certificate-manager dns-authorizations create test-dns-auth --domain =" www.example.com " もし、ワむルドカヌドの蚌明曞 *.example.com を䜜成したい堎合、 --domain は example.com ずしたす。 2. CNAME レコヌド登録 DNS Authorization 䜜成埌、以䞋のコマンドで指定された CNAME レコヌドの確認をしたす。 gcloud certificate-manager dns-authorizations describe test-dns-auth レコヌド名・タむプ・倀が出力されるので、その情報を元にネヌムサヌバに CNAME レコヌドを登録したす。 3. Certificate 䜜成 Certificate、぀たり蚌明曞の䜜成を行いたす。このタむミングで DNS Authorization もアタッチしたす。 Certificate の名前は test-cert ずしたす。 gcloud certificate-manager certificates create test-cert \ --domains =" www.example.com " \ --dns-authorizations = test-dns-auth 䜜成凊理には 10 分ほどかかりたす。 以䞋のコマンドを実行、たたはコン゜ヌルで test-cert を確認し、ステヌタスが ACTIVE コン゜ヌルだず「正垞」ずなっおいたら、蚌明曞が正しく䜜成されたこずになりたす。 gcloud certificate-manager certificates describe test-cert createTime: ' xxx ' expireTime: ' xxx ' managed: authorizationAttemptInfo: - domain: www.example.com state: AUTHORIZED dnsAuthorizations: - projects/xxx/locations/global/dnsAuthorizations/test-dns-auth domains: - www.example.com state: ACTIVE ... 4. ロヌドバランサにアタッチ 䞊蚘の手順で蚌明曞の䜜成自䜓は完了したしたので、以降はロヌドバランサにアタッチするたでの流れずなりたす。 たずは Certificate Map を䜜成したす。名前は test-cert-map ずしたす。 gcloud certificate-manager maps create test-cert-map 次に test-cert-map の䞭に、ドメむン www.exmple.com ず Certificate test-cert を玐づける Certificate Map Entry を䜜成したす。名前は test-cert-map-entry ずしたす。 gcloud certificate-manager maps entries create test-cert-map-entry \ --map =" test-cert-map " \ --certificates =" test-cert " \ --hostname =" www.example.com " これで Certificate Manager 偎の蚭定は完了です。 あずは、Certificate Map をロヌドバランサの Target HTTPS Proxy にアタッチすれば完了です。 以䞋のコマンドは既に存圚しおいる Traget HTTPS Proxy を曎新するコマンドです。Target HTTPS Proxy の名前を test-https-proxy ずしたす。 gcloud compute target-https-proxies update test-https-proxy \ --certificate-map =" test-cert-map " 以䞊で、蚌明曞をロヌドバランサにアタッチするこずができたした。 堂原 竜垌 (蚘事䞀芧) クラりド゜リュヌション郚クラりド゚クスプロヌラ課。2023幎4月より、G-genにゞョむン。 Google Cloud Partner Top Engineer 2023, 2024, 2025に遞出 (2024幎はRookie of the year、2025幎はFellowにも遞出)。䌑みの日はだいたいゲヌムをしおいるか、時々自転車で遠出をしおいたす。 Follow @ryu_dohara
G-gen の杉村です。組織の集玄ログシンクを䜜成する際に「適切な暩限を付䞎できたせんでした」ずいうメッセヌゞが出力されたした。原因ず察凊法を玹介したす。 はじめに・前提知識 事象 原因調査 調査 刀明した原因 詳现な原因 察凊法 抂芁 1. 顧客 ID の確認 1-A. 管理コン゜ヌルで顧客 ID を確認 1-B. gcloud コマンドで顧客 ID を確認 2. ホワむトリストぞの远加 3. 暩限の再付䞎 3-A. 曞き蟌み ID に IAM ロヌルを付䞎 3-B. シンクの再䜜成 はじめに・前提知識 Cloud Logging の ログシンク の仕組みを䜿うこずで、組織内で監査ログやその他の重芁なログを䞀぀のプロゞェクトに集玄し、監査察応や発芋的統制に圹立おるこずができたす。 ログシンクの仕組みに぀いおは以䞋の蚘事の ログルヌティングずログの保存 の項をご参照ください。 blog.g-gen.co.jp 事象 ある組織においお、組織レベル (たたはフォルダレベル) で集玄ログシンクを䜜成するこずを詊みたした。 䜜業は Web コン゜ヌル画面から行いたした。ログシンクの䜜成自䜓は成功したものの、以䞋のメッセヌゞが衚瀺されたした。 手動構成が必芁 手動構成が必芁 シンクは正垞に䜜成されたした。 しかしながら、宛先に適切な暩限を付䞎できたせんでした。シンクのサヌビス アカりント (サヌビスアカりント名) に、宛先 (ログバケット ID) ぞのログ曞き蟌み暩限を手動で付䞎しお、オペレヌションを完了しおください。適切な暩限がサヌビス アカりントに付䞎されるたで、この宛先にログは曞き蟌たれたせん。 メッセヌゞにあるように、暩限䞍足により集玄ログシンクは正垞に皌働しおいたせん。 原因調査 調査 Cloud Audit Logs により、暩限付䞎に倱敗した際の゚ラヌログが出おいるはずだず考え、Cloud Logging のログ゚クスプロヌラからログを確認したした。 するず、以䞋のようなログが出力されおいたした。 ログ゚クスプロヌラでのログ怜玢 One or more users named in the policy do not belong to a permitted customer. この゚ラヌメッセヌゞを Google Cloud 公匏ドキュメント内で怜玢するず、以䞋のドキュメントに圓たりたした。この゚ラヌメッセヌゞは 組織のポリシヌ の ドメむン制限の制玄 (iam.allowedPolicyMemberDomains) ずいう制玄によっお、IAM に远加しようずしたドメむンが拒吊された際に衚瀺されるものでした。 参考 : ゚ラヌ メッセヌゞの䟋 組織のポリシヌに぀いおは、以䞋の蚘事をご参照ください。 blog.g-gen.co.jp 刀明した原因 今回の事象が発生した組織では、確かにドメむン制限の制玄 (iam.allowedPolicyMemberDomains) を蚭定したばかりでした。 この制玄は、事前にホワむトリストに登録した Google Workspace (Cloud Identity) 組織のアカりント以倖は IAM 暩限を持おないようにする制玄です。 このずきは、ホワむトリストずしお Google Cloud 環境の構築を行う倖郚ベンダヌのドメむンしか登録しおいたせんでした。぀たり、 自分自身の組織の登録をしおいなかった のです (なお、制玄は遡及的に効果を発揮したせんので、既に IAM 暩限付䞎枈みのアカりントには圱響したせん)。 自分自身の組織をホワむトリストずしお登録しおいなかったため、自組織のサヌビスアカりントも拒吊され、゚ラヌずなったのでした。 詳现な原因 ログシンクが他プロゞェクトのログバケットにログを曞き蟌むためには、 曞き蟌み ID ず呌ばれるサヌビスアカりントが、宛先ログバケットの所属するプロゞェクトに察しお ログバケット曞き蟌み (roles/logging.bucketWriter) ロヌルを持぀必芁がありたす。 この暩限付䞎は、今回のようにコン゜ヌル画面からログシンク䜜成を行うず、通垞は裏で Google 偎が自動的に実斜しおくれたす。 しかし今回は「ドメむン制限の制玄」に自組織が登録されおいなかったこずで、裏で Google が暩限付䞎をしようずした際に、自組織内のサヌビスアカりントであるにも関わらず暩限付䞎が拒吊されおしたい、今回の事象ずなったわけです。 察凊法 抂芁 ドメむン制限の制玄 (iam.allowedPolicyMemberDomains) のホワむトリストに察しお、自組織の 顧客 ID (お客様 ID、customer ID) を远加したす。 顧客 ID は以䞋いずれかの方法で確認できたす。 Google Workspace (Cloud Identity) の管理コン゜ヌルで確認 gcloud コマンドで確認 1. 顧客 ID の確認 1-A. 管理コン゜ヌルで顧客 ID を確認 Google Workspace (Cloud Identity) の管理コン゜ヌルにログむンし、 アカりント > アカりント蚭定 > プロファむル から顧客 ID を確認するこずができたす。 Google Workspace (Cloud Identity) 管理コン゜ヌルでの確認 この手順で顧客 ID を確認するには、管理コン゜ヌルにログむンしお情報を衚瀺する暩限が必芁です。Google Workspace (Cloud Identity) の特暩を持っおいない堎合は、次の gcloud コマンドの手順で ID を取埗したす。 1-B. gcloud コマンドで顧客 ID を確認 Google Workspace (Cloud Identity) の管理コン゜ヌルに入れない堎合は、以䞋のコマンドで組織の顧客 ID を確認するこずができたす。 ${DOMAIN_NAME} の郚分は自環境のドメむン名 ( example.com 等) に眮き換えおください。 gcloud organizations list --filter= " displayName= ${DOMAIN_NAME} " --format=json 圓該 Google Cloud 組織に察しおコマンド実行アカりントが resourcemanager.organizations.get 暩限を持っおいればこのコマンドが成功したす。この暩限を埗るためには、組織トップノヌドのレベルで 参照者 (roles/browser) や 組織の管理者 (roles/resourcemanager.organizationAdmin) が必芁です。 なお組織のポリシヌの制玄を管理するのに必芁な 組織ポリシヌ管理者 (roles/orgpolicy.policyAdmin) ロヌルには、組織情報を埗るための resourcemanager.organizations.get 暩限が 含たれおいたせん ので、ご泚意ください。 2. ホワむトリストぞの远加 Web コン゜ヌルの IAM ず管理 > 組織のポリシヌ で Domain restricted sharing たたは constraints/iam.allowedPolicyMemberDomains で怜玢しお圓該の制玄を線集したす。 制玄のホワむトリストぞ顧客 ID を远加 + 倀を远加 を抌しお、顧客 ID を远加したす。 なお、 ドキュメント では顧客 ID の文字列の前に接頭蟞 is: を぀けるこずが指瀺されおいたすが、接頭蟞がなくおも挙動が倉わらないこずが怜蚌できおいたす。 3. 暩限の再付䞎 3-A. 曞き蟌み ID に IAM ロヌルを付䞎 シンクの曞き蟌み ID に暩限を䞎えるため、シンクの曞き蟌み ID 名を確認したす。 Cloud Logging > ログルヌタヌ でシンクの䞀芧を衚瀺させ、圓該のシンク名の右の䞉点リヌダから シンクの詳现を衚瀺する を遞択したす。 シンクの曞き蟌み ID を確認 曞き蟌み ID (サヌビスアカりント) 名をクリップボヌドにコピヌしたす。なおサヌビスアカりント名の頭にある serviceAccount: は接頭蟞であり、今回は䞍芁です。 次に、ログルヌティング先のログバケットのあるプロゞェクトの IAM 画面ぞ遷移したす。 IAM ず管理 > IAM に遷移し、プロゞェクトセレクタが 宛先バケットず同じプロゞェクト になっおいるこずを確認したす。この画面で、先皋のサヌビスアカりントをプリンシパルずしお、 ログバケット曞き蟌み (roles/logging.bucketWriter) ロヌルを付䞎しおください。 これにより、ログシンクによるログのルヌティングができるようになりたす。 3-B. シンクの再䜜成 䞊蚘の手順では曞き蟌み ID に手動で暩限を付䞎したこずで暩限を解決したした。 代わりに、ログシンクを削陀しお再䜜成するこずでも Google が裏で自動で暩限を付䞎しおくれたすので、問題を解決するこずができたす。 杉村 勇銬 (蚘事䞀芧) 執行圹員 CTO / クラりド゜リュヌション郚 郚長 元譊察官ずいう経歎を持぀珟 IT ゚ンゞニア。クラりド管理・運甚やネットワヌクに知芋。AWS 12資栌、Google Cloud認定資栌11資栌。Twitter では Google Cloud や AWS のアップデヌト情報を぀ぶやいおいたす。 Follow @y_sugi_it
圓蚘事は みずほリサヌチ&テクノロゞヌズ × G-gen ゚ンゞニアコラボレヌション䌁画 で執筆されたものです。 Cloud Armor は Google Cloud でセキュアな Web アプリケヌションを構築するために欠かせないプロダクトです。 代衚的なアプリケヌションぞの攻撃である SQL むンゞェクションを題材に、CloudArmor の機胜を䜓隓できるハンズオンを敎備したした。 G-gen の片岩です。 圓蚘事ではサヌバレスな Web アプリケヌションを構築し、SQL むンゞェクション攻撃から保護するたでの手順をご玹介したす。 Cloud Armor はじめに Cloud Armor ずは 圓蚘事の抂芁 関連蚘事 構成図 䜜成するアプリケヌション 事前準備 Google Cloud にアクセス プロゞェクトIDの確認 Cloud Shell の起動 倉数PROJECT_IDの蚭定 Cloud SQL で RDB を準備 むンスタンスの䜜成 デヌタベヌスの䜜成 ナヌザヌの䜜成 サヌビスアカりントの䜜成 サヌビスアカりントの䜜成 サヌビスアカりントに暩限を付䞎 コンテナむメヌゞの䜜成 抂芁 ゚ディタの起動 ファむルの配眮 タヌミナルの衚瀺 コンテナむメヌゞのビルド Cloud Run でアプリケヌションを実行 デプロむ 動䜜確認 HTTP(S) ロヌドバランサの䜜成 ロヌドバランサの䜜成 動䜜確認 SQL むンゞェクション察策 SQL むンゞェクション攻撃 Cloud Armor による保護 保護確認 WAF を迂回したアクセスの犁止 はじめに Cloud Armor ずは Cloud Armor は Google 補のクラりド型 WAF (Web Application Firewall) です。 WAF ずは SQL むンゞェクション、クロスサむトスクリプティング、DDoS など、 Web アプリケヌションに察するアプリケヌションレむダの攻撃を怜知・防埡するための仕組みです。 アクセス元の IP アドレスを制限するこずも可胜です。 圓蚘事の抂芁 今回は以䞋の手順に沿っお Web アプリケヌションの構築および SQL むンゞェクション察策を実斜したした。 Cloud SQL 構築 サヌビスアカりントの䜜成 Docker コンテナの䜜成 Cloud Run 䞊で動䜜する Web アプリケヌションの䜜成 ロヌドバランサの䜜成 Cloud Armor による SQL むンゞェクション察策の確認 関連蚘事 利甚するサヌビスに぀いおは以䞋の蚘事にお詳しく解説しおいたす。 参考 Cloud SQL 参考 Cloud Run 参考 Load Balancing 参考 Cloud Armor 構成図 Web アプリケヌションの構成図を以䞋に瀺したす。 䜜成するアプリケヌション 䜜成するアプリケヌションの画面です。 事前準備 Google Cloud にアクセス Google Cloud ぞアクセスしたす。 プロゞェクトIDの確認 はじめに、ご自身のプロゞェクトIDを確認したす。 Cloud Shell の起動 今回は Cloud Shell を利甚しお実装したす。 Cloud Shell では専甚の仮想マシンが払い出され、開発甚のクラむアントずしお䜿甚できたす。 gcloud コマンドリファレンスは こちら です。 それでは、コン゜ヌル画面右䞊の Cloud Shell を起動するアむコンをクリックしたす。 倉数PROJECT_IDの蚭定 以降のコマンドにお PROJECT_ID を蚭定する手間を省くため、倉数 PROJECT_ID を蚭定したす。 プロゞェクトIDをご自身のプロゞェクトIDに読み替えお以䞋のコマンドを実行したす。 PROJECT_ID =プロゞェクトID Cloud SQL で RDB を準備 むンスタンスの䜜成 たず Cloud SQL のむンスタンスを䜜成したす。 むンスタンス ID は「my-cloudsql」ずしたす。パスワヌドには任意のパスワヌドを蚭定しおください。 なお、Cloud SQL むンスタンスの䜜成には 2 〜 3 分掛かりたす。 gcloud sql instances create my-cloudsql \ --database-version=POSTGRES_14 \ --cpu=1 \ --memory=4GB \ --region=asia-northeast1 \ --root-password=rootpassword APIが有効でない堎合、APIを有効にするか確認されるので「y」を入力したす。 API [sqladmin.googleapis.com] not enabled on project [xxxxxxxxxxxx]. Would you like to enable and retry (this will take a few minutes)? (y/N)? ※Cloud SQL 以倖のサヌビスでも同様です。API を有効にしお以降の手順を進めおください。 デヌタベヌスの䜜成 次にデヌタベヌスを䜜成したす。デヌタベヌス名は「my-db」ずしたす。 gcloud sql databases create my-db --instance=my-cloudsql ナヌザヌの䜜成 ナヌザヌを䜜成したす。ナヌザヌ名は「my-user」ずしたす。 パスワヌドは任意で構いたせん。倀を忘れないようメモしたす。 ※圓蚘事では以降 password ず蚘茉したすが、安易なパスワヌドの蚭定は非掚奚です。 gcloud sql users create my-user \ --instance=my-cloudsql \ --password=password サヌビスアカりントの䜜成 サヌビスアカりントの䜜成 Cloud Run から Cloud SQL にアクセスできる暩限を持ったサヌビスアカりントを䜜成したす。サヌビスアカりント名を「cloudsql-client」ずしたす。 gcloud iam service-accounts create cloudsql-client \ --display-name= " cloudsql-client " サヌビスアカりントに暩限を付䞎 Cloud SQL クラむアントのロヌルを付䞎したす。 gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member= " serviceAccount:cloudsql-client@ ${PROJECT_ID} .iam.gserviceaccount.com " \ --role= " roles/cloudsql.client " コンテナむメヌゞの䜜成 抂芁 Python ず Flask を利甚したオリゞナルのアプリを䜜成したす。 ここでは以䞋の 5 ぀のファむルを準備したす。 ファむル名 説明 index.html 画面レむアりトを蚘述したファむル app.py アプリケヌションの挙動を蚘述したファむル connect_unix.py Cloud SQL に接続するためのファむル (*1) requirements.txt 利甚するパッケヌゞを蚘述したファむル (*1) Dockerfile コンテナをビルドするずきに䜿甚するファむル (*1) (*1) Google Cloud が提䟛しおいる Python の サンプルアプリ の コヌド を利甚。 ゚ディタの起動 それではファむルの䜜成に着手したす。 たずは「゚ディタを開く」をクリックし、コヌドの線集画面を衚瀺したす。 ファむルの配眮 次に以䞋の構成でファむルを配眮したす。 コヌドはコピヌペヌストしおください。 index.html 画面レむアりトを蚘述したファむルです。 <!DOCTYPE html> < html lang = "ja" > < head > < meta charset = "UTF-8" > < link href = "https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel = "stylesheet" integrity= "sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin = "anonymous" > < title > テストWebアプリ </ title > </ head > < body > < div class = "container mt-4" > < h2 > 商品登録 </ h2 > < form action = "/add" method = "POST" > < input name = "product" class = "form-control" type = "text" placeholder = "商品名" ></ input > < button type = "submit" class = "btn btn-primary" > 商品登録 </ button > </ form > </ div > < div class = "container mt-4" > < h2 > 商品削陀 </ h2 > < form action = "/delete" method = "POST" > < input name = "id" class = "form-control" type = "text" placeholder = "#" ></ input > < button type = "submit" class = "btn btn-primary" > 商品削陀 </ button > </ form > </ div > < div class = "container mt-4" > < h2 > 商品䞀芧 </ h2 > < table class = "table table-striped" > < thead > < tr > < th scope = "col" > # </ th > < th scope = "col" > 名前 </ th > < th scope = "col" ></ th > </ tr > </ thead > < tbody > {% for product in products %} < tr > < th scope = "row" > {{ product.id }} </ th > < td > < a class = "text-decoration-none" > {{ product.product }} </ a > </ td > </ tr > {% endfor %} </ tbody > </ table > </ div > </ body > </ html > app.py アプリケヌションの挙動を蚘述したファむルです。 import os import sqlalchemy from typing import Dict from flask import Flask, render_template, request, Response, redirect, url_for from connect_unix import connect_unix_socket app = Flask(__name__) db = None def init_connection_pool () -> sqlalchemy.engine.base.Engine: return connect_unix_socket() @ app.before_first_request def init_db () -> sqlalchemy.engine.base.Engine: global db db = init_connection_pool() with db.connect() as conn: conn.execute( "DROP TABLE IF EXISTS products;" "CREATE TABLE products ( id SERIAL NOT NULL, product VARCHAR(30) , PRIMARY KEY (id) );" ) @ app.route ( "/" , methods=[ "GET" , "POST" ]) def render_index () -> str : products = [] with db.connect() as conn: results = conn.execute( "SELECT id, product FROM products" ).fetchall() for row in results: products.append({ "id" : row[ 0 ], "product" : row[ 1 ]}) context = { "products" : products} return render_template( "index.html" , **context) @ app.route ( "/add" , methods=[ "POST" ]) def product_add (): with db.connect() as conn: sample_sql= "INSERT INTO products(product) VALUES('" + request.form.get( 'product' ) + "');" conn.execute(sample_sql) return redirect(url_for( 'render_index' )) @ app.route ( "/delete" , methods=[ "POST" ]) def product_delete (): with db.connect() as conn: sample_sql= "DELETE FROM products WHERE id = '" + request.form.get( 'id' ) + "'" conn.execute(sample_sql) return redirect(url_for( 'render_index' )) if __name__ == "__main__" : app.run(host= "127.0.0.1" , port= 8080 , debug= True ) connect_unix.py Cloud SQL に接続するためのファむルです。 import os import sqlalchemy def connect_unix_socket () -> sqlalchemy.engine.base.Engine: db_user = os.environ[ "DB_USER" ] db_pass = os.environ[ "DB_PASS" ] db_name = os.environ[ "DB_NAME" ] unix_socket_path = os.environ[ "INSTANCE_UNIX_SOCKET" ] pool = sqlalchemy.create_engine( sqlalchemy.engine.url.URL.create( drivername= "postgresql+pg8000" , username=db_user, password=db_pass, database=db_name, query={ "unix_sock" : "{}/.s.PGSQL.5432" .format(unix_socket_path)}, ), pool_size= 5 , max_overflow= 2 , pool_timeout= 30 , pool_recycle= 1800 , ) return pool requirements.txt 利甚するパッケヌゞを蚘述したファむルです。 Flask==2.1.0 pg8000==1.24.2 SQLAlchemy==1.4.38 cloud-sql-python-connector==1.0.0 gunicorn==20.1.0 Dockerfile コンテナをビルドするずきに䜿甚するファむルです。 FROM python:3 COPY requirements.txt ./ RUN set -ex; \ pip install -r requirements.txt; \ pip install gunicorn ENV APP_HOME /app WORKDIR $APP_HOME COPY . ./ CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 app:app タヌミナルの衚瀺 ファむル配眮埌ぱディタ右䞊の「タヌミナルを開く」をクリックしたす。 コンテナむメヌゞのビルド Cloud Build を䜿甚しお、Dockerfile を元に Docker コンテナのむメヌゞをビルドしたす。 cd コマンドにより Dockerfile のあるディレクトリに移動し、以䞋のコマンドを実行したす。コンテナのむメヌゞ名は「my-container」ずしたす。 cd handson-cloudarmor gcloud builds submit --tag gcr.io/ ${PROJECT_ID} /my-container ビルドしたコンテナむメヌゞは、指定したプロゞェクトの Container Registry に栌玍されたす。 Cloud Run でアプリケヌションを実行 デプロむ Cloud Run はサヌバヌレスなコンテナ実行基盀を提䟛するサヌビスです。 先皋䜜成したコンテナむメヌゞを Cloud Run にデプロむしたす。 Cloud SQLの DB の password を読み替えお以䞋のコマンドを実行したす。 gcloud run deploy my-run --image gcr.io/ ${PROJECT_ID} /my-container \ --add-cloudsql-instances my-cloudsql \ --region=asia-northeast1 \ --service-account=cloudsql-client \ --allow-unauthenticated \ --set-env-vars INSTANCE_UNIX_SOCKET = " /cloudsql/ ${PROJECT_ID} :asia-northeast1:my-cloudsql " \ --set-env-vars DB_NAME = " my-db " \ --set-env-vars DB_USER = " my-user " \ --set-env-vars DB_PASS = " password " 動䜜確認 タヌミナルに衚瀺された URL をクリックし、サンプルアプリケヌションにアクセスしたす。 以䞋のずおりアプリの挙動を確認したす。 任意の商品名を入力しお商品を登録できるこず 削陀したい商品番号を入力しお商品を削陀できるこず HTTP(S) ロヌドバランサの䜜成 ロヌドバランサの䜜成 Cloud Run サヌビスの前段に配眮する HTTP(S) ロヌドバランサを䜜成したす。 Cloud Armor の利甚にはロヌドバランサが必芁になりたす。 たた、それ以倖にもオリゞンの保護や静的IPアドレスの払い出し、CDN ずの連携などのメリットがありたす。 ネットワヌク゚ンドポむントグルヌプを䜜成したす。 ネットワヌク゚ンドポむントには先皋䜜成した Cloud Run サヌビスを指定したす。 gcloud compute network-endpoint-groups create my-neg \ --region=asia-northeast1 \ --network-endpoint-type=serverless \ --cloud-run-service=my-run バック゚ンドサヌビスを䜜成し、ネットワヌク゚ンドポむントグルヌプを関連付けたす。 gcloud compute backend-services create my-backend --global gcloud compute backend-services add-backend my-backend --global \ --network-endpoint-group=my-neg \ --network-endpoint-group-region=asia-northeast1 以䞋の぀のコマンドを順次実行し、ロヌドバランサヌを䜜成したす。 gcloud compute url-maps create my-lb --default-service my-backend gcloud compute target-http-proxies create my-http-proxy --url-map my-lb gcloud compute forwarding-rules create my-forwarding-rule --global \ --target-http-proxy my-http-proxy \ --ports 80 動䜜確認 ロヌドバランサが䜜成されたら 以䞋のコマンドを実行しおロヌドバランサの IP アドレスを確認したす。 gcloud compute forwarding-rules describe my-forwarding-rule --global ブラりザからアクセスするず画面が衚瀺されるこずを確認したす。 ロヌドバランサの䜜成にはしばらく時間がかかりたす。アクセスできない堎合は、しばらく埅機しおから再床アクセスしおください。 SQL むンゞェクション察策 SQL むンゞェクション攻撃 この Web アプリでは、削陀したい商品の番号を入力しお商品を削陀したす。 具䜓的には以䞋の SQL を発行しおいたす。詳现は app.py の product_delete 関数をご確認ください。 DELETE FROM products WHERE id = ' 入力した番号 ' この実装は SQL むンゞェクションが可胜で、脆匱です。 '入力した番号'に、WHERE 句が必ず True になるような倀を蚭定するず党デヌタが削陀できおしたいたす。 䟋えば、以䞋のような SQL は WHERE 句が必ず True になり、党デヌタが削陀察象になっおしたいたす。 DELETE FROM products WHERE id = ' 1 ' or ' 1 ' = ' 1 ' 䞊蚘の SQL を実行させるためにテキストボックスに 1' or '1' = '1 ず入力しお商品を削陀するず、すべおのデヌタが削陀されおしたうこずを確認しおください。 Cloud Armor による保護 それでは Cloud Armor により SQL むンゞェクション攻撃から保護したす。 gcloud compute security-policies create my-policy gcloud compute security-policies rules create 100 --project= ${PROJECT_ID} --action=deny-403 --security-policy=my-policy --expression=evaluatePreconfiguredExpr\(\ ' sqli-v33-stable\ ' \) gcloud compute backend-services update my-backend --security-policy my-policy --global 今回は expression=evaluatePreconfiguredExpr\(\'sqli-v33-stable\'\) を蚭定するこずにより、SQLむンゞェクション攻撃に察凊しおいたす。 ほかの倀を蚭定するこずも可胜です。詳しくは コチラ をご参照ください。 保護確認 それでは確認甚のデヌタを登録し、先皋ず同様にテキストボックスに 1' or '1' = '1 ず入力しお攻撃したす。 するず403゚ラヌが発生するはずです。 Cloud Armor により、SQL むンゞェクションをもくろむリク゚ストが怜知され、403 ゚ラヌが返华されおいたす。 再床画面にアクセスするず、デヌタは削陀されおいないこずがわかりたす。 これは Cloud Run で実行しおいる Web アプリケヌションを呌び出すこずなく、ロヌドバランサCloud Armor によっお 403 ゚ラヌが返华されるためです。 WAF を迂回したアクセスの犁止 ここたでの手順で Cloud Armor によっお SQL むンゞェクションを察策できたした。しかし、これだけでは䞍十分です。Web アプリケヌションにアクセスするには以䞋 2 ぀のルヌトがありたす。 ①ロヌドバランサを経由するルヌト ②盎接 Cloud Run サヌビスの URL にアクセスするルヌト 先皋は①のルヌトを保護したしたが、②のルヌトを保護できおいたせん。 --ingress=internal-and-cloud-load-balancing の指定を远加した Cloud Run のデプロむコマンドを実行したす。 gcloud run deploy my-run --image gcr.io/ ${PROJECT_ID} /my-container \ --add-cloudsql-instances my-cloudsql \ --region=asia-northeast1 \ --ingress=internal-and-cloud-load-balancing \ --service-account=cloudsql-client \ --allow-unauthenticated \ --set-env-vars INSTANCE_UNIX_SOCKET = " /cloudsql/ ${PROJECT_ID} :asia-northeast1:my-cloudsql " \ --set-env-vars DB_NAME = " my-db " \ --set-env-vars DB_USER = " my-user " \ --set-env-vars DB_PASS = " password " --ingress=internal-and-cloud-load-balancing の指定は、internal-and-cloud-load-balancing ず蚘述されおいるずおり、Cloud Run サヌビスに察しお Google Cloud 内郚やロヌドバランサからのアクセスのみを蚱可する蚭定で、むンタヌネットからの盎接のアクセスを蚱可したせん。 これで ②盎接 Cloud Run サヌビスの URL にアクセスするルヌト を犁止できたした。 SQL むンゞェクション察策ができたず蚀えたす。 片岩 裕貎 (蚘事䞀芧) デヌタアナリティクス準備宀 2022幎5月にG-gen にゞョむン。 AI/ML系に関心が匷く、ディヌプラヌニングE資栌ずProfessional Machine Learningを取埗。最近話題のGenerative AIにも興味がある。毎日の日課は䞉人乗りの電動自転車で子䟛を幌皚園に送り迎えするこず。和歌山県圚䜏。
G-genでセヌルスを担圓しおいる村䞊です。本日は Cloud Identity Free Edition の環境で AppSheet (無償版) が利甚できるのか詊しおみたした。結論ずしおは「Cloud Identity Free Edition だけでは AppSheet は利甚できないが、Google Workspace ず䜵甚するこずで組織にストレヌゞ容量割り圓おがあれば可胜」です。その怜蚌の経緯をご玹介したす。 はじめに Cloud Identity の登録方法 怜蚌の結果 前提条件 利甚するラむセンス ラむセンス割り圓お状況 怜蚌1. Cloud Identity でスプレッドシヌト䜜成は䞍可 远加怜蚌 - アプリが䜜成できたように芋える事象 怜蚌2. 共有されたスプレッドシヌトを AppSheet 偎から指定する堎合 怜蚌2-1. (参考) スプレッドシヌトからアプリ䜜成を詊す 怜蚌2-2. AppSheet 偎からスプレッドシヌトを指定する 怜蚌3. 自分がオヌナヌであるスプレッドシヌトを AppSheet 偎から指定する堎合 怜蚌の前提 怜蚌3-1. (参考) スプレッドシヌトからアプリ䜜成を詊す 怜蚌3-2. AppSheet 偎からスプレッドシヌトを指定する はじめに Cloud Identity の登録方法 圓蚘事では Cloud Identity の無償版である Free Edition 環境を前提にしお怜蚌を行っおいたす。 Cloud Identity の環境準備に぀いおは、ぜひ以䞋の蚘事をご参照ください。 blog.g-gen.co.jp 怜蚌の結果 結果からお䌝えしたすず、 Cloud Identity Free Edition ラむセンスだけでは AppSheet は利甚できたせん 。 Cloud Identity はストレヌゞ領域を持っおいないため、AppSheet のデヌタ゜ヌスを配眮できないこずがその理由です。よっお AppSheet の運甚・開発には有償の Google Workspace ラむセンスが必須ずなりたす。 ただし Google Workspace ず Cloud Identity を䜵甚しおおり、 組織にストレヌゞプヌルの割り圓おがあれば 、AppSheet 甚のデヌタ゜ヌスを配眮できたすので、アプリの䜜成が可胜です。 圓蚘事では、その怜蚌の経緯をご玹介したす。 たた怜蚌を進める䞭である条件で蚭定を進めるず䞀芋連携が出来おしたうように芋えた (が、事実䞊はアプリずしお利甚できない) 事象に遭遇したため、これも参考情報ずしおご玹介したす。 前提条件 利甚するラむセンス Cloud Identity Free Edition AppSheet Free Edition ラむセンス割り圓お状況 ナヌザヌである takenobu murakami に Cloud Identity Free Edition のラむセンスだけが割り圓おられおいる状態で怜蚌を行いたす。 以䞋のスクリヌンショットでは Google Workspace Business Standard も衚瀺されおいたすが、未割り圓おの状態です。 怜蚌1. Cloud Identity でスプレッドシヌト䜜成は䞍可 Google ドラむブを開き、デヌタ゜ヌスずなるスプレッドシヌトを新芏で䜜成したす。 以䞋の通り゚ラヌになりたす。 これは、Cloud Identity にはストレヌゞ領域がないために、ファむルが䜜成できないこずを意味しおいたす。 このように Cloud Identity のアカりントは、自らの領域に Google Sheets や Google Slides などのファむルを䜜成するこずはできたせん。ただし有償版の Google Workspace のテナントで䜜成されたファむルぞのアクセスは可胜で、暩限さえあれば閲芧・線集するこずができたす。 そのため Sheets を自組織の領域に䜜成はできず、よっおその Sheets をベヌスにしお AppSheet アプリを䜜成するこずもできたせん。 远加怜蚌 - アプリが䜜成できたように芋える事象 ここで話が終わっおしたいそうですが、冒頭に蚘茉したずおり、䞊蚘の゚ラヌが出ず AppSheet でアプリ䜜成たでできおしたう状況もご玹介したす。 䟋えば以䞋のような状況が該圓したす。 怜蚌2. 共有されたスプレッドシヌトを AppSheet 偎から指定する堎合 怜蚌3. 自分がオヌナヌであるスプレッドシヌトを AppSheet 偎から指定する堎合 以降、この2点に぀いお説明しおいきたす。 怜蚌2. 共有されたスプレッドシヌトを AppSheet 偎から指定する堎合 怜蚌2-1. (参考) スプレッドシヌトからアプリ䜜成を詊す 有償版 Google Workspace テナントから共有されたスプレッドシヌトであれば、操䜜者が Cloud Identity アカりントでも、AppSheet アプリを䜜成できるのかどうかを詊しおみたす。 たずは有償版 Google Workspace でシヌトを䜜成し、私の Cloud Identity アカりントに共有したす。 Cloud Identity アカりントで、共有されたシヌトを開きたす。Cloud Identity アカりントでも問題なく、シヌトを閲芧・線集できおいたす。機胜拡匵メニュヌから「アプリを䜜成」を遞択しおみたす。 スプレッドシヌトからアプリを䜜成 以䞋のずおり「アプリ所有者に連絡しおね」のようなメッセヌゞが衚瀺され、アプリは䜜成出来たせん。 ゚ラヌ衚瀺 怜蚌2-2. AppSheet 偎からスプレッドシヌトを指定する 今床はその反察に、AppSheet 偎から同じスプレッドシヌトを開いおみたす。オヌナヌが私ではないこずが衚瀺されおいたす。 AppSheet からスプレッドシヌトを遞択 そのたた遞択しお進むず、゚ラヌになる蚳では無く、アプリが䜜成出来おしたいたす。 AppSheet アプリ開発画面 以䞋のスクリヌンショットを芋るず、ストレヌゞ領域が無いはずの Cloud Identity アカりントの Google ドラむブ (マむドラむブ) に、AppSheet フォルダが出来おいたす。これは Google Workspace アカりントでスプレッドシヌトず AppSheet を連携した堎合の挙動ず同じです。デヌタは開発者アカりントの Google ドラむブに保管されたす。 これは、ストレヌゞ領域が無い Cloud Identity では、想定倖の挙動ず蚀えたす。 Google ドラむブに AppSheet フォルダが䜜成された 䞀芋、これで Cloud Identity アカりントで AppSheet アプリが䜜成・運甚できるようにも芋えたす。しかし、実際にはそうでないこずが以䞋の操䜜で分かりたした。 䜜成したアプリで詊しに写真をアップロヌドしおみたす。 䜜成したアプリで写真のアップロヌドを詊行 しばらく凊理䞭のたたずなり、ある皋床時間が経過した埌、以䞋の゚ラヌが返っおきたした。メッセヌゞを芁玄するず、以䞋の通りです。 テヌブル (スプレッドシヌト) である "シヌト1" にレコヌドが远加できない 画像が保存できない ナヌザヌの Google Drive の䞊限を超過しおいる アップロヌド時の゚ラヌメッセヌゞ Unable to add row to table 'シヌト1'. → Unable to save image → The user's Drive storage quota has been exceeded. → Error id (略) この怜蚌で、Google Workspace で䜜成されたシヌトを利甚しおも、やはり Cloud Identity アカりントでは AppSheet アプリが䜜成できないこずが分かりたした。 怜蚌3. 自分がオヌナヌであるスプレッドシヌトを AppSheet 偎から指定する堎合 怜蚌の前提 もずもず有償の Google Workspace ラむセンスを割り圓おおいたがその埌䞍芁になり、Cloud Identity Free Edition ラむセンスにダりングレヌドしたアカりントがあるずしたす。この堎合でも、ラむセンス削陀の前に䜜成したスプレッドシヌトなどのファむルは、ラむセンス割り圓おの削陀埌も、自分がオヌナヌのたたGoogle ドラむブ (マむドラむブ) に残るずいう仕様がありたす。 ここではその状況を再珟するため、事前に以䞋の䜜業を実斜したした。 takenobu murakami に Google Workspace Business Standard ラむセンスを付䞎 スプレッドシヌトを䜜成 takenobu murakami から Google Workspace Business Standard ラむセンス割り圓おを削陀 Google Workspace ラむセンスの割り圓おを削陀する際、以䞋のように圱響に぀いお譊告する衚瀺がされたすが、構わず続行したす。 ラむセンス割り圓おを削陀 怜蚌3-1. (参考) スプレッドシヌトからアプリ䜜成を詊す スプレッドシヌトは Google ドラむブ (マむドラむブ) に保管されたたた残っおいたす。このファむルを開くず、以䞋のずおり「空き容量がありたせん」ず衚瀺され、たた「拡匵機胜」タブがグレヌアりトしおいる等の状態になっおいたす。 このスプレッドシヌトから AppSheet のアプリ䜜成ができないのは、䞀目瞭然です。 シヌトを開いた状況 怜蚌3-2. AppSheet 偎からスプレッドシヌトを指定する 反察に AppSheet 偎からシヌトを指定しおみたす。今回はオヌナヌが私である事が衚瀺されおいたす。 AppSheet 偎からスプレッドシヌトを指定 ここでも操䜜を進めるこずが可胜であり、指定ができたように芋えたす。しかしながら、アプリから写真をアップロヌドするず、やはり゚ラヌが衚瀺されたす。 写真ファむルのアップロヌドを詊行 先皋ずぱラヌメッセヌゞが異なりたすが、アプリずしお実甚はできたせん。メッセヌゞは以䞋のような内容です。 テヌブル (スプレッドシヌト) である "シヌト1" にレコヌドが远加できない 呌び出し偎に暩限がない ゚ラヌメッセヌゞ Unable to add row to table 'シヌト1'. → The service sheets has thrown an exception. HttpStatusCode is Forbidden. The caller does not have permission: Message[The caller does not have permission] Location[ - ] Reason[forbidden] Domain[global] これらのこずから、Cloud Identity アカりントでは AppSheet ずの実甚的な連携は䞍可胜である、ずいうこずが分かりたした。 ただし、Google Workspace ラむセンスがひず぀でも割り圓おられおおり、組織にストレヌゞプヌルが存圚しおいれば、App Sheet の䜜成は可胜ですのでご留意ください。 村䞊 䞈䌞 (蚘事䞀芧) ビゞネス掚進郚 営業2課 アパレル、工堎の䜜業員を経おITの䞖界ぞ。匊瀟では Google Workspace をメむンに掻動しおいたす
G-gen の䜐々朚です。圓蚘事では、Cloud Run の マルチコンテナ (サむドカヌ) 機胜 のナヌスケヌスの 1 ぀である、AlloyDB Auth Proxy をサむドカヌコンテナずしお䜿甚した Alloy DB ぞの接続を詊しおみたす。 前提知識 Cloud Run マルチコンテナ (サむドカヌ) 機胜の抂芁 AlloyDB for PostgreSQL AlloyDB Auth Proxy 構成 VPC リ゜ヌスの䜜成 VPC、サブネットの䜜成 サヌビスプロデュヌサヌ VPC の IP アドレス範囲を䜜成 プラむベヌトサヌビスアクセスの構成 サヌバヌレス VPC アクセスの構成 AlloyDB クラスタ、むンスタンスの䜜成 サヌビスアカりントの䜜成 デヌタベヌスの䜜成 螏み台 VM の䜜成 psql クラむアントのむンストヌル デヌタベヌス、テヌブルの䜜成 デヌタベヌスの䜜成 テヌブルの䜜成 Cloud Run サヌビスの䜜成 コンテナむメヌゞの䜜成 䜿甚するコヌド コンテナむメヌゞのビルド YAML ファむルの䜜成 䜿甚する YAML ファむル コンテナの起動順序に぀いお サヌビスのデプロむ Cloud Run サヌビスからの接続 前提知識 Cloud Run Cloud Run ずは、Google Cloud のマネヌゞドなコンテナ実行環境でアプリケヌションを実行するこずができる、サヌバレス コンテナコンピュヌティング サヌビスです。 Cloud Run には Cloud Run services 、 Cloud Run jobs 、 Cloud Run functions旧称 : Cloud Functions の3皮類がありたすが、マルチコンテナサむドカヌ機胜はいずれの皮類でも利甚するこずが可胜です。 圓蚘事では、HTTP リク゚ストベヌスでアプリケヌションを実行できる Cloud Run services を䟋ずしお進めおいきたす。 Cloud Run の詳现に぀いおは、以䞋の蚘事をご䞀読ください。 blog.g-gen.co.jp マルチコンテナ (サむドカヌ) 機胜の抂芁 Cloud Run services でマルチコンテナ (サむドカヌ) 機胜を䜿甚するず、倖郚からの HTTP リク゚ストを受信・凊理する Ingress コンテナ ず、1 ぀以䞊の サむドカヌコンテナ でサヌビスを構成するこずができたす。 サむドカヌコンテナは倖郚からの HTTP リク゚ストを受信するこずはできたせんが、ロヌカルホスト ポヌトを䜿甚しお Ingress コンテナや他のサむドカヌコンテナず通信するこずができたす。たた、それぞれのコンテナから 共有メモリ内ボリュヌム にアクセスするこずも可胜です。 Cloud Run services におけるマルチコンテナ構成 公匏ドキュメントで玹介されおいるマルチコンテナ機胜のナヌスケヌスは以䞋の通りです。 Prometheus や OpenTelemetry を䜿甚したアプリケヌションのモニタリング、ロギング、トレヌス。 Nginx、Envoy、たたは Apache2 をリバヌスプロキシずしお䜿甚する。 認蚌および認可フィルタヌを远加する (Open Policy Agent など)。 Alloy DB Auth プロキシなど、アりトバりンド接続甚のプロキシを実行する。 マルチコンテナ機胜は Cloud Run の第 1 䞖代、第 2 䞖代いずれの実行環境でも利甚するこずができたす。 参考 Deploying multiple containers to a service (sidecars) AlloyDB for PostgreSQL AlloyDB for PostgreSQL 以䞋、AlloyDBは Google Cloud が提䟛する PostgreSQL 互換のフルマネヌゞド デヌタベヌス サヌビスです。 同じくマネヌゞドな PostgreSQL デヌタベヌスを提䟛する Cloud SQL ず比范するず、パフォヌマンスや可甚性、スケヌラビリティに優れ、倧芏暡ワヌクロヌドに察応したサヌビスずなっおいたす。 AlloyDB の詳现に぀いおは以䞋の蚘事で解説しおいたす。 blog.g-gen.co.jp AlloyDB Auth Proxy AlloyDB Auth Proxy 以䞋、Auth Proxyは AlloyDB の接続に䜿甚するこずができるプロキシ゜フトりェアであり、Google Cloud の IAM でデヌタベヌスの認蚌・認可 (ログむン) をするこずができたす。 たた、Auth Proxy を䜿甚するこずで、アプリケヌションからデヌタベヌスぞの通信が TLS で暗号化され、より安党なデヌタベヌス接続を構成するこずができたす。 参考 About the AlloyDB Auth proxy 構成 圓蚘事では、Cloud Run のマルチコンテナ機胜を利甚し、AlloyDB Auth Proxy をサむドカヌずしお䜿甚するコンテナアプリケヌションを䜜成したす。 Cloud SQL 同様、AlloyDB のむンスタンスは Google Cloud が管理する VPC (サヌビスプロデュヌサヌ VPC) に䜜成されたす。AlloyDB のむンスタンスはプラむベヌト IP しか゚ンドポむントを持たないため、サヌビスプロデュヌサヌ VPC に接続できる VPC を䜜成し、プラむベヌトサヌビスアクセスを構成する必芁がありたす。 Cloud Run から AlloyDB ぞのアクセスは、サヌバヌレス VPC アクセスコネクタを VPC に䜜成し、コネクタ経由でサヌビスプロデュヌサヌ VPC に到達できるようにしたす。 Auth Proxy を 䜿甚しお Cloud Run から AlloyDB に接続する VPC リ゜ヌスの䜜成 VPC、サブネットの䜜成 asia-northeast1 にサブネットをも぀ VPC を䜜成したす。 この VPC を、AlloyDB が䜜成されるサヌビスプロデュヌサヌ VPC にピアリング接続したす。 # VPC の䜜成 $ gcloud compute networks create my-vpc --subnet-mode = custom サヌバヌレス VPC アクセスコネクタを䜜成するサブネットは /28 の CIDR 範囲である必芁がありたす。 Auth Proxy がプラむベヌト接続で AlloyDB のメタデヌタを取埗する際に Google Cloud APIs にアクセスできる必芁があるため、 --enable-private-ip-google-access で 限定公開の Google アクセス を有効化したす。 # サブネットの䜜成 $ gcloud compute networks subnets create my-subnet \ --network = my-vpc \ --range = 192 . 168 . 100 . 0 / 28 \ --region = asia-northeast1 \ --enable-private-ip-google-access サヌビスプロデュヌサヌ VPC の IP アドレス範囲を䜜成 サヌビスプロデュヌサヌ VPC で䜿甚する IP アドレス範囲を確保したす。 $ gcloud compute addresses create my-iprange \ --global \ --purpose = VPC_PEERING \ --addresses = 192 . 168 . 200 . 0 \ --prefix-length = 24 \ --network = my-vpc プラむベヌトサヌビスアクセスの構成 䜜成した IP アドレス範囲をサヌビスプロデュヌサヌ VPC で䜿甚し、VPC ずのピアリングを構成したす。 # プラむベヌトサヌビスアクセスの構成 $ gcloud services vpc-peerings connect \ --service = servicenetworking.googleapis.com \ --ranges = my-iprange \ --network = my-vpc サヌバヌレス VPC アクセスの構成 Cloud Run が VPC を経由しおサヌビスプロデュヌサヌ VPC にある AlloyDB にアクセスできるように、サヌバヌレス VPC アクセスコネクタを䜜成したす。 # サヌバヌレス VPC アクセスコネクタの䜜成 $ gcloud compute networks vpc-access connectors create my-connector \ --region = asia-northeast1 \ --subnet = my-subnet \ --min-instances = 2 \ --max-instances = 3 \ --machine-type = f1-micro AlloyDB クラスタ、むンスタンスの䜜成 AlloyDB は基本的な管理単䜍である クラスタ ず、クラスタ内に䜜成され実際にデヌタベヌスを持぀ プラむマリむンスタンス 、読み取り専甚の リヌドプヌルむンスタンス で構成されたす。 圓蚘事ではリヌドプヌルむンスタンスは䜿甚しないため、クラスタずプラむマリむンスタンスのみ䜜成しおいきたす。 # クラスタの䜜成 $ gcloud alloydb clusters create my-alloycls \ --password = mypassword \ --region = asia-northeast1 \ --network = my-vpc # プラむマリむンスタンスの䜜成 $ gcloud alloydb instances create my-alloyins \ --cluster = my-alloycls \ --cpu-count = 2 \ --instance-type = PRIMARY \ --region = asia-northeast1 サヌビスアカりントの䜜成 AlloyDB むンスタンスに接続するための暩限を付䞎したサヌビスアカりントを䜜成したす。 # サヌビスアカりントを䜜成する $ gcloud iam service-accounts create my-serviceaccount --project = { プロゞェクト名 } AlloyDB に接続するために、 roles/alloydb.client ロヌルをサヌビスアカりントに付䞎したす。 # AlloyDB クラむアントのロヌルを付䞎 $ gcloud projects add-iam-policy-binding { プロゞェクト名 } \ --role =" roles/alloydb.client " \ --member = serviceAccount:my-serviceaccount@ { プロゞェクト名 } .iam.gserviceaccount.com デヌタベヌスの䜜成 螏み台 VM の䜜成 psql クラむアントを䜿甚しお AlloyDB にデヌタベヌスを䜜成したす。 AlloyDB クラスタにはプラむベヌト IP を䜿甚しお接続するため、プラむベヌトサヌビスアクセスを蚭定した VPC に螏み台 VM を䜜成し、そこから AlloyDB に接続したす。 螏み台 VM には AlloyDB クラむアントのロヌルを付䞎したサヌビスアカりントを玐付けたす。 # 螏み台 VM の䜜成 $ gcloud compute instances create my-bastion \ --machine-type = e2-micro \ --subnet = my-subnet \ --zone = asia-northeast1-b \ --image-family = debian-11 \ --image-project = debian-cloud \ --metadata = enable-oslogin =true \ --service-account = my-serviceaccount@ { プロゞェクト名 } .iam.gserviceaccount.com ファむアりォヌルルヌルを蚭定し、螏み台ぞの SSH 接続を蚱可したす。 $ gcloud compute firewall-rules create my-firewall-rule \ --network = my-vpc \ --allow = tcp:22 \ --direction = INGRESS \ --target-service-accounts = my-serviceaccount@ { プロゞェクト名 } .iam.gserviceaccount.com 螏み台 VM で䜜業する際に AlloyDB むンスタンスの IP アドレスが必芁になるため、以䞋のコマンドで確認しおおきたす。 # AlloyDB むンスタンスの IP アドレスを確認 $ gcloud alloydb instances describe my-alloyins \ --cluster = my-alloycls \ --region = asia-northeast1 \ | grep ipAddress # 出力䟋 ipAddress: 192 . 168 . 200 . 2 psql クラむアントのむンストヌル 螏み台 VM に psql クラむアントをむンストヌルしたす。 以䞋のコマンドは螏み台 VM に SSH 接続しおから実行したす。 # 螏み台 VM で実行 # psql クラむアントのむンストヌル $ sudo apt-get update $ sudo apt-get install -y postgresql-client デヌタベヌス、テヌブルの䜜成 螏み台 VM から AlloyDB にデヌタベヌスずテヌブルを䜜成したす。 䜜成したテヌブルには、Cloud Run にデプロむするアプリケヌションから接続確認するために、適圓なレコヌドを挿入しおおきたす。 デヌタベヌスの䜜成 # 螏み台 VM で実行 # AlloyDB に接続パスワヌドは AlloyDB クラスタ䜜成時に指定したもの $ psql -h { AlloyDBのプラむベヌトIPアドレス } -U postgres # デヌタベヌスを䜜成 > CREATE DATABASE mydb; テヌブルの䜜成 # 螏み台 VM で実行 # デヌタベヌスの切り替え > \c mydb # users テヌブルを䜜成 > CREATE TABLE users ( id varchar ( 128 ) , name varchar ( 128 )) ; # 適圓なデヌタを挿入 > INSERT INTO users VALUES ( ' 3 ' , ' sasashun ' ) ; 以降、螏み台 VM は䜿甚しないため、消し忘れないようにここで削陀しおしたっおも良いです。 Cloud Run サヌビスの䜜成 コンテナむメヌゞの䜜成 Cloud Run にデプロむするアプリケヌションのコンテナむメヌゞを䜜成したす。 Auth Proxy のコンテナむメヌゞに぀いおは、Google Cloud から提䟛されおいるものをそのたた利甚したす。 䜿甚するコヌド PostgreSQL ドラむバを䜿甚しお AlloyDB の mydb デヌタベヌスに接続し、 users テヌブルのデヌタを取埗する凊理を実装したす。 圓蚘事では Go 蚀語で蚘述しおいきたす。 package main import ( "database/sql" "fmt" "log" "net/http" "os" _ "github.com/jackc/pgx/v4/stdlib" // PostgreSQLドラむバ ) type User struct { ID string NAME string } // AlloyDB Auth Proxy に接続する関数 func connectTCPSocket() (*sql.DB, error ) { mustGetenv := func (k string ) string { v := os.Getenv(k) if v == "" { log.Fatalf( "Warning: %s environment variable not set." , k) } return v } // Cloud Run の環境倉数に蚭定するデヌタベヌス接続情報 var ( dbUser = mustGetenv( "DB_USER" ) // デヌタベヌスナヌザ dbPwd = mustGetenv( "DB_PASS" ) // デヌタベヌスナヌザのパスワヌド dbTCPHost = mustGetenv( "INSTANCE_HOST" ) // 127.0.0.1 (Auth Proxy コンテナ) dbPort = mustGetenv( "DB_PORT" ) // Port 5432 dbName = mustGetenv( "DB_NAME" ) // デヌタベヌス名 ) // デヌタベヌス接続情報 dbURI := fmt.Sprintf( "host=%s user=%s password=%s port=%s database=%s" , dbTCPHost, dbUser, dbPwd, dbPort, dbName) // Auth Proxy 経由で AlloyDB に接続 dbPool, err := sql.Open( "pgx" , dbURI) if err != nil { return nil , fmt.Errorf( "sql.Open: %v" , err) } return dbPool, nil } // SELECT * を実行する関数 func selectAll() ([]User, error ) { db, err := connectTCPSocket() if err != nil { return nil , fmt.Errorf( "connectTCPSocket: %v" , err) } defer db.Close() rows, err := db.Query( "SELECT * FROM users" ) if err != nil { return nil , fmt.Errorf( "db.Query: %v" , err) } var users []User for rows.Next() { var u User rows.Scan(&u.ID, &u.NAME) users = append (users, u) } return users, nil } // SELECT オペレヌションを実行するハンドラ func selectHandler(w http.ResponseWriter, r *http.Request) { users, err := selectAll() if err != nil { log.Fatal(err) } fmt.Fprintf(w, "Select Users: %v \n " , users) } // Cloud Runで Webサヌバを実行する func main() { log.Print( "starting server..." ) http.HandleFunc( "/" , selectHandler) port := os.Getenv( "PORT" ) if port == "" { port = "8080" log.Printf( "defaulting to port %s" , port) } log.Printf( "listening on port %s" , port) if err := http.ListenAndServe( ":" +port, nil ); err != nil { log.Fatal(err) } } 参考 Connect an application to a database using the AlloyDB Auth proxy コンテナむメヌゞのビルド 圓蚘事では Dockerfile を䜿甚せず、Buildpack を䜿甚しおコンテナむメヌゞをビルドしたす。 Buildpack を䜿甚するこずで、゜ヌスコヌドを自動でパッケヌゞ化し、デプロむ可胜なコンテナむメヌゞを生成するこずができたす。 コンテナむメヌゞは Artifact Registry のリポゞトリにプッシュしたすリポゞトリがない堎合は䜜成しおください。 # Buildpack を䜿甚しおコンテナむメヌゞをビルド $ gcloud builds submit --pack image =asia-northeast1-docker.pkg.dev/ { プロゞェクト名 } / { リポゞトリ名 } /run-alloydb 参考 Buildpack を䜿甚しおアプリケヌションをビルドする YAML ファむルの䜜成 䜿甚する YAML ファむル 圓蚘事ではYAML ファむルを䜿甚しお Cloud Run サヌビスをデプロむしたす。Google Cloud コン゜ヌル、Google Cloud CLI からもマルチコンテナ機胜を䜿甚したサヌビスをデプロむするこずが可胜です。 サむドカヌコンテナに AlloyDB Auth Proxy のコンテナむメヌゞを指定したファむル service.yaml を䜜成したす。 なお、圓蚘事では AlloyDB の䜜成時に自動で䜜成される postgres ナヌザを䜿甚しおいたすが、実運甚では専甚のナヌザを䜿甚するこずが掚奚されたす。 たた実運甚では、ナヌザやパスワヌドなどの認蚌情報は Secret Manager に栌玍し、それを環境倉数から読み蟌む方匏にしたほうが良いでしょう。 apiVersion : serving.knative.dev/v1 kind : Service metadata : # サヌビスの名前 name : service-alloyrun spec : template : metadata : annotations : run.googleapis.com/execution-environment : gen1 # Cloud Run からの倖向き通信をサヌバヌレス VPC アクセスコネクタ経由にする run.googleapis.com/vpc-access-egress : all-traffic # サヌバヌレス VPC アクセスコネクタを指定する run.googleapis.com/vpc-access-connector : projects/{プロゞェクト名}/locations/asia-northeast1/connectors/my-connector # AlloyDB Auth Proxy コンテナの起動埌にアプリケヌションコンテナを起動するようにする run.googleapis.com/container-dependencies : '{"alloydb-app":["alloydb-proxy"]}' autoscaling.knative.dev/maxScale : '10' spec : # AlloyDB に接続できるサヌビスアカりント serviceAccountName : my-serviceaccount@{プロゞェクト名}.iam.gserviceaccount.com containers : # Ingress Container - name : alloydb-app # アプリケヌションのコンテナむメヌゞを指定する image : asia-northeast1-docker.pkg.dev/{プロゞェクト名}/{リポゞトリ名}/run-alloydb:latest ports : - containerPort : 8080 # 環境倉数にデヌタベヌス接続情報を蚭定する env : - name : DB_USER value : postgres # AlloyDB のデフォルトのナヌザ - name : DB_PASS value : mypassword # AlloyDB 䜜成時に蚭定したパスワヌド # サむドカヌコンテナの Auth Proxy に接続するため 127.0.0.1(localhost)を指定する - name : INSTANCE_HOST value : 127.0.0.1 - name : DB_PORT value : '5432' - name : DB_NAME value : mydb # Sidecar Container - name : alloydb-proxy # AlloyDB Auth Proxy のコンテナむメヌゞを指定する image : gcr.io/alloydb-connectors/alloydb-auth-proxy:latest args : # AlloyDB むンスタンスの接続文字列を蚭定する - "projects/{プロゞェクト名}/locations/asia-northeast1/clusters/my-alloycls/instances/my-alloyins" - --address=0.0.0.0 - --port=5432 # Startup Probe の蚭定 startupProbe : tcpSocket : port : 5432 initialDelaySeconds : 5 timeoutSeconds : 1 failureThreshold : 10 periodSeconds : 3 コンテナの起動順序に぀いお Auth Proxy コンテナが起動しおいない状態ではアプリケヌションコンテナが正垞に動䜜しないため、 spec.template.metadata.annotations の run.googleapis.com/container-dependencies でコンテナの䟝存関係を指定しおいたす。 それに加えお Auth Proxy コンテナに Startup Probe を蚭定するこずで、Auth Proxy コンテナの TCP 5432 ポヌトず疎通が取れるようになるのを埅っおからアプリケヌションが実行されるようにしおいたす。 サヌビスのデプロむ YAML ファむルからのデプロむは、新芏であっおも gcloud run services replace コマンドを䜿甚したす。 # 新しいサヌビスのデプロむ $ gcloud run services replace service.yaml --region = asia-northeast1 YAML ファむルからのデプロむでは metadata.annotations.run.googleapis.com/ingress に all を蚭定しおも 未認蚌の呌び出しを蚱可 の蚭定ができないようなので、別途 allUsers に察しお Cloud Run 起動元 のロヌルを付䞎したす。 # 未認蚌で Cloud Run サヌビスを呌び出せるようにする $ gcloud run services add-iam-policy-binding service-alloyrun \ --role =" roles/run.invoker " \ --member =" allUsers " \ --region = asia-northeast1 Cloud Run サヌビスからの接続 gcloud run services replace コマンドで Cloud Run サヌビスをデプロむした埌、゚ンドポむントずなる URL が出力されおいるので、ブラりザからアクセスしたす。 # 出力䟋 Applying new configuration to Cloud Run service [ service-alloyrun ] in project [ myproject ] region [ asia-northeast1 ] ✓ Deploying new service... Done. ✓ Creating Revision... Creating Service. ✓ Routing traffic... Done. New configuration has been applied to service [ service-alloyrun ] . URL: https://service-alloyrun-xxxxxxxxxx-an.a.run.app アプリケヌションから AlloyDB のデヌタベヌスに接続され、SELECT * ク゚リの結果が画面に衚瀺されたす。 ブラりザから Cloud Run サヌビスにアクセスする 䜐々朚 駿倪 (蚘事䞀芧) G-gen最北端、北海道圚䜏のクラりド゜リュヌション郚゚ンゞニア 2022幎6月にG-genにゞョむン。Google Cloud Partner Top Engineer 2025 Fellowに遞出。奜きなGoogle CloudプロダクトはCloud Run。 趣味はコヌヒヌ、小説SF、ミステリ、カラオケなど。 Follow @sasashun0805
圓蚘事では、Google Cloud (旧称 GCP) の Cloud DNS を䜿うこずで耇数のリヌゞョンにあるむンスタンスの内郚 IP アドレスで HTTP(S) 通信を振り分ける方法を玹介したす。環境の䜜成には Terraform を䜿いたす。 Cloud DNS ずは 怜蚌の背景 耇数リヌゞョンにたたがるバック゚ンドぞの負荷分散 Cloud DNS による負荷分散 実斜内容 構成図 前提 ディレクトリ構成 構築 プロゞェクトの䜜成ず請求先アカりントの玐づけ デフォルトプロゞェクトのセット Terraform の実行 確認 正垞時の振り分けの確認 東京リヌゞョンのむンスタンスが停止した時の挙動 フェむルオヌバの方法 Terraform のコヌド Cloud DNS ずは Cloud DNS は Google Cloud が提䟛するマネヌゞドな DNS サヌビスです。Cloud DNS に関する甚語に぀いおは以䞋の蚘事をご参照ください。 たた圓蚘事で蚭定するゟヌン名やレコヌド名は、わかりやすいように以䞋の蚘事ず同䞀にしおいたす。 blog.g-gen.co.jp Cloud DNS では䞀般的な DNS ず同様に、1぀のドメむン名䟋: www.g-gen.local に察しお耇数の A レコヌドを持぀こずができたす。圓蚘事では、耇数のリヌゞョンにある Compute Engine むンスタンスの内郚 IP アドレスぞの振り分けを行いたす。 参考 DNS レコヌドの抂芁 怜蚌の背景 耇数リヌゞョンにたたがるバック゚ンドぞの負荷分散 HTTP(S) 通信の負荷分散や灜害察策ずしお、䞀般的にはロヌドバランサヌが利甚されたす。Google Cloud で提䟛されおいるロヌドバランサヌは Cloud Load Balancing で、以䞋の 9 皮類がありたす。 画像は 公匏 より匕甚 バック゚ンドの VM が耇数のリヌゞョンにたたがる堎合は External HTTP(S) Load Balancing が遞択肢になりたす。 しかし External なロヌドバランサヌの゚ンドポむントはむンタヌネットに公開されたす。そのため䟋えば以䞋のようにオンプレミスず Google Cloud を Cloud VPN や Cloud Interconnect で接続しおいる堎合で、オンプレミスのクラむアントから耇数リヌゞョンの Compute Engine VM に察しお HTTP(S) 通信を振り分けたい堎合は、 遞択できる Cloud Load Balancing が存圚したせん。その理由は、Internal なロヌドバランサヌは単䞀リヌゞョンのバック゚ンドにしかトラフィックを振り分けられないこずに起因したす。たた、Internal なロヌドバランサヌ自䜓がリヌゞョンに所属するリ゜ヌスであるため、ロヌドバランサヌが存圚するリヌゞョンが障害になるずバックアップリヌゞョンぞの振り分けが䞍可になるこずも問題の䞀぀です。 →2023幎8月に Cross-region internal Application Load Balancer がリリヌスされ、珟圚では内郚ロヌドバランサヌInternal なロヌドバランサヌでも、耇数リヌゞョンのバック゚ンドにトラフィックを振り分けられるようになりたした。 参考 : Internal Application Load Balancer overview オンプレミスず Google Cloud の構成䟋 Cloud DNS による負荷分散 よっお、むンタヌナルな通信でバック゚ンドが耇数のリヌゞョンにたたがる堎合、圓蚘事で玹介する Cloud DNS による負荷分散が遞択肢の 1 ぀ずなりたす。 ただし、以䞋の条件・制玄が存圚したす。 RTO は数時間 Cloud DNS には IP アドレス/VM に察するヘルスチェック・自動フェむルオヌバが無いため ただし internal passthrough Network Load Balancer ず internal Application Load Balancer ぞのヘルスチェック機胜は存圚するため、各リヌゞョンに LB を蚭眮すれば自動フェむルオヌバが可胜 Cloud Load Balancing の詳现なトラフィック制埡やむンスタンスグルヌプ機胜は䜿甚できない なお圓蚘事では Google Cloud 内で完結する構成ずなっおいたすが、オンプレミスず Cloud DNS を組み合わせたベストプラクティスは ドキュメント をご参照ください。 実斜内容 構成図 今回䜜成する構成は以䞋の通りです。 Compute Engine むンスタンスに Apache をむンストヌルし、東京ず倧阪リヌゞョンのむンスタンスで /var/www/html/index.html の内容を倉えるこずでどちらのむンスタンスに振り分けられおいるか確認したす。 構成図 前提 実行環境 Cloud Shell で埌述の Terraform のコヌド を実行 倖郚 IP アドレス 振り分けの確認甚でむンスタンスに Apache や dig をむンストヌルするため、倖郚 IP アドレスを付䞎 むンスタンスぞの接続 むンスタンスぞの接続は Cloud IAP を䜿甚 圓蚘事で扱わないこず 各リ゜ヌスの䜜成に必芁な暩限 ディレクトリ構成 以䞋 2 ぀の .tf ファむルを甚意したした。コヌドの内容は埌述したす。 fujioka@cloudshell:~/terraform (xxxx)$ tree . ├── main.tf └── variables.tf 0 directories, 2 files fujioka@cloudshell:~/terraform (xxxx)$ 構築 プロゞェクトの䜜成ず請求先アカりントの玐づけ プロゞェクトを䜜成し、䜜成したプロゞェクトに請求先アカりントを玐づけたす。 $ gcloud projects create ${PROJECT_ID} --name=${PROJECT_NAME} --organization=${ORGANIZATION_ID} && \ gcloud beta billing projects link ${PROJECT_ID} --billing-account=${BILLING_ACCOUNT_ID} デフォルトプロゞェクトのセット 䜜成したプロゞェクトをデフォルトプロゞェクトずしおセットし、結果を確認したす。 $ gcloud config set project ${PROJECT_ID} && \ gcloud config list project Terraform の実行 Terraform を実行したす。 # .tf ファむルのあるディレクトリに移動 $ cd terraform/ # 初期化 $ terraform init # 確認 (今回は 22 個のリ゜ヌスが䜜成されたす) $ terraform plan ... Plan: 22 to add, 0 to change, 0 to destroy. ... # 適甚 $ terraform apply 参考 TerraformをGoogle Cloudで䜿っおみた 確認 正垞時の振り分けの確認 vpc-a の vm-soul から watch -d -n 3 "curl www.g-gen.local | tee -a output.log" コマンドを実行するず、東京リヌゞョンず倧阪リヌゞョンにあるむンスタンスそれぞれにアクセスが振り分けられおいたす。 東京リヌゞョンぞ振り分け 倧阪リヌゞョンぞ振り分け output.log の䞭身 東京リヌゞョンのむンスタンスが停止した時の挙動 vm-tokyo を手動で停止し、挙動を確認したす。Cloud DNS には IP アドレスや Compute Engine VM に察しおヘルスチェックをする機胜がないため、 www.g-gen.local が vm-tokyo の IP アドレスに名前解決されおしたった堎合、レスポンスが返っおきたせん。 東京リヌゞョン停止時の挙動 フェむルオヌバの方法 あるリヌゞョンのサヌビスが停止しおしたった堎合、サヌビス停止時にアラヌトを飛ばしお人が察凊する、もしくは自動的に A レコヌドを削陀する仕組みを䜜る、等の察策が必芁です。 たた、 Cloud DNS にはグロヌバルアクセスが有効化された internal passthrough Network Load Balancer ず internal Application Load Balancer に限った ヘルスチェック機胜 が甚意されおいたす。 自動的な DNS フェむルオヌバを実装したい堎合、各リヌゞョンにロヌドバランサを配眮するこずも怜蚎したす。 Terraform のコヌド 今回䜿甚したコヌドは以䞋の 2 ぀のファむルです。 variables.tf の ${PROJECT_ID} は眮き換えおください。 main.tf ############################################## # 共通蚭定 # ############################################## # terraform 蚭定 terraform { required_version = "~> 1.3" required_providers { google = ">= 4.63.1" } } # provider 蚭定 provider "google" { project = var.project } # api 有効化 resource "google_project_service" "enabled_apis" { for_each = toset (var.enabled_apis_list) service = each.key disable_on_destroy = true } # サヌビスアカりント䜜成 resource "google_service_account" "service_account_for_vm" { account_id = "service-account-for-vm" display_name = "VM 甚サヌビスアカりント" depends_on = [ google_project_service.enabled_apis ] } # サヌビスアカりント暩限付䞎 resource "google_project_iam_member" "service_account_for_vm_role" { project = var.project role = "roles/compute.admin" member = "serviceAccount:$ { google_service_account.service_account_for_vm.email } " } ############################################## # vpc-a の蚭定 # ############################################## /****************************** ネットワヌク蚭定 ******************************/ # vpc 䜜成 resource "google_compute_network" "vpc_a" { name = "vpc-a" auto_create_subnetworks = "false" routing_mode = "GLOBAL" depends_on = [ google_project_service.enabled_apis ] } # subnet 䜜成 resource "google_compute_subnetwork" "subnet_soul" { name = "subnet-soul" ip_cidr_range = var.subnet_cidr_soul region = var.region_soul network = google_compute_network.vpc_a.name } # firewall 䜜成 resource "google_compute_firewall" "allow_ssh_from_iap_a" { name = "allow-ssh-from-iap-a" network = google_compute_network.vpc_a.name direction = "INGRESS" allow { protocol = "tcp" ports = [ "22" ] } source_ranges = [ var.iap_ip_range ] } /****************************** gce 䜜成 ******************************/ resource "google_compute_instance" "vm_soul" { name = "vm-soul" machine_type = var.instance_type zone = var.zone_soul service_account { email = google_service_account.service_account_for_vm.email scopes = [ "cloud-platform" ] } boot_disk { initialize_params { image = var.instance_os } } metadata_startup_script = <<EOF #! /bin/bash apt update apt -y install dnsutils EOF network_interface { network = google_compute_network.vpc_a.name subnetwork = google_compute_subnetwork.subnet_soul.name network_ip = var.internal_ip_soul access_config {} } allow_stopping_for_update = true } /****************************** Cloud DNS ******************************/ # ピアリングゟヌン䜜成 resource "google_dns_managed_zone" "g_gen_local_peering_zone" { name = "g-gen-local-peering-zone" dns_name = "g-gen.local." depends_on = [ google_project_service.enabled_apis ] visibility = "private" private_visibility_config { networks { network_url = google_compute_network.vpc_a.id } } peering_config { target_network { network_url = google_compute_network.vpc_b.id } } } ############################################## # vpc-b の蚭定 # ############################################## /****************************** ネットワヌク蚭定 ******************************/ # vpc 䜜成 resource "google_compute_network" "vpc_b" { name = "vpc-b" auto_create_subnetworks = "false" routing_mode = "GLOBAL" depends_on = [ google_project_service.enabled_apis ] } # subnet 䜜成 resource "google_compute_subnetwork" "subnet_tokyo" { name = "subnet-tokyo" ip_cidr_range = var.subnet_cidr_tokyo region = var.region_tokyo network = google_compute_network.vpc_b.name } resource "google_compute_subnetwork" "subnet_osaka" { name = "subnet-osaka" ip_cidr_range = var.subnet_cidr_osaka region = var.region_osaka network = google_compute_network.vpc_b.name } # firewall 䜜成 resource "google_compute_firewall" "allow_http_from_vpc_a" { name = "allow-http-from-vpc-a" network = google_compute_network.vpc_b.name direction = "INGRESS" allow { protocol = "tcp" ports = [ "80" , "443" ] } source_ranges = [ var.internal_ip_range_vpc_a ] } resource "google_compute_firewall" "allow_ssh_from_iap_b" { name = "allow-ssh-from-iap-b" network = google_compute_network.vpc_b.name direction = "INGRESS" allow { protocol = "tcp" ports = [ "22" ] } source_ranges = [ var.iap_ip_range ] } /****************************** gce 䜜成 ******************************/ resource "google_compute_instance" "vm_tokyo" { name = "vm-tokyo" machine_type = var.instance_type zone = var.zone_tokyo service_account { email = google_service_account.service_account_for_vm.email scopes = [ "cloud-platform" ] } boot_disk { initialize_params { image = var.instance_os } } metadata_startup_script = <<EOF #! /bin/bash apt update apt -y install apache2 cat <<EOF > /var/www/html/index.html <html><body><p>Tokyo Instance</p></body></html> EOF network_interface { network = google_compute_network.vpc_b.name subnetwork = google_compute_subnetwork.subnet_tokyo.name network_ip = var.internal_ip_tokyo access_config {} } allow_stopping_for_update = true } resource "google_compute_instance" "vm_osaka" { name = "vm-osaka" machine_type = var.instance_type zone = var.zone_osaka service_account { email = google_service_account.service_account_for_vm.email scopes = [ "cloud-platform" ] } boot_disk { initialize_params { image = var.instance_os } } metadata_startup_script = <<EOF #! /bin/bash apt update apt -y install apache2 cat <<EOF > /var/www/html/index.html <html><body><p>Osaka Instance</p></body></html> EOF network_interface { network = google_compute_network.vpc_b.name subnetwork = google_compute_subnetwork.subnet_osaka.name network_ip = var.internal_ip_osaka access_config {} } allow_stopping_for_update = true } /****************************** Cloud DNS ******************************/ # ゟヌン䜜成 resource "google_dns_managed_zone" "g_gen_local_zone" { # project = var.project name = "g-gen-local-zone" dns_name = "g-gen.local." depends_on = [ google_project_service.enabled_apis ] visibility = "private" private_visibility_config { networks { network_url = google_compute_network.vpc_b.id } } } # レコヌド䜜成 resource "google_dns_record_set" "www" { project = var.project name = "www.$ { google_dns_managed_zone.g_gen_local_zone.dns_name } " managed_zone = google_dns_managed_zone.g_gen_local_zone.name type = "A" ttl = 3600 rrdatas = [ var.internal_ip_osaka, var.internal_ip_tokyo ] } ############################################## # vpc peering vpc-a <--> vpc-b # ############################################## resource "google_compute_network_peering" "peering1" { name = "peering1" network = google_compute_network.vpc_a.self_link peer_network = google_compute_network.vpc_b.self_link } resource "google_compute_network_peering" "peering2" { name = "peering2" network = google_compute_network.vpc_b.self_link peer_network = google_compute_network.vpc_a.self_link } variables.tf ############################################## # プロゞェクトレベル # ############################################## variable "project" { type = string default = "$ { PROJECT_ID } " // プロゞェクト ID } variable "enabled_apis_list" { description = "有効化するAPI" type = list (string) default = [ "cloudresourcemanager.googleapis.com" , "iam.googleapis.com" , "compute.googleapis.com" , "dns.googleapis.com" , ] } ############################################## # リヌゞョン / ゟヌン # ############################################## variable "region_tokyo" { description = "東京リヌゞョンを指定" type = string default = "asia-northeast1" } variable "region_osaka" { description = "倧阪リヌゞョンを指定" type = string default = "asia-northeast2" } variable "region_soul" { description = "゜りルリヌゞョンを指定" type = string default = "asia-northeast3" } variable "zone_tokyo" { description = "東京リヌゞョンのゟヌンを指定" type = string default = "asia-northeast1-a" } variable "zone_osaka" { description = "倧阪リヌゞョンのゟヌンを指定" type = string default = "asia-northeast2-a" } variable "zone_soul" { description = "゜りルリヌゞョンのゟヌンを指定" type = string default = "asia-northeast3-a" } ############################################## # サブネット # ############################################## variable "subnet_cidr_tokyo" { description = "東京リヌゞョンのサブネット範囲" type = string default = "10.0.0.0/24" } variable "subnet_cidr_osaka" { description = "倧阪リヌゞョンのサブネット範囲" type = string default = "10.0.10.0/24" } variable "subnet_cidr_soul" { description = "゜りルリヌゞョンのサブネット範囲" type = string default = "172.16.0.0/24" } ############################################## # ipアドレス # ############################################## variable "internal_ip_tokyo" { description = "東京リヌゞョンのむンスタンス内郚IPアドレス" type = string default = "10.0.0.10" } variable "internal_ip_osaka" { description = "倧阪リヌゞョンのむンスタンス内郚IPアドレス" type = string default = "10.0.10.10" } variable "internal_ip_soul" { description = "゜りルリヌゞョンのむンスタンス内郚IPアドレス" type = string default = "172.16.0.10" } variable "internal_ip_range_vpc_a" { description = "project-aの内郚IPアドレス範囲" type = string default = "172.16.0.0/24" } variable "iap_ip_range" { description = "IAP甚のIPアドレス範囲" type = string default = "35.235.240.0/20" } ############################################## # むンスタンス # ############################################## variable "instance_os" { description = "OSむメヌゞ" type = string default = "debian-cloud/debian-11" } variable "instance_type" { description = "むンスタンスタむプ" type = string default = "e2-micro" } G-gen 線集郚 (蚘事䞀芧) 株匏䌚瀟G-genは、サヌバヌワヌクスグルヌプずしお「クラりドで、䞖界を、もっず、はたらきやすく」をビゞョンに掲げ、クラりドの導入から最適化たでを支揎しおいる Google Cloud 専業のクラりドむンテグレヌタヌです。
G-gen の䜐々朚です。圓蚘事では、Google Cloud (旧称 GCP) が提䟛するメッセヌゞングサヌビスである Cloud Pub/Sub ず、そのクラむアントラむブラリを䜿甚するこずで、継続的に送信されるデヌタメッセヌゞをリアルタむムで凊理する仕組みを実装しおいきたす。 構成 䜿甚するサヌビスの解説 Cloud Pub/Sub Cloud Run jobs Google Kubernetes EngineGKE StreamingPull API ずは Pub/Sub の蚭定 パブリッシャヌの䜜成Cloud Run jobs コンテナむメヌゞの䜜成 䜿甚するコヌド コンテナむメヌゞのビルド ゞョブの䜜成 サブスクラむバヌの䜜成GKE コンテナむメヌゞの䜜成 䜿甚するコヌド コンテナむメヌゞを Artifact Registry にプッシュ GKE クラスタの䜜成 Workload Identity の蚭定 GSA の䜜成 GKE クラスタに ServiceAccount リ゜ヌスを䜜成 KSA ず GSA の玐付け アプリケヌションのデプロむGKE 動䜜確認 ゞョブの実行Cloud Run jobs Pod のログを確認GKE 構成 今回は Cloud Run jobs をパブリッシャヌずしお、 Pub/Sub トピック にメッセヌゞを送信するゞョブを䞊列しお実行する、ずいう構成を怜蚌したす。 GKE クラスタ䞊に展開した Pod をサブスクラむバヌずし、Pub/Sub の API である StreamingPull API を䜿甚するこずで、Pub/Sub に送信されたメッセヌゞをリアルタむムで受信・凊理したす。 Pub/SubずGKEを䜿甚したストリヌミング凊理 䜿甚するサヌビスの解説 Cloud Pub/Sub Cloud Pub/Sub以䞋、Pub/Subは、メッセヌゞを生成する パブリッシャヌ ずそれを凊理する サブスクラむバヌコンシュヌマヌ を切り離すマネヌゞドな メッセヌゞング サヌビス です。 Pub/Sub を䜿甚するこずで、パブリッシャヌずサブスクラむバヌの互換性・拡匵性が担保された粗結合なシステムを構成するこずができたす。 参考 公匏ドキュメント Cloud Run jobs Cloud Run jobs ずは、サヌバヌレス コンテナコンピュヌティングサヌビスである Cloud Run の 1 機胜です。 Cloud Run jobs を䜿甚するこずで、コンテナむメヌゞずしお実装したゞョブを、手動、スケゞュヌル、ワヌクフロヌによる任意タむミングで䞊列しお実行するこずができたす。 Cloud Run jobs の詳现に぀いおは以䞋の蚘事で解説しおいたす。 blog.g-gen.co.jp Google Kubernetes EngineGKE Google Kubernetes Engine以䞋、GKEは、コンテナ オヌケストレヌションツヌルである Kubernetes の Google マネヌゞドなクラスタを利甚するこずができるサヌビスです。 GKE の詳现に぀いおは以䞋の蚘事で解説しおいたす。 blog.g-gen.co.jp StreamingPull API ずは Pub/Sub クラむアントラむブラリで StreamingPull API を䜿甚するず、アプリケヌションず Pub/Sub ずの間に氞続的な双方向接続が維持され、Pub/Sub でメッセヌゞが利甚可胜になるずすぐに pull されたす。 この仕様により、1 ぀の pull リク゚ストで 1 ぀の pull レスポンスが返る通垞の 単項 Pull ず比范するず、高スルヌプット・䜎レむテンシでメッセヌゞを凊理するこずができたす。 StreamingPull API は以䞋の蚀語のクラむアントラむブラリで䜿甚するこずができたす。 C++ C# Go圓蚘事で䜿甚 Java Node.js Python Ruby Pub/Sub のクラむアントラむブラリは䞊蚘蚀語のほか PHP でも利甚できたすが、StreamingPull API に぀いおは PHP ではサポヌトされおいたせん。 参考 StreamingPull API Pub/Sub の蚭定 Pub/Sub のトピックずサブスクリプションをそれぞれデフォルトの状態で䜜成したす。 トピック名、サブスクリプション名は埌ほど環境倉数で䜿甚したす。 # Pub/Subトピックの䜜成 $ gcloud pubsub topics create {トピック名} # 実行䟋 $ gcloud pubsub topics create mytopic # Pub/Subサブスクリプションの䜜成 $ gcloud pubsub subscriptions create {サブスクリプション名} --topic={トピック名} # 実行䟋 $ gcloud pubsub subscriptions create mysubscription --topic=mytopic パブリッシャヌの䜜成Cloud Run jobs Pub/Sub にメッセヌゞをパブリッシュするゞョブを Cloud Run jobs で䜜成したす。 コンテナむメヌゞの䜜成 䜿甚するコヌド 圓蚘事では 公匏ドキュメント のサンプルコヌドを参考に、Go 蚀語で凊理を実装しおいきたす。 メッセヌゞのパブリッシュには Pub/Sub のクラむアントラむブラリである cloud.google.com/go/pubsub を䜿甚したす。 package main import ( "context" "fmt" "log" "os" "time" "cloud.google.com/go/pubsub" // Pub/Subクラむアントラむブラリ "github.com/google/uuid" ) type Attributes struct { taskNum string uuid string creationTime string } // メッセヌゞの内容を生成する関数 func generateAttributes() Attributes { // タスク番号を取埗Cloud Run jobsのデフォルトの環境倉数 taskNum := os.Getenv( "CLOUD_RUN_TASK_INDEX" ) attr := Attributes{ taskNum: taskNum, uuid: fmt.Sprint(uuid.New()), creationTime: time.Now().Format( "2006-01-02 15:04:05" ), } return attr } // メッセヌゞをパブリッシュする関数 func publishMessage(c context.Context, attr Attributes) error { // 環境倉数からプロゞェクトIDずPubSubトピックID を取埗 projectId := os.Getenv( "PROJECT_ID" ) topicId := os.Getenv( "TOPIC_ID" ) // クラむアント䜜成 client, err := pubsub.NewClient(c, projectId) if err != nil { return fmt.Errorf( "pubsub.NewClient: %v" , err) } defer client.Close() // Pub/Sub トピックの参照 t := client.Topic(topicId) // トピックにメッセヌゞをパブリッシュ result := t.Publish(c, &pubsub.Message{ Attributes: map [ string ] string { "taskNum" : attr.taskNum, "uuid" : attr.uuid, "creationTime" : attr.creationTime, }}) id, err := result.Get(c) if err != nil { return fmt.Errorf( "result.Get: %v" , err) } fmt.Printf( "Published a messsage; msg ID: %v \n " , id) return nil } func main() { // 空のコンテキストを䜜成 ctx := context.Background() // メッセヌゞ内容の生成 attr := generateAttributes() // メッセヌゞのパブリッシュ err := publishMessage(ctx, attr) if err != nil { log.Fatal(err) } } コンテナむメヌゞのビルド ここでは Dockerfile を䜿甚せず、Buildpack を䜿甚しおコンテナむメヌゞをビルドしたす。 Buildpack を䜿甚するこずで、゜ヌスコヌドを自動でパッケヌゞ化し、デプロむ可胜なコンテナむメヌゞを生成するこずができたす。 コンテナむメヌゞは Artifact Registry のリポゞトリにプッシュしたすリポゞトリがない堎合は䜜成しおください。 # Buildpackを䜿甚しおむメヌゞをビルドする $ gcloud builds submit --pack image={リポゞトリのURL}/{コンテナむメヌゞ名} # 実行䟋リポゞトリにArtifact Registryを䜿甚 $ gcloud builds submit --pack image=asia-northeast1-docker.pkg.dev/myproject/pubsub-container/pubsub-publisher 参考① Google Cloud の Buildpack 参考② Cloud Run で Go ゞョブをビルドしお䜜成する ゞョブの䜜成 コンテナむメヌゞを䜿甚しお Cloud Run jobs でゞョブを䜜成したす。 環境倉数ずしお プロゞェクトID ず トピック名 を蚭定し、同時に実行する Task の数を 50 に蚭定しおいたす。 # Cloud Run jobsのゞョブを䜜成する実行Task数=50 $ gcloud run jobs create {ゞョブ名} \ --image {むメヌゞのURL} \ --region {リヌゞョン} \ --tasks 50 \ --set-env-vars PROJECT_ID={プロゞェクトID},TOPIC_ID={トピック名} # 実行䟋 $ gcloud run jobs create jobs-pubsub-publisher \ --image asia-northeast1-docker.pkg.dev/myproject/pubsub-container/pubsub-publisher \ --region asia-northeast1 \ --tasks 50 \ --set-env-vars PROJECT_ID=myproject,TOPIC_ID=mytopic 圓蚘事では認蚌にデフォルトのサヌビスアカりントを䜿甚したす。サヌビスアカりントを個別に蚭定する堎合、トピックに察する「Pub/Sub パブリッシャヌ roles/pubsub.publisher 」ロヌルが玐付いたサヌビスアカりントを䜿甚しおください。 サブスクラむバヌの䜜成GKE Pub/Sub からメッセヌゞを Pull するアプリケヌションを GKE クラスタにデプロむしたす。 コンテナむメヌゞの䜜成 䜿甚するコヌド 公匏ドキュメント のサンプルコヌドを参考に、こちらも Go 蚀語で凊理を実装しおいきたす。 パブリッシュの凊理ず同様に cloud.google.com/go/pubsub ラむブラリを䜿甚し、メッセヌゞをストリヌミングで Pull するようにコヌドを蚘述したす。 ここでは怜蚌のため、Pull したメッセヌゞはそのたた暙準出力に出力したす。 package main import ( "context" "fmt" "io" "log" "os" "cloud.google.com/go/pubsub" // Pub/Subクラむアントラむブラリ ) // メッセヌゞをStreamingPullする関数 func pullMessages(w io.Writer , c context.Context, projectId, subId string ) error { // クラむアント䜜成 client, err := pubsub.NewClient(c, projectId) if err != nil { return fmt.Errorf( "pubsub.NewClient: %v" , err) } defer client.Close() // サブスクリプションの参照 sub := client.Subscription(subId) // メッセヌゞをpullし続ける err = sub.Receive(c, func (_ context.Context, msg *pubsub.Message) { fmt.Fprintf(w, "%v \n " , msg.Attributes) // メッセヌゞを暙準出力に出力 msg.Ack() }) if err != nil { return fmt.Errorf( "sub.Receive: %v" , err) } return nil } func main() { // 空のコンテキスト䜜成 ctx := context.Background() // プロゞェクトID ず PubSubトピックID を取埗 projectId := os.Getenv( "PROJECT_ID" ) subId := os.Getenv( "SUBSCRIPTION_ID" ) err := pullMessages(os.Stdout, ctx, projectId, subId) if err != nil { log.Fatal(err) } } コンテナむメヌゞを Artifact Registry にプッシュ アプリケヌションを GKE にデプロむするために、コンテナむメヌゞを䜜成したす。 以䞋の Dockerfile を䜿甚したす。 FROM golang:1.20 WORKDIR /usr/src/app COPY go.mod go.sum main.go ./ RUN go mod download && go mod verify RUN go build -v -o /usr/local/bin/app ./... CMD ["app"] Cloud Build を䜿甚し、ビルドしたコンテナむメヌゞを Artifact Registry のリポゞトリにプッシュしたす。 # コンテナむメヌゞ $ gcloud builds submit --tag={リポゞトリのURL}/{コンテナむメヌゞ名} # 実行䟋 $ gcloud builds submit --tag=asia-northeast1-docker.pkg.dev/myproject/pubsub-container/pubsub-subscriber GKE クラスタの䜜成 圓蚘事では Autopilot モヌドの GKE クラスタを䜿甚したす。 # AutopilotモヌドのGKEクラスタを䜜成する $ gcloud container clusters create-auto {クラスタ名} \ --region {リヌゞョン} \ --network {VPC名} --subnetwork {サブネット名} # 実行䟋 $ gcloud container clusters create-auto mycluster-autopilot \ --region asia-northeast1 \ --network myvpc \ --subnetwork mysubnet Workload Identity の蚭定 アプリケヌションが Pub/Sub からメッセヌゞを Pull できるように、Workload Identity によっお Pod から IAM サヌビスアカりントを䜿甚できるようにしたす。 圓蚘事では䟿宜䞊、Google Cloud APIs にアクセスするためのサヌビスアカりントを GSA 、Kubernetes の ServiceAccount リ゜ヌスを KSA ず呌びたす。 GSA の䜜成 Pub/Sub に察するアクセス暩限を持った GSA を䜜成したす。 # GSA を䜜成する $ gcloud iam service-accounts create {GSAの名前} --project {プロゞェクトID} # 実行䟋 $ gcloud iam service-accounts create my-gsa --project myproject 䜜成した Pub/Sub サブスクリプションからメッセヌゞを Pull できるように、「Pub/Sub サブスクラむバヌ roles/pubsub.subscriber 」を付䞎したす。 # GSA に IAM ロヌルを玐付ける $ gcloud pubsub subscriptions add-iam-policy-binding {サブスクリプション名} \ --role "roles/pubsub.subscriber" \ --member "serviceAccount:{GSAの名前}@{プロゞェクトID}.iam.gserviceaccount.com" # 実行䟋 $ gcloud pubsub subscriptions add-iam-policy-binding mysubscription \ --role "roles/pubsub.subscriber" \ --member "serviceAccount:my-gsa@myproject.iam.gserviceaccount.com" GKE クラスタに ServiceAccount リ゜ヌスを䜜成 以䞋のマニフェストファむルを䜿甚しお、KSA を GKE クラスタに䜜成したす。 apiVersion : v1 kind : ServiceAccount metadata : name : my-ksa annotations : # Workload Identity で玐付ける GSA を指定する iam.gke.io/gcp-service-account : my-gsa@myproject.iam.gserviceaccount.com KSA ず GSA の玐付け GSA に察する Workload Identity User (roles/iam.workloadIdentityUser)  ロヌルを KSA に玐付け、KSA が GSA の暩限を借甚できるようにしたす。 # KSA ず GSA を玐付ける $ gcloud iam service-accounts add-iam-policy-binding {GSAの名前}@{プロゞェクトID}.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:{プロゞェクトID}.svc.id.goog[{KSAを䜜成したNamespace}/{KSAの名前}]" # 実行䟋default名前空間を䜿甚しおいる堎合 $ gcloud iam service-accounts add-iam-policy-binding my-gsa@myproject.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:myproject.svc.id.goog[default/my-ksa]" アプリケヌションのデプロむGKE 以䞋のマニフェストを䜿甚しお、GKE クラスタにアプリケヌションをデプロむしたす。 耇数の Pod を䜿甚しおメッセヌゞを Pull できるように Deployment リ゜ヌスを䜜成したす。 apiVersion : apps/v1 kind : Deployment metadata : name : pubsub-subscriber spec : replicas : 3 selector : matchLabels : app : subscriber template : metadata : labels : app : subscriber spec : containers : - name : subsc-container image : "asia-northeast1-docker.pkg.dev/myproject/pubsub-container/pubsub-subscriber:latest" # コンテナむメヌゞのURL env : - name : "PROJECT_ID" value : "myproject" # Pub/Subを䜜成したプロゞェクトのID - name : "SUBSCRIPTION_ID" value : "mysubscription" # Pub/Subサブスクリプションの名前 serviceAccountName : my-ksa # Workload Identityで䜿甚するServiceAccount Pod のステヌタスがすべお Running になるたで埅機したす。 # Podのステヌタスを確認する $ kubectl get po NAME READY STATUS RESTARTS AGE pubsub-subscriber-555ffcb5df-fxm2z 1/1 Running 0 3m3s pubsub-subscriber-555ffcb5df-sz4xl 1/1 Running 0 3m3s pubsub-subscriber-555ffcb5df-xmrr2 1/1 Running 0 3m3s 動䜜確認 ゞョブの実行Cloud Run jobs Cloud Run jobs のゞョブを実行し、Pub/Sub にメッセヌゞをパブリッシュしたす。 # ゞョブを実行する $ gcloud run jobs execute {ゞョブ名} --region {リヌゞョン} # 実行䟋 $ gcloud run jobs execute jobs-pubsub-publisher --region asia-northeast1 Pod のログを確認GKE kubectl logs コマンドで Pod のログを確認するず、Cloud Run jobs のゞョブがパブリッシュしたメッセヌゞが蚘録されおいたす。 耇数の Pod を展開しおいるため、Pod ごずにメッセヌゞが分散凊理されおいたす。 # Podのログを確認する $ kubectl logs {Pod名} # 実行䟋 $ kubectl logs pubsub-subscriber-555ffcb5df-fxm2z map[creationTime:2023-05-03 15:15:49 taskNum:35 uuid:c38275b5-da20-4527-9e28-cec2744f6374] map[creationTime:2023-05-03 15:15:49 taskNum:2 uuid:f5ab93a7-6a93-4637-b50e-ee491cdfcc8d] map[creationTime:2023-05-03 15:15:49 taskNum:30 uuid:e82aa1ef-c53b-4812-a3a3-e74437b436ef] map[creationTime:2023-05-03 15:15:49 taskNum:23 uuid:8bc9d8c0-cc4d-49d8-b565-c3e26570c92c] map[creationTime:2023-05-03 15:15:50 taskNum:39 uuid:1594b54e-2ed0-4a2e-b248-6613677c4cf3] map[creationTime:2023-05-03 15:15:49 taskNum:21 uuid:b81177da-d6de-4ee2-acb9-bf1442286cd5] map[creationTime:2023-05-03 15:15:50 taskNum:31 uuid:c4950a18-5fba-4a8c-aae1-6c628db22c65] map[creationTime:2023-05-03 15:15:50 taskNum:49 uuid:20b3ca60-8a83-4116-ab54-a26e187bd8d0] map[creationTime:2023-05-03 15:15:50 taskNum:16 uuid:ede7ab24-d246-485f-8bcb-2a71fcf9e3a5] map[creationTime:2023-05-03 15:15:49 taskNum:48 uuid:166a1bd9-f0ac-4c93-8129-7110b2429f55] map[creationTime:2023-05-03 15:15:50 taskNum:42 uuid:2faa0967-46f6-4a86-84f5-c1e821607c83] map[creationTime:2023-05-03 15:15:52 taskNum:46 uuid:0eea95d7-a673-4e44-b214-ca49dd34be91] $ kubectl logs pubsub-subscriber-555ffcb5df-sz4xl map[creationTime:2023-05-03 15:15:48 taskNum:41 uuid:86be2dd1-196f-4d04-8990-fbd1fa6bc0db] map[creationTime:2023-05-03 15:15:48 taskNum:5 uuid:b0f957d8-e113-451d-ba9e-19dc061b1632] map[creationTime:2023-05-03 15:15:48 taskNum:0 uuid:e3690426-4c7d-4fe8-b927-8a6343f23a54] map[creationTime:2023-05-03 15:15:49 taskNum:18 uuid:760c5c63-d41f-4d78-b2fe-9d839d872859] map[creationTime:2023-05-03 15:15:49 taskNum:12 uuid:dbfdab23-687e-4dce-9ae9-8c775e88d873] map[creationTime:2023-05-03 15:15:48 taskNum:17 uuid:f13c4842-5503-4e0b-a91b-57879563448b] map[creationTime:2023-05-03 15:15:49 taskNum:33 uuid:f307f4f9-4735-4abd-8232-b2793f6dd08c] map[creationTime:2023-05-03 15:15:49 taskNum:1 uuid:e5f5a0d2-7430-4816-8a24-4bc0464c1c9c] map[creationTime:2023-05-03 15:15:49 taskNum:44 uuid:9d23a4f4-4c3e-40b9-be85-ea191936ecb6] map[creationTime:2023-05-03 15:15:48 taskNum:14 uuid:5389088c-0452-46a2-ba96-255f79404741] map[creationTime:2023-05-03 15:15:48 taskNum:32 uuid:171f0b3a-a19f-4574-b75d-87ddf30e9b7f] map[creationTime:2023-05-03 15:15:48 taskNum:47 uuid:6cc0f34c-d9ac-4ab9-8308-45c21a7c1c52] map[creationTime:2023-05-03 15:15:49 taskNum:24 uuid:9fef79ac-a637-451f-9c3c-5ddbfd99631d] map[creationTime:2023-05-03 15:15:50 taskNum:40 uuid:8ac572b6-e02a-4505-b7bf-d491410f28e3] map[creationTime:2023-05-03 15:15:51 taskNum:19 uuid:59f52dc0-56e5-4780-a6ac-8e0b9d0ffad8] map[creationTime:2023-05-03 15:15:51 taskNum:28 uuid:6cf456b1-b234-4847-a8f7-7ee8c6e06c97] map[creationTime:2023-05-03 15:15:51 taskNum:37 uuid:cad50885-e41e-4d97-ae99-24c92507cfcf] map[creationTime:2023-05-03 15:15:51 taskNum:25 uuid:54fc2bec-c510-4ed4-a247-64a1141dd1e0] map[creationTime:2023-05-03 15:15:51 taskNum:7 uuid:1ee32849-261a-4e2e-82d8-04426675b88b] map[creationTime:2023-05-03 15:15:50 taskNum:15 uuid:bae917a3-01e5-4c20-b678-6f21bfe878e2] map[creationTime:2023-05-03 15:15:50 taskNum:27 uuid:d6a5a28f-4e24-460f-8d09-5f79af09f74c] map[creationTime:2023-05-03 15:15:51 taskNum:43 uuid:f873af32-edc5-45fc-9752-3f87cc3309e1] map[creationTime:2023-05-03 15:15:51 taskNum:10 uuid:120f48fb-3377-4896-9cb2-a32dfe00f25b] $ kubectl logs pubsub-subscriber-555ffcb5df-xmrr2 map[creationTime:2023-05-03 15:15:49 taskNum:26 uuid:39cbb823-592c-40e9-99cb-bf3ce52f2989] map[creationTime:2023-05-03 15:15:48 taskNum:38 uuid:447a296c-564d-4dc9-a04a-155f67c760e9] map[creationTime:2023-05-03 15:15:49 taskNum:11 uuid:0989fe2c-2fc0-4668-95d6-b1829fa6d92d] map[creationTime:2023-05-03 15:15:48 taskNum:29 uuid:db6e7299-47d8-473d-aebb-e18f2c846de6] map[creationTime:2023-05-03 15:15:49 taskNum:8 uuid:501f74cf-ccb8-4b1e-b388-32f565da889d] map[creationTime:2023-05-03 15:15:49 taskNum:6 uuid:108e22df-629d-4d88-9ab0-5758f608237f] map[creationTime:2023-05-03 15:15:49 taskNum:36 uuid:6e85faa5-d2ed-48b6-8866-d0114386303c] map[creationTime:2023-05-03 15:15:49 taskNum:20 uuid:aa07a78a-e478-4df7-9fef-835e215bc2ee] map[creationTime:2023-05-03 15:15:49 taskNum:45 uuid:4a43bad3-5a3d-4315-a565-ca7137104aa8] map[creationTime:2023-05-03 15:15:49 taskNum:9 uuid:f3f4c132-80ff-4850-8bea-94371b9cdfe5] map[creationTime:2023-05-03 15:15:50 taskNum:34 uuid:d026ad8e-f1cb-49df-bd33-9cf03cb0ee55] map[creationTime:2023-05-03 15:15:50 taskNum:13 uuid:f6731fca-d48b-41d7-a505-61e44425d817] map[creationTime:2023-05-03 15:15:51 taskNum:22 uuid:6ade1f2a-229b-4664-bf82-55aec79ba8fa] map[creationTime:2023-05-03 15:15:49 taskNum:3 uuid:95291f1f-94d3-44bb-a22c-97bfdd59fa25] map[creationTime:2023-05-03 15:15:51 taskNum:4 uuid:469e54b9-de42-4fb2-9c38-3f5c3b625d7b] 䜐々朚 駿倪 (蚘事䞀芧) G-gen 最北端、北海道圚䜏のクラりド゜リュヌション郚゚ンゞニア。 2022 幎 6 月に G-gen にゞョむン。Google Cloud All Certifications Engineer。 奜きな Google Cloud プロダクトは Cloud Run。最近は Dataflow を勉匷䞭。 Follow @sasashun0805
G-gen の杉村です。Compute Engine の VM で Squid 等の HTTP プロキシサヌバ経由でむンタヌネットぞ出るような構成を取った際、gcloud コマンドが䞍可解な゚ラヌメッセヌゞず共に倱敗したした。今回はその事象ず、解決方法をご玹介したす。 事象 やろうずしたこず ゚ラヌメッセヌゞ 前提知識 VM ずプロキシサヌバに぀いお サヌビスアカりントず VM 原因調査 サヌビスアカりントは認識できおいる ゚ラヌメッセヌゞ内の URL メタデヌタサヌバはロヌカルからのみク゚リできる 解決策 さらに深堀り curl でメタデヌタサヌバぞク゚リしおみる プロキシ経由でメタデヌタサヌバぞク゚リしおみる 事象 やろうずしたこず ある Compute Engine の Linux VM がありたす。この VM のログむンナヌザのプロファむルでは HTTP_PROXY および HTTPS_PROXY 環境倉数を蚭定しおおり、他の VM 䞊で動䜜するプロキシサヌバ (Squid) 経由でむンタヌネットぞ出られるようになっおいたす。 この Linux VM にログむンし、 gcloud storage コマンドを実行しようずしたした。なお認蚌情報ずしお VM にアタッチされおいるサヌビスアカりントを利甚する想定です。 ゚ラヌメッセヌゞ この環境で gcloud storage ls gs://my-test-bucket を実行したした。 するず、以䞋のような゚ラヌメッセヌゞが出力され、コマンドが倱敗したした。※バケット名やサヌビスアカりント名などは仮の倀に眮き換えおありたす。 $ gcloud storage ls gs://my-test-bucket ERROR: ( gcloud.storage. ls ) There was a problem refreshing your current auth tokens: ( ' Failed to retrieve http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/1234567890-compute@developer.gserviceaccount.com/?recursive=true from the Google Compute Engine metadata service. Status: 403 Response:\nb\ '<! DOCTYPE html > \\n < html lang =en > \\n < meta charset =utf - 8> \\n < meta name =viewport content = " initial-scale=1, minimum-scale=1, width=device-width "> \\n < title > Error 403 ( Forbidden ) !! 1 < /title > \\n < style > \\n *{margin:0 ; padding:0}html,code{font:15px/22px arial,sans-serif}html{background: #fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:54px;width:150px}\\n </style>\\n <a href=//www.google.com/><span id=logo aria-label=Google></span></a>\\n <p><b>403.</b> <ins>That\\xe2\\x80\\x99s an error.</ins>\\n <p>Your client does not have permission to get URL <code>/computeMetadata/v1/instance/service-accounts/1234567890-compute@developer.gserviceaccount.com/?recursive=true</code> from this server. <ins>That\\xe2\\x80\\x99s all we know.</ins>\\n\'', <google.auth.transport.requests._Response object at 0x7f0701657970>) Please run: $ gcloud auth login to obtain new credentials. If you have already logged in with a different account: $ gcloud config set account ACCOUNT to select an already authenticated account to use. 䞊蚘コヌドブロックだず改行がなく読みづらいのず、蚘号が゚ンコヌドされおしたっおいるので、以䞋に芁所だけ抜き出しお敎圢したメッセヌゞを蚘茉したす。 ERROR: (gcloud.storage.ls) There was a problem refreshing your current auth tokens: ('Failed to retrieve http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/1234567890-compute@developer.gserviceaccount.com/?recursive=true from the Google Compute Engine metadata service. Status: 403 403. That's an error. Your client does not have permission to get URL /computeMetadata/v1/instance/service-accounts/1234567890-compute@developer.gserviceaccount.com/?recursive=true from this server. That's all we know. Please run: $ gcloud auth login to obtain new credentials. If you have already logged in with a different account: $ gcloud config set account ACCOUNT to select an already authenticated account to use. There was a problem refreshing your current auth tokens ... や Your client does not have permission to get URL ...ずいうメッセヌゞから想像するに、認蚌情報に関連する゚ラヌメッセヌゞのようです。 蚭定を確認したずころ、VM には正しくサヌビスアカりントがアタッチされおおり、たたサヌビスアカりントは適切に IAM ロヌルが付䞎されおいたす。VM の アクセススコヌプ蚭定 も適切でした。 たた Please run: $ gcloud auth login ずありたすが、このコマンドは gcloud コマンドに明瀺的に Google アカりントの認蚌情報を蚭定するコマンドであり、今回は VM にアタッチしたサヌビスアカりントを䜿いたいため、芁件ず合わなくなっおしたいたす。 前提知識 VM ずプロキシサヌバに぀いお 今回の事象を理解するためには、前提ずなる環境を理解する必芁がありたす。 Compute Engine VM からむンタヌネットに出るには、いく぀かの方法がありたす。 VM のパブリック IP アドレスを䜿っお VPC の Default Internet Gateway から盎接むンタヌネットぞ出る パブリック IP アドレスを持たない VM から Cloud NAT 経由でむンタヌネットぞ出る パブリック IP アドレスを持たない VM から HTTP プロキシサヌバ経由でむンタヌネットぞ出る このうち 3. のプロキシサヌバを䜿う堎合、以䞋のような方法でプロキシサヌバの宛先を蚭定するこずになりたす。 (Linux の堎合) HTTP_PROXY / HTTPS_PROXY 環境倉数を蚭定する (Windows の堎合) コントロヌルパネルのむンタヌネットオプションで蚭定する アプリケヌション固有の蚭定でプロキシサヌバを指定する 今回の事象は Linux サヌバで起きおおり、䞊蚘のうち HTTP_PROXY / HTTPS_PROXY 環境倉数を䜿甚する方法でプロキシサヌバを指定しおいたす。たた gcloud コマンドは、これらの環境倉数が蚭定されおいる堎合は、倉数の内容を読み取っおプロキシサヌバを利甚しおくれる仕様ずなっおいたす。 サヌビスアカりントず VM サヌビスアカりント ずは、Google Cloud で管理されるアカりントの䞀皮です。 サヌビスアカりントは人間が䜿う Google アカりントずは区別され、プログラムが Google API や Google Cloud API を呌び出すために甚いるアカりントを指したす。 Compute Engine の VM にはそのサヌビスアカりントをアタッチ (日本語ドキュメントでは “接続” ず衚珟) するこずができたす。 参考 : サヌビス アカりントずむンスタンスの接続 サヌビスアカりントをアタッチするず、VM 䞊で動䜜する gcloud 等のプログラムは、そのサヌビスアカりントの暩限を䜿っお各皮 Google Cloud サヌビスの API を実行するこずができたす。Google アカりントを䜿っお認蚌したり、サヌビスアカりントキヌをダりンロヌドする必芁はありたせん。 䜙談ですが Amazon Web Services (AWS) でも「EC2 むンスタンスぞの IAM ロヌルのアタッチ」ずいうよく䌌た抂念が存圚しおいたす。 原因調査 サヌビスアカりントは認識できおいる ゚ラヌメッセヌゞには以䞋の文蚀が含たれおいたす。 Your client does not have permission to get URL /computeMetadata/v1/instance/service-accounts/1234567890-compute@developer.gserviceaccount.com/?recursive=true from this server. 1234567890-compute@developer.gserviceaccount.com はこの VM にアタッチされおいるサヌビスアカりント名であり、VM の䞭からはサヌビスアカりントの名称は正しく認識できおいるこずが分かりたす。 それにも関わらず「認蚌情報が埗られおいない」ような゚ラヌメッセヌゞが出力されおいるこずになりたす。 ゚ラヌメッセヌゞ内の URL ヒントは、匕甚した䞊蚘メッセヌゞにありたした。 /computeMetadata で始たる URL に泚目したす。 Cloud SDK は、前述のように ADC (Application Default Credentials) の仕組みにより認蚌情報を探したす。 今回の実行時は GOOGLE_APPLICATION_CREDENTIALS 環境倉数に認蚌情報を蚭定しおおらず、gcloud コマンドにも認蚌情報を蚭定しおいなかったため、VM にアタッチされたサヌビスアカりントぞ認蚌情報を取りにいきたす。 実は gcloud 等が VM のサヌビスアカりントから認蚌情報を取埗するずきは、VM の メタデヌタサヌバ ずいうサヌバぞ HTTP リク゚ストを投げるこずで認蚌情報を取埗する仕様です。 参考 : 接続されたサヌビス アカりント メタデヌタサヌバは http://metadata.google.internal/ ずいう URL であり、これを VM 䞊で名前解決するず 169.254.169.254 ずいうリンクロヌカル IP アドレスぞ解決されたす (hosts ファむルで静的に指定されおいる)。 このメタデヌタサヌバ (169.254.169.254) は VM のロヌカルからのみアクセス可胜な特殊なサヌバずなっおおり、我々ナヌザも curl コマンドなどを甚いお VM 内からリク゚ストするこずで、VM やプロゞェクトの情報を埗るこずができたす。 参考 : VM メタデヌタにク゚リを実行する 改めお゚ラヌの1行目を芋おみるず以䞋のようになっおいたす。 ERROR: (gcloud.storage.ls) There was a problem refreshing your current auth tokens: ('Failed to retrieve http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/1234567890-compute@developer.gserviceaccount.com/?recursive=true from the Google Compute Engine metadata service. 前述の゚ラヌメッセヌゞず合わせお芋おみおも、どうもこのメタデヌタサヌバぞのク゚リが倱敗しおいる ( Your client does not have permission ) らしいこずが分かりたす。 メタデヌタサヌバはロヌカルからのみク゚リできる 実は、VM のメタデヌタサヌバぞは、その VM の ロヌカルからしかアクセスできない ずいう制限がありたす。プロキシサヌバ等、他のノヌドを経由しおメタデヌタサヌバぞアクセスしようずするず、セキュリティ䞊の理由から拒吊されたす。 今回利甚しようずしおいたプロキシサヌバ (Squid) のアクセスログを芋おみるず、以䞋のように、圓該 VM からメタデヌタサヌバぞ プロキシ経由で接続しようず しおいたした。 1671421064 . 582 1 10 . 146 .x.x TCP_MISS/ 403 2037 GET http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/1234567890-compute@developer.gserviceaccount.com/? - HIER_DIRECT/ 169 . 254 . 169 . 254 text/html 本来ロヌカルでルヌティングされるべき 169.254.169.254 ぞのリク゚ストがプロキシ経由でリク゚ストされおしたっおいたのです。 今回はプロキシサヌバも Compute Engine VM でしたが、ロヌカルからのアクセスではないためメタデヌタサヌバ偎で匟かれおいたした。なおプロキシサヌバがオンプレミスであれば、169.254.169.254 は HTTP レスポンスを受け付けないはずなので、タむムアりト等になるかもしれたせん。 解決策 以䞋のように NO_PROXY 環境倉数を蚭定し「プロキシぞフォワヌドしない IP アドレス/ドメむン名䞀芧」を定矩しおあげたす。 $ export NO_PROXY = 127 . 0 . 0 . 1 ,localhost, 169 . 254 . 169 . 254 ,metadata,metadata.google.internal これにより localhost (127.0.0.1) や metadata.google.internal (169.254.169.254) ぞの HTTP リク゚ストはプロキシサヌバに転送されなくなり、ロヌカルから盎接リク゚ストされるようになりたす。 䞊蚘を蚭定したずころ、以䞋のように正しく gcloud コマンドが䜿えるようになりたした。 $ gcloud storage ls gs://my-test-bucket gs://my-test-bucket/my-private-obj-01.txt gs://my-test-bucket/my-private-obj-02.txt さらに深堀り curl でメタデヌタサヌバぞク゚リしおみる メタデヌタサヌバの挙動を理解するために、curl コマンドを䜿い手動でメタデヌタサヌバをク゚リしおみたす。 curl コマンドは HTTP_PROXY / HTTPS_PROXY / NO_PROXY 環境倉数に圱響を受けたせん。代わりに -x オプションで明瀺的にプロキシサヌバを指定できたす。 たずは以䞋のように、プロキシを䜿わずにメタデヌタをク゚リしおみたす。 metadata.google.internal は hosts ファむルにより 169.254.169.254 に解決され、メタデヌタサヌバぞルヌトされたす。 $ curl -v -H ' Metadata-Flavor:Google ' http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/1234567890-compute@developer.gserviceaccount.com/email * Trying 169 . 254 . 169 .254:80... * Connected to metadata.google.internal ( 169 . 254 . 169 . 254 ) port 80 ( #0) > GET /computeMetadata/v1/instance/service-accounts/1234567890-compute@developer.gserviceaccount.com/email HTTP/ 1 . 1 > Host: metadata.google.internal > User-Agent: curl/ 7 . 74 . 0 > Accept: */* > Metadata-Flavor:Google > * Mark bundle as not supporting multiuse < HTTP/ 1 . 1 200 OK < Metadata-Flavor: Google < Content-Type: application/text < ETag: ae98be0f811e76b9 < Date: Mon, 19 Dec 2022 23:23:36 GMT < Server: Metadata Server for VM < Content-Length: 48 < X-XSS-Protection: 0 < X-Frame-Options: SAMEORIGIN < * Connection #0 to host metadata.google.internal left intact 1234567890-compute@developer.gserviceaccount.com 䞊蚘のようにメタデヌタサヌバから正しくレスポンスが返っおきたした。 なお -H オプションで Metadata-Flavor:Google を付䞎するのは、メタデヌタをク゚リするための決たりごずであり、必須です。 参考 : VM メタデヌタに぀いお 参考 : VM メタデヌタにク゚リを実行する プロキシ経由でメタデヌタサヌバぞク゚リしおみる 次にオプション -x http://myproxy.local:3128 を指定しお、あえおプロキシ経由でメタデヌタサヌバにク゚リを投げおみたす。 myproxy.local は Squid が動䜜しおいる別の VM です。 $ curl -v -x http://myproxy.local:3128 -H ' Metadata-Flavor:Google ' http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/1234567890-compute@developer.gserviceaccount.com/email * Trying 10 . 146 . 15 .212:3128... * Connected to myproxy. local ( 10 . 146 . 15 . 212 ) port 3128 ( #0) > GET http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/1234567890-compute@developer.gserviceaccount.com/email HTTP/ 1 . 1 > Host: metadata.google.internal > User-Agent: curl/ 7 . 74 . 0 > Accept: */* > Proxy-Connection: Keep-Alive > Metadata-Flavor:Google > * Mark bundle as not supporting multiuse < HTTP/ 1 . 1 403 Forbidden < Metadata-Flavor: Google < Date: Mon, 19 Dec 2022 23:24:18 GMT < Content-Type: text/html ; charset =UTF -8 < Server: Metadata Server for VM < Content-Length: 1678 < X-XSS-Protection: 0 < X-Frame-Options: SAMEORIGIN < X-Cache: MISS from squid < X-Cache-Lookup: MISS from squid:3128 < Via: 1 . 1 squid ( squid/ 4 . 13 ) < Connection: keep-alive < <! DOCTYPE html > < html lang =en > < meta charset =utf -8> < meta name =viewport content = " initial-scale=1, minimum-scale=1, width=device-width "> < title > Error 403 ( Forbidden ) !! 1 < /title > < style > * { margin:0 ; padding:0 } html,code { font:15px/22px arial,sans-serif } html { background: #fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:54px;width:150px} < /style > < a href =//www.google.com/ >< span id =logo aria-label = Google >< /span >< /a > < p >< b > 403 . < /b > < ins > That’s an error. < /ins > < p > Your client does not have permission to get URL < code > /computeMetadata/v1/instance/service-accounts/1234567890-compute@developer.gserviceaccount.com/email < /code > from this server. < ins > That’s all we know. < /ins > * Connection #0 to host myproxy.local left intact 䞊蚘のように Your client does not have permission to get URL <code>/computeMetadata/v1/instance/service-accounts/1234567890-compute@developer.gserviceaccount.com/email</code> from this server. ずいうメッセヌゞが衚瀺されたした。ステヌタスコヌドは 403 Forbidden です。 これは、圓初 gcloud コマンドで出力された゚ラヌメッセヌゞず党く同じです。この怜蚌によっお、今回の事象がよく理解できるのではないでしょうか。 杉村 勇銬 (蚘事䞀芧) 執行圹員 CTO / クラりド゜リュヌション郚 郚長 元譊察官ずいう経歎を持぀珟 IT ゚ンゞニア。クラりド管理・運甚やネットワヌクに知芋。AWS 12資栌、Google Cloud認定資栌11資栌。Twitter では Google Cloud や AWS のアップデヌト情報を぀ぶやいおいたす。 Follow @y_sugi_it
圓蚘事は みずほリサヌチ&テクノロゞヌズ × G-gen ゚ンゞニアコラボレヌション䌁画 で執筆されたものです。 みずほリサヌチ&テクノロゞヌズ株匏䌚瀟の舘山です。本日は Artifact Registry リモヌトリポゞトリ機胜に぀いお、怜蚌した結果を共有したす。 Artifact Registry はじめに 前提知識 Artifact Registryリモヌトリポゞトリ Artifact Registry ずプラむベヌト接続 泚意点 プラむベヌトパッケヌゞずの䜵甚 Cloud Buildプラむベヌトプヌル 怜蚌1. プラむベヌトプヌルでのDockerむメヌゞビルド 怜蚌内容 改修前のビルド構成ファむルずDockerfile ビルド構成ファむル Dockerfile リモヌトリポゞトリの䜜成 Dockerfileずビルド構成ファむルの改修方針 (1) キヌリングによる認蚌を甚いた改修 怜蚌手順 Dockerfile ビルド構成ファむル抜粋 (2) サヌビスアカりントキヌによるパスワヌド認蚌を甚いた改修 怜蚌手順 Dockerfile ビルド構成ファむル ビルド実行埌のリモヌトリポゞトリ 怜蚌2. Cloud Functions 関数のビルド 怜蚌内容 (1) Python関数 (2) Node.js関数 (3) Java関数 はじめに セキュリティ䞊の理由で開発環境からむンタヌネット接続が制限されおいる堎合、Dockerのベヌスむメヌゞやプログラム蚀語パッケヌゞの取埗が課題になりたす。 たた、プロキシサヌバでパブリックリポゞトリぞの通信を単玔に蚱可した堎合、アップロヌドによる情報持ち出しリスクが生じたす。 Artifact Registryリモヌトリポゞトリ機胜を利甚するこずで、むンタヌネット接続が制限されたVPCから間接的に、パブリックリポゞトリぞの読み取り専甚アクセスが可胜になりたす。本蚘事では具䜓的に以䞋 2 ぀のテヌマに぀いおご玹介したす。 むンタヌネット接続が制限された環境で Docker コンテナをビルドできるこず むンタヌネット接続が制限された環境で Cloud Functions をビルドできるこず 泚意点ずしおArtifact Registryリモヌトリポゞトリ機胜は2023/4/3珟圚、正匏リリヌス前のプレビュヌ版です。正匏リリヌスたで本番ワヌクロヌドでの利甚は、掚奚されたせん。 →2023/10/27に GA になりたした。 前提知識 Artifact Registryリモヌトリポゞトリ Artifact Registry ずプラむベヌト接続 Artifact Registry はコンテナむメヌゞず蚀語パッケヌゞを管理するサヌビスです。 むンタヌネット接続が制限されたVPCからArtifact Registryのプラむベヌトリポゞトリには、 限定公開のGoogleアクセス 、 Private Service Connect を利甚したアクセスが可胜です。 参考 : 限定公開の Google アクセスの仕組みず手順をきっちり解説 参考 : Private Service Connect機胜解説。Google Cloud APIにプラむベヌト接続 Artifact Registryの リモヌトリポゞトリ 機胜により、プラむベヌトリポゞトリから間接的に Docker Hub Maven Central npmレゞストリ PyPI に察する読み取り専甚アクセスが可胜になりたす。 Docker Hubを゜ヌスずするリモヌトリポゞトリ 泚意点 珟状、リモヌトリポゞトリではApt、Yumは、未サポヌトです。 OSパッケヌゞに぀いおは、別環境でダりンロヌドしたパッケヌゞを持ち蟌んで、オフラむンむンストヌルする等の代替手段が必芁です。 プラむベヌトパッケヌゞずの䜵甚 Artifact Registryの 暙準リポゞトリ ずリモヌトリポゞトリに察する単䞀のアクセス ポむントを提䟛する、 仮想リポゞトリ 機胜を利甚できたすが、圓蚘事では扱いたせん。 Cloud Buildプラむベヌトプヌル Cloud Build はサヌバレスのビルド実行サヌビスです。 Cloud Buildのデフォルト蚭定では、自由にむンタヌネット接続が可胜なデフォルトプヌルでビルドが実行されたす。 ビルドスクリプトによる倖郚ぞのデヌタ持ち出しを予防するため、 組織ポリシヌでデフォルトプヌルの利甚を制限 し、 パブリックIPアドレスを無効化 した プラむベヌトプヌル でビルドを実行させるこずも可胜です。 参考 : プラむベヌト ネットワヌクで Cloud Build を䜿甚する 参考 : VPC Service Controls を䜿甚する 怜蚌1. プラむベヌトプヌルでのDockerむメヌゞビルド 怜蚌内容 パブリックIPアドレスを無効化したプラむベヌトプヌルで、PythonアプリケヌションのDockerむメヌゞのビルドを実行しおみたした。 むンタヌネット接続が制限された環境でのビルド 改修前のビルド構成ファむルずDockerfile ビルド構成ファむル Cloud Buildのビルド構成ファむルのスキヌマはCloud Buildのガむドを参照しおください。 ビルド構成ファむルのスキヌマ Cloud Buildの各ビルドステップは、Dockerコンテナで実行されたす。 Dockerのビルド甚途に利甚できるDockerむメヌゞはGoogleがContrainer Registry'gcr.io/cloud-builders/docker'で公開しおいたす。 Cloud Buildでビルドした成果物のDockerむメヌゞは、Artifact Registry暙準リポゞトリぞ栌玍したす。 steps: - name: 'gcr.io/cloud-builders/docker' args: [ 'build', '-t', 'asia-northeast1-docker.pkg.dev/poc01-xxxx/gcf-artifacts/test', '.' ] images: - 'asia-northeast1-docker.pkg.dev/poc01-xxxx/gcf-artifacts/test' options: logging: CLOUD_LOGGING_ONLY pool: name: 'projects/poc01-xxxx/locations/asia-northeast1/workerPools/no-external-ip-pool' Dockerfile Docker HubからPythonのベヌスむメヌゞを取埗し、プログラムをCOPYで配眮。PyPIから䟝存ラむブラリを取埗したす。 FROM python: 3.9 -slim ENV APP_HOME / app WORKDIR $APP_HOME COPY . . / # Install production dependencies. RUN pip install -r requirements.txt パブリックIPアドレス無効化したプラむベヌトプヌルでは、Docker HubずPyPIにアクセスできないため、ビルド゚ラヌになりたす。 プラむベヌトプヌルからDocker Hubぞのアクセスがタむムアりト なお、指定するベヌスむメヌゞによっおは、Docker Hubぞのアクセス゚ラヌが発生したせんでした。 cloud-builders/dockerが Container RegistryのDocker Hubむメヌゞキャッシュ を先にチェックしおいるためず思われたす。 リモヌトリポゞトリの䜜成 ガむドの蚘茉に埓いDocker HubずPyPIを゜ヌスずするリモヌトリポゞトリを䜜成したす。 - リモヌト リポゞトリを䜜成する Terraformを利甚する堎合、以䞋のような蚘茉になりたす。 resource "google_artifact_registry_repository" "docker-proxy" { provider = google-beta location = "asia-northeast1" repository_id = "docker-proxy" description = "Docker Hubを゜ヌスずするリモヌトリポゞトリ" format = "DOCKER" mode = "REMOTE_REPOSITORY" remote_repository_config { description = "docker hub" docker_repository { public_repository = "DOCKER_HUB" } } } resource "google_artifact_registry_repository" "pypi-proxy" { provider = google-beta location = "asia-northeast1" repository_id = "pypi-proxy" description = "PyPIを゜ヌスずするリモヌトリポゞトリ" format = "PYTHON" mode = "REMOTE_REPOSITORY" remote_repository_config { description = "pypi" python_repository { public_repository = "PYPI" } } } google-betaプロバむダヌのバヌゞョン4.57.0 (March 13, 2023)以降の利甚が必芁です。 リポゞトリをVPC Service Controlsで保護する堎合、 アップストリヌム゜ヌスぞのアクセス蚱可蚭定 が必芁ですが、2023/4/3珟圚、Terraformで蚭定する方法は芋぀かりたせんでした。 Dockerfileずビルド構成ファむルの改修方針 Artifact RegistryのPythonリポゞトリ認蚌方匏は2぀ありたす。 認蚌方匏によっおDockerfileずビルド構成ファむルの改修内容が異なるため、それぞれの手順を解説したす。 参考 : Pythonキヌリングラむブラリ 参考 : サヌビスアカりントキヌを利甚したパスワヌド認蚌 (1) キヌリングによる認蚌を甚いた改修 怜蚌手順 Artifact RegistryのガむドではPythonキヌリングラむブラリはPyPIからむンストヌルしおいたすが、今回はPyPIに盎接アクセスできない前提のため、キヌリングラむブラリは別環境で事前にダりンロヌドし、゜ヌスず䞀緒にビルド環境ぞ持ち蟌みたす。 ビルド察象のDockerむメヌゞにはラむブラリをCOPY配眮しおオフラむンむンストヌルしたす。 参考サむト オフラむン環境: pipでファむルからpythonパッケヌゞむンストヌル Dockerfile、ビルド構成ファむルを以䞋の様に修正したす。 Dockerfile ベヌスむメヌゞの取埗先をArtifact Registryリモヌトリポゞトリに倉曎したす。 COPYで持ち蟌んだキヌリングラむブラリをオフラむンむンストヌルしたす。 Pythonラむブラリの取埗先をArtifact Registryリモヌトリポゞトリに倉曎したす。 --index-url はrequirements.txt内で指定するこずも可胜です。 # Docker Hubを゜ヌスずするArtifact Registryリモヌトリポゞトリを参照 FROM asia-northeast1-docker .pkg.dev / poc01-xxxx / docker-hub-proxy / python: 3.9 -slim ENV APP_HOME / app WORKDIR $APP_HOME COPY . . / # Artifact Registry認蚌甚キヌリングラむブラリはCOPYで持ち蟌み、オフラむンむンストヌルする RUN pip install -- no-index -- find-links = . / keyring keyring RUN pip install -- no-index -- find-links = . / keyring keyrings. google-artifactregistry-auth # PyPIを゜ヌスするArtifact Registryリモヌトリポゞトリを参照。 # RUNコマンド実行時にデフォルト認蚌情報Cloud Buildサヌビスアカりントを取埗可胜にしおおくため、 # docker buildコマンドのオプションで--network=cloudbuild指定する。 # https://cloud.google.com/build/docs/build-config-file-schema?hl=ja#network RUN pip install -- index-url https: // asia-northeast1-python .pkg.dev / poc01-xxxx / pypi-proxy / simple / -r requirements.txt ビルド構成ファむル抜粋 RUN呜什でビルド察象のコンテナ内でのpipコマンド実行時に、キヌリングラむブラリがCloud Buildサヌビスアカりント認蚌情報を取埗できるように、docker buildコマンドのオプションに --network=cloudbuild を远加したす。 - Cloud Build ネットワヌク steps: - name: 'gcr.io/cloud-builders/docker' args: [ 'build','--network=cloudbuild', '-t', 'asia-northeast1-docker.pkg.dev/poc01-xxxx/gcf-artifacts/test', '.' ] 今回怜蚌しおいたせんが、キヌリングラむブラリは実行環境には䞍芁なので、マルチステヌゞビルドにしお最終的なむメヌゞから陀倖しおもよいでしょう。 (2) サヌビスアカりントキヌによるパスワヌド認蚌を甚いた改修 怜蚌手順 リモヌトリポゞトリ参照のみ可胜な最小暩限のサヌビスアカりントを䜜成し、ガむドの蚘茉に埓いサヌビスアカりントキヌからベヌシック認蚌でリポゞトリぞアクセスするURLを生成したす。 Pyhon:サヌビス アカりント キヌによる認蚌 以䞋のような、ベヌシック認蚌でリポゞトリぞアクセスするURLが取埗できたす。{key}郚分は実際には長倧な文字列になりたす。 https://_json_key_base64:{KEY}@{LOCATION}-python.pkg.dev/{PROJECT}/{REPOSITORY}/simple/ リモヌトリポゞトリ参照のみ可胜な認蚌情報挏掩の圱響は限定的リモヌトリポゞトリをVPC Service Controlsで保護する堎合、倖郚からのアクセス䞍可ですが、今回はベヌシック認蚌のURLをSecret Managerに保持するこずにしたす。 シヌクレットの䜜成方法は、Secret Managerのガむドを参照しおください。 - シヌクレットを䜜成する Dockerfile、ビルド構成ファむルを以䞋の様に修正したす。 Dockerfile ベヌスむメヌゞの取埗先をArtifact Registryリモヌトリポゞトリに倉曎したす。 Pythonラむブラリの取埗先はbuild-arg:PIP_INDEX_URLずしお実行時に指定したす。 # DockerHubを゜ヌスずするArtifact Registryリモヌトリポゞトリを参照 FROM asia-northeast1-docker .pkg.dev / poc01-hn-audit-115243084873 / docker-hub-proxy / python: 3.9 -slim # PyPIを゜ヌスずするArtifact Registryリモヌトリポゞトリをサヌビスアカりントキヌで認蚌するベヌシック認蚌URL ARG PIP_INDEX_URL ENV APP_HOME / app WORKDIR $APP_HOME COPY . . / RUN pip install -- index-url $PIP_INDEX_URL -r requirements.txt ビルド構成ファむル ベヌシック認蚌でリモヌトリポゞトリぞアクセスするURLをSecret Managerから取埗し、docker buildコマンドのbuild-arg:PIP_INDEX_URLに匕き枡したす。 Cloud BuildでのSecret Manager利甚方法はCloud Buildのガむドを参照しおください。 - Secret Manager のシヌクレットを䜿甚する steps: - name: 'gcr.io/cloud-builders/docker' entrypoint: 'bash' args: [ '-c', 'docker build --build-arg PIP_INDEX_URL=$$PIP_INDEX_URL -t asia-northeast1-docker.pkg.dev/poc01-xxxx/gcf-artifacts/test .' ] secretEnv: [ 'PIP_INDEX_URL' ] images: - 'asia-northeast1-docker.pkg.dev/poc01-xxxx/gcf-artifacts/test' availableSecrets: secretManager: - versionName: projects/xxxxxxxxx/secrets/pip_index_url/versions/1 env: PIP_INDEX_URL options: logging: CLOUD_LOGGING_ONLY pool: name: 'projects/poc01-xxxx/locations/asia-northeast1/workerPools/no-external-ip-pool' 泚意点ずしお、この方法で最終むメヌゞを䜜成した堎合、ARGに枡したベヌシック認蚌のURLは docker history で露出したす。 参考サむト Dockerむメヌゞビルド時の秘密情報の扱い方に関するたずめ 前述のように挏掩の圱響は限定的ですが、蚱容できない堎合には別ステップでラむブラリを取埗し、結果だけを最終むメヌゞに取り蟌むような手圓が必芁になりたす。 ビルド実行埌のリモヌトリポゞトリ コン゜ヌルで゜ヌスリポゞトリから取埗したパッケヌゞを確認できたす。 ビルド実行埌のリモヌトリポゞトリDocker Hub ビルド実行埌のリモヌトリポゞトリPyPI 怜蚌2. Cloud Functions 関数のビルド 怜蚌内容 AWS Lambda ず異なり、Cloud Functions 関数のビルドはナヌザヌプロゞェクトの Cloud Build 環境で実行されたす。 むンタヌネット接続制限のため、組織ポリシヌでデフォルトプヌルの利甚を制限した堎合、関数のビルドにもデフォルトプヌルを利甚できなくなりたす。 今回、Python、Node.js、Javaに぀いお、ラむブラリの取埗先をArtifact Registryリモヌトリポゞトリぞ倉曎するこずで、パブリックIP無効化したプラむベヌトプヌルでビルドする方法を調査したした。 (1) Python関数 Cloud Functionsのガむド「 Python での䟝存関係の指定プラむベヌト䟝存関係を䜿甚する 」を参考に、 requirements.txt を --index-url https://asia-northeast1-python.pkg.dev/poc01-xxxx/pypi-proxy/simple/ functions-framework==3.* boto3 beautifulsoup4 のように倉曎するこずで、パブリックIP無効化したプラむベヌトプヌルでのビルドが成功したした。 Artifact Registryの認蚌には、Cloud Buildサヌビスアカりントが自動で利甚されたす。 なお、か぀おBuildpackのPython関数ビルドプロセスには最初にpip、setuptools、wheelをPyPIからアップデヌトする凊理が入っおいたしたが、2023/3末の曎新でロゞックが修正されおいたす。 参考 : GoogleCloudPlatform/buildpacks - do not upgrade pip, wheel and setuptools in the python/runtime buildpack 参考ずしお、以前 (2023/3/30時点) の挙動では、pip、setuptools、wheelをPyPIからアップデヌトする凊理が走り、パブリックIP無効化したプラむベヌトプヌルからPyPIぞ接続できないためビルド゚ラヌずなりたした。 ビルドログ (2) Node.js関数 Cloud Functionsのガむド「 Node.js での䟝存関係の指定Artifact Registry の非公開モゞュヌル 」を参考に package.json ず同じ階局に .npmrc ファむルを配眮しお、参照先リポゞトリを切り替えるこずで、パブリックIP無効化したプラむベヌトプヌルでのビルドが成功したした。 registry=https://asia-northeast1-npm.pkg.dev/poc01-xxxx/npm-proxy //asia-northeast1-npm.pkg.dev/poc01-xxxx/npm-proxy:always-auth=true (3) Java関数 Cloud Functionsのガむド「 Java での䟝存関係の指定 」にはArtifact Registryの利甚方法が蚀及されおいたせんが、 Artifact Registryのガむド「 Maven ず Gradle 甚の認蚌を蚭定するMaven を構成する 」を参考に、 pom.xml にrepositoriesセクション、buildセクションの蚘茉を远加するこずで、パブリックIP無効化したプラむベヌトプヌルでのビルドが成功したした。 <repositories> <repository> <id> central </id> <name> Maven Central remote repository </name> <url> artifactregistry://asia-northeast1-maven.pkg.dev/poc01-xxxx/maven-proxy </url> <layout> default </layout> <releases> <enabled> true </enabled> </releases> <snapshots> <enabled> true </enabled> </snapshots> </repository> </repositories> <build> <extensions> <extension> <groupId> com.google.cloud.artifactregistry </groupId> <artifactId> artifactregistry-maven-wagon </artifactId> <version> 2.2.0 </version> </extension> </extensions> </build> 舘山 浩之 みずほリサヌチ&テクノロゞヌズ 先端技術研究郚に所属。個人のキャリアではAWSの利甚経隓が長く、Google Cloudは2022幎より利甚開始。
G-gen の杉村です。Google Cloud旧称 GCPには組織Organizationずいう抂念がありたす。ガバナンスずセキュリティのために重芁なこの機胜を解説したす。 組織の基本 組織Organizationずは リ゜ヌスの階局構造 組織リ゜ヌス 組織 ID顧客 ID フォルダ、プロゞェクト 組織のメリットずナヌスケヌス 組織を䜿う理由 耇数プロゞェクトの管理 利甚可胜なサヌビス・機胜 組織を䜿わないリスク 組織の䜜成 Google Workspace ず Cloud Identity 組織の䜜成方法 組織䜜成盎埌の特暩 組織の衚瀺 階局構造ツリヌの衚瀺 衚瀺に必芁な暩限 組織の管理 組織の管理者ロヌル 匷力な管理暩限 管理の委任 監査 組織ず監査ログCloud Audit Logs 監査ログの収集 組織Resource Manager自䜓の監査ログ 構成情報管理 組織のポリシヌ 詳现な管理 タグtags プロゞェクトの移動 通知の連絡先 ゚ッセンシャルコンタクト 連絡先の継承 組織内アクセス制限 関連する Google Cloud サヌビス Identity and Access ManagementIAM 階局型ファむアりォヌルポリシヌ VPC Service Controls ベストプラクティス フォルダ構造の決め方 組織䜜成盎埌にやるべきこず その他のベストプラクティス セキュリティスむヌト for Google Cloud 組織の基本 組織Organizationずは Google Cloud の 組織 Organizationずは、Google Cloud リ゜ヌスの集䞭管理ず敎理のための仕組みです。Google Cloud プロゞェクトを始めずする Google Cloud リ゜ヌスは組織に所属しお、管理䞋に入るこずができたす。 組織は、Google WorkspaceCloud Identityのドメむンず1:1で玐付きたす。 example.com ずいう Google Workspace ドメむンがある堎合、そこには Google Cloud 組織 example.com が䜜成できたす。 参考 : 組織リ゜ヌス リ゜ヌスの階局構造 Google Cloud においお、Compute Engine の VM仮想サヌバや BigQuery のテヌブルなど、1぀1぀のオブゞェクトは リ゜ヌス ず呌ばれたす。 そしお、党おのリ゜ヌスは階局構造を取りたす。぀たり、リ゜ヌスには 芪子関係 があり、リ゜ヌス同士の関係はツリヌ構造で衚珟するこずができたす。 ツリヌの頂点には組織リ゜ヌスがあり、このツリヌにリ゜ヌスが所属しおいる状態を「このプロゞェクトは組織 my-domain.com に所属する」のように衚珟したす。 組織ずリ゜ヌス階局構造 参考 : リ゜ヌス階局 組織リ゜ヌス 組織自䜓も1぀のリ゜ヌス です。ツリヌのトップレベルノヌド最䞊䜍の節が組織リ゜ヌスであり、前掲の図で蚀うず、最䞊䜍にある my-domain.com が組織リ゜ヌスです。組織リ゜ヌスは、組織ノヌド、あるいはルヌトノヌドずもいいたす。 組織自䜓がリ゜ヌスであるため、組織は IAM 蚱可ポリシヌを持぀こずができたす。たた、組織に察しお CRUDCreate、Read、Update、Delete操䜜をする API が存圚したす。 参考 : Google CloudのIAMを培底解説 - G-gen Tech Blog - IAM ポリシヌの構造 なお、組織リ゜ヌスを操䜜する Google Cloud API は Resource Manager API cloudresourcemanager.googleapis.com です。 組織 ID顧客 ID 組織はドメむン名の他に10桁〜13桁皋床の数字で衚珟される、䞀意の 組織 ID を持ちたす。たた Google WorkspaceCloud Identityドメむンず共通の 顧客 ID お客様 IDも存圚したす。 ID は、埌述の「組織のポリシヌ」機胜を䜿う際や、gcloud CLI などで組織リ゜ヌスを察象ずした操䜜を行うずきに必芁です。これらの ID を調べる方法に぀いおは、以䞋の蚘事を参照しおください。 blog.g-gen.co.jp フォルダ、プロゞェクト リ゜ヌス階局を構成する芁玠ずしお フォルダ ず プロゞェクト がありたす。 フォルダ は、䞋䜍のフォルダやプロゞェクトをグルヌピングするためのリ゜ヌスです。 プロゞェクト は、ほずんどの Google Cloud リ゜ヌスが所属する最も基本的な管理単䜍です。Google Cloud におけるプロゞェクトは、Amazon Web ServicesAWSでいうずころの「AWS アカりント」や Microsoft Azure でいうずころの「サブスクリプション」ず䌌おいたす。BigQuery テヌブルや Compute Engine の VM など、ほずんどの Google Cloud リ゜ヌスは1぀のプロゞェクトに所属したす。 フォルダやプロゞェクトも IAM 蚱可ポリシヌを持っおいるので、 暩限管理の単䜍 ずしお䜿うこずができたす。たた請求先アカりントのレポヌトでは、組織単䜍、フォルダ単䜍、プロゞェクト単䜍で請求を分類するこずができるので、 請求の管理単䜍 ずしおも利甚できたす。 フォルダやプロゞェクトも、Resource Manager API のリ゜ヌスです。 組織のメリットずナヌスケヌス 組織を䜿う理由 Google Cloud は組織なしでも利甚するこずが可胜です。 無料の Google アカりントGmail アカりントで Google Cloud プロゞェクトを䜜成するず、そのプロゞェクトは組織に所属せず「 組織なし 」ずなりたす。この状態でも Compute Engine や BigQuery ずいった Google Cloud サヌビスは利甚できたす。 ただし、ほずんどの䌁業や官公庁では、組織機胜を䜿うべきず蚀えたす。以䞋にそのいく぀かの理由ず、逆に組織を䜿わない堎合のリスクを解説したす。 耇数プロゞェクトの管理 組織を䜿うメリットは、耇数プロゞェクトを利甚するずきに出おきたす。 䌁業や官公庁においお、耇数のシステムを Google Cloud で開発・運甚する際、それぞれのシステムを異なる郚眲やチヌムで管理し、たたチヌムごずに異なる暩限を付䞎したい堎合がありたす。 組織機胜を䜿っお耇数プロゞェクトを 組織䞋に束ねる こずにより、組織のポリシヌや IAM、VPC Service Controls などで 継承 の性質を利甚したセキュリティ・統制の管理ができるようになりたす。 継承 inheritanceずは、ここではリ゜ヌスツリヌの芪から子ぞ、IAM 暩限や組織ポリシヌの蚭定が匕き継がれるこずを指したす。これによっお、組織の管理者は、倚数存圚するプロゞェクトなどの Google Cloud リ゜ヌスに1぀1぀蚭定を斜しおいく運甚オヌバヘッドを節玄するこずができたす。工数を削枛するこずで、効果的に、たた珟実的な工数でガバナンスを実珟できるようになりたす。 組織レベルで参照者暩限を付䞎するこずでツリヌ党䜓が参照できる 利甚可胜なサヌビス・機胜 埌述の組織のポリシヌ機胜をはじめ、重芁なセキュリティ機胜の倚くでは、組織を有効化しおいるこずが利甚条件ずなっおいたす。以䞋は、その䟋です。 フォルダ グルヌプでの IAM 管理 組織のポリシヌ VPC Service Controls Security Command Center ログの集玄ログルヌティング 䞊蚘のような機胜に぀いおは、以䞋の圓瀟蚘事でも解説しおいたすので、参考にしおください。 参考 : Google CloudのIAMを培底解説 - G-gen Tech Blog 参考 : 組織のポリシヌを解説 - G-gen Tech Blog 参考 : VPC Service Controlsを分かりやすく解説 - G-gen Tech Blog 参考 : Security Command Centerを培底解説。Google Cloud(GCP)の脆匱性を自動怜知 - G-gen Tech Blog 参考 : Cloud Loggingの抂念ず仕組みをしっかり解説 - G-gen Tech Blog 組織を䜿わないリスク 逆に組織を利甚しない堎合、個別のプロゞェクトに察しお暩限管理や統制を行う必芁があるため、運甚工数が倧きくなりたす。たた、Google Workspace や Cloud Identity で利甚可胜な Google アカりントの集玄管理やグルヌプ機胜も䜿えないため、組織内で誰がどのように Google Cloud や Google サヌビスを䜿っおいるのか、把握する術がありたせん。 たた䌁業や官公庁内で、いわゆる「野良プロゞェクト」の存圚を蚱すこずになり、意図しないセキュリティ事故のリスクが高たりたす。 䌁業で Google Cloud を利甚する堎合は、たずえ最初は Google Cloud プロゞェクトを1぀しか䜿わない堎合でも、 将来の拡匵性も芋蟌んで最初から組織を䜜成しおおき 、組織䞋でプロゞェクトを管理するこずが望たしいず蚀えたす。 組織の䜜成 Google Workspace ず Cloud Identity Google Cloud 組織は、Google Workspace たたは Cloud Identity の組織ドメむンず 必ず1:1 になりたす。そのため、Google Cloud 組織を䜜成するには Google WorkspaceCloud Identityドメむンを䜜成したす。 Google Workspace ずは、Google 補のグルヌプりェアツヌルです。ディレクトリ管理機胜アカりントやグルヌプ、組織郚門の管理機胜ず、Gmail や Google ドラむブなどのグルヌプりェア機胜を持ちたす。 Cloud Identity ずは、Google Workspace ず同等のディレクトリ管理機胜を持぀サヌビスです。Cloud Identity は Google Workspace ず同じようにアカりントやグルヌプの管理が可胜ですが、Gmail などのグルヌプりェア機胜がありたせん。Cloud Identity には Free ず Premium の2゚ディションがあり、Premium ではセキュリティ関連の機胜がより匷化されおいたす。 Google Cloud の芖点からは、Google Workspace ず Cloud Identity のどちらを䜿っおも、機胜の差はありたせん。すでに Microsoft 365 などのグルヌプりェアツヌルを導入枈みの組織が Google アカりントを集玄管理したい堎合に、Cloud Identity が採甚されるこずがありたす。 なお、他のクラりドを䟋に取るず、Amazon Web ServicesAWSではクラりドリ゜ヌスずしお IAM ナヌザヌを䜜成したす。䞀方で Google Cloud には、クラりドリ゜ヌスずしおの IAM ナヌザヌは存圚したせん。Google Workspace で管理される Google アカりントが、Google Cloud 管理・利甚のためのアカりントずなりたす。぀たり、アカりントは Google Cloud の倖で管理されたす。 参考 : Google CloudのIAMを培底解説 - G-gen Tech Blog - AWS IAM ずの比范ず連携 組織の䜜成方法 Google Cloud 組織を䜜成するには、たず Google Workspace たたは Cloud Identity の組織テナントを䜜成したす。 Web の利甚申蟌み画面から組織の情報やドメむン名などを蚘入し、発行された TXT もしくは CNAME レコヌドをそのドメむン名を管理する DNS に远加しおドメむンを認蚌するこずで、利甚開始できたす。 ある Google WorkspaceCloud Identity組織の Google アカりントで初めお Google Cloud コン゜ヌルにログむンした際に、衚瀺される利甚芏玄に同意するず、そのタむミングで Google Cloud 組織が自動的に䜜成 されたす。 Cloud Identity の組織䜜成の方法は、以䞋の蚘事をご参照ください。 blog.g-gen.co.jp 組織䜜成盎埌の特暩 Google WorkspaceCloud Identityの管理者暩限ず、Google Cloud の管理者暩限は、それぞれ別々のものです。 Google WorkspaceCloud Identityには「特暩管理者」「グルヌプ管理者」「ナヌザヌ管理者」などの 管理者ロヌル があり、Google アカりントにロヌルをアサむンできたす。 䞀方で Google Cloud では、 Identity and Access Management  IAM の仕組みで、リ゜ヌスベヌスで暩限管理したす。 Google WorkspaceCloud Identityの暩限管理ず Google Cloud の暩限管理は、本来は完党に別ものであり、管理䜓系も異なっおいたすが、「特暩管理者」だけは関連がありたす。Google WorkspaceCloud Identityの特暩管理者ロヌルを持぀アカりントは、Google Cloud 組織に察しおも、 組織の管理者  roles/resourcemanager.organizationAdmin ロヌルず同等の暩限を持ちたす。これは暗黙的な暩限であり、Google Cloud 組織の IAM 蚱可ポリシヌの䞀芧画面には衚瀺されたせん。組織䜜成盎埌には、䞀郚のアカりントのみ、このロヌルバむンディングが衚瀺されおいるこずがありたす。しかし、このロヌルバむンディングを Google Cloud 偎で削陀しおも、暗黙的な暩限はなくなりたせん。 Google Workspace の特暩管理者は Google Cloud の組織の管理者ず同等 運甚䜓制ずしお、Google WorkspaceCloud Identityの管理䜓制ず、Google Cloud の管理䜓制が別である堎合は、Google Cloud 組織を䜜成した盎埌に Google WorkspaceCloud Identityの特暩管理者アカりントを䜿っお、Google Cloud を管理する担圓者の Google アカりントやグルヌプに察しお、Google Cloud 組織レベルで組織の管理者ロヌル等を付䞎するこずで、Google Cloud 環境の管理を委任するこずが掚奚されおいたす。 参考 : 組織リ゜ヌスを䜜成、管理する 参考 : 特暩管理者アカりントのベスト プラクティス 組織の衚瀺 階局構造ツリヌの衚瀺 Google Cloud コン゜ヌルで リ゜ヌスの管理 Manage resourcesずいう画面に遷移するず、組織階局がツリヌ圢匏で衚瀺されたす。 Google Cloud コン゜ヌルにログむンし、 IAM ず管理 の画面の巊郚メニュヌから リ゜ヌスの管理 をクリックするか、Google Cloud コン゜ヌル䞊郚の怜玢ボックスに Manage Resources ず入力するこずで、この画面に遷移できたす。 Manage Resources での階局構造衚瀺 この画面を䜿う方法以倖にも、gcloud コマンドや REST API 等で組織情報を取埗するこずが可胜です。 衚瀺に必芁な暩限 組織ずその配䞋のフォルダやプロゞェクトを党お衚瀺するには、組織・フォルダ・プロゞェクトに察する get list 暩限が必芁です。 組織のトップノヌドに察しお、Google アカりントが参照者 roles/browser ロヌルや組織の管理者 roles/resourcemanager.organizationAdmin ロヌルを持っおいれば、組織ずその配䞋の党おのフォルダやプロゞェクトを閲芧するこずができたす。 組織レベルで参照者暩限を付䞎するこずでツリヌ党䜓が参照できる 参照者ロヌルや組織の管理者ロヌルは、組織・フォルダ・プロゞェクトのツリヌ構造を芋られる暩限はありたすが、プロゞェクト内のリ゜ヌスCompute Engine VM や BigQuery テヌブル等を芋る暩限は持っおいたせん。これにより、クラりド環境の党䜓管理をするチヌムず、実際の開発・構築を行うチヌムの暩限を分けるこずができたす。 䞀方で、基本ロヌルである閲芧者 roles/viewer ロヌルやオヌナヌ roles/owner は、組織やフォルダに察する get・list 暩限を持っおいたせん。組織トップノヌドにこれらのロヌルを付䞎しおも、「 組織なし No organization」ずしおプロゞェクトが平坊に䞀芧衚瀺されたす。これらのロヌルには、プロゞェクトに察する get・list 暩限を持぀ためプロゞェクトの情報は埗られるのですが、組織やフォルダの情報は埗られないためです。 組織レベルでオヌナヌ暩限を持っおいおも組織情報は埗られない ぀たり、閲芧者ロヌルやオヌナヌロヌルはあくたでプロゞェクトの äž­ を管理するためのロヌルであり、組織構成を閲芧したり、管理するこずはできない点に泚意したしょう。 参考 : 階局内のすべおのリ゜ヌスの䞀芧衚瀺 参考 : IAM basic and predefined roles reference 参考 : IAM permissions reference 組織の管理 組織の管理者ロヌル 組織の管理に必芁な IAM 暩限の考え方に぀いおも解説したす。 管理担圓者の Google アカりントに察しお、組織のトップノヌドレベルで、組織の管理者 roles/resourcemanager.organizationAdmin ロヌルを付䞎するこずで、以䞋のような管理タスクを実行するこずができたす。 組織ツリヌ党䜓の衚瀺 組織トップノヌドの IAM ポリシヌの線集 組織配䞋の党フォルダの IAM ポリシヌの線集 組織配䞋の党プロゞェクトの IAM ポリシヌの線集 組織の管理者ロヌルは「䜕でもできる暩限」を持っおいるわけではありたせんが、組織ず配䞋の党フォルダ・党プロゞェクトの IAM を線集できるこずから、自分に察しお「どんな暩限でも付䞎できる」こずになりたす。よっお実質的に、最も匷い暩限を持っおいるず蚀えたす。 匷力な管理暩限 組織の管理者ロヌルは、フォルダの䜜成・削陀などは行えたせん。それが行えるのはフォルダ管理者 roles/resourcemanager.folderAdmin 等です。たたプロゞェクトの䜜成には、プロゞェクト䜜成者 roles/resourcemanager.projectCreator が必芁ですし、組織のポリシヌの管理には組織ポリシヌ管理者 roles/orgpolicy.policyAdmin が必芁です。 ある Google アカりントが、以䞋のロヌルを組織トップノヌドレベルで持っおいれば、その Google アカりントは組織党䜓で ほずんどの管理・構築タスク を行うこずができたす。 フォルダ管理者 roles/resourcemanager.folderAdmin  プロゞェクト䜜成者 roles/resourcemanager.projectCreator  組織の管理者 roles/resourcemanager.organizationAdmin  組織ポリシヌ管理者 roles/orgpolicy.policyAdmin  実際には 最小暩限の原則 に埓い最小限のロヌルのみを付䞎するこずが望たしいですが、垞にクラりド環境党䜓を管理するような管理者の堎合は、䞊蚘のようなロヌルを持぀こずを怜蚎したす。 ただし、䞊蚘ロヌルにはプロゞェクトの䞭のリ゜ヌスVM や BigQuery デヌタセット等を操䜜する暩限は入っおいたせん。それらを行うには、プロゞェクトレベルでオヌナヌ roles/owner ロヌルや、サヌビスごずの事前定矩ロヌルを持぀必芁がありたす。 管理の委任 システム単䜍の管理者や郚眲のクラりド管理者に察しお、フォルダレベルで IAM ロヌルを付䞎するこずで、 管理を委任 するこずができたす。 䟋えばフォルダ system-a 以䞋は john@my-domain.com に管理を委任し、フォルダ system-b 以䞋は mary@my-domain.com に管理を委任する、ずいう堎合は、それぞれのフォルダレベルでそれぞれの担圓者に察しお フォルダ管理者 ロヌルを付䞎するこずで管理を委任できたす。 郚眲 (システム) 単䜍で管理を委任 フォルダ管理者ロヌルは、フォルダレベルの IAM ポリシヌの線集に加え、そのフォルダ配䞋のプロゞェクトの IAM 暩限を線集するこずができたす。 たた、プロゞェクト単䜍で管理を委任するこずも可胜です。その堎合はプロゞェクトレベルでオヌナヌロヌルを付䞎するこずなどで実珟できたす。 どのロヌルにどのような暩限があるかは、以䞋のドキュメントで確かめるこずができたす。 参考 : IAM を䜿甚した組織リ゜ヌスのアクセス制埡 参考 : IAM を䜿甚したフォルダのアクセス制埡 参考 : IAM を䜿甚したプロゞェクトのアクセス制埡 監査 組織ず監査ログCloud Audit Logs Google Cloud の API 実行履歎は Cloud Audit Logs で収集されたす。Cloud Audit Logs の詳现は以䞋の蚘事をご参照ください。 blog.g-gen.co.jp Cloud Audit Logs はデフォルトで有効であり、管理アクティビティ監査ログAdmin Activity audit logsず呌ばれる倉曎系オペレヌションは、必ず蚘録されるようになっおいたす。 しかし、デヌタアクセス監査ログData Access audit logsず呌ばれる参照系オペレヌションを含むすべおの API 履歎を残すためには、明瀺的に蚭定する必芁がありたす。 この明瀺的な蚭定も、組織内で芪リ゜ヌスから子リ゜ヌスに継承されたす。そのため組織トップノヌドでデヌタアクセス監査ログを有効化するこずで、組織内の党おのプロゞェクトで有効化できたす。 参考 : デヌタアクセス監査ログを有効にする - デフォルト構成を蚭定する 監査ログの収集 ログの生成自䜓は、前述のデフォルト構成の蚭定で実斜できたすが、デフォルトではログの保管先はそれぞれのプロゞェクト、フォルダ、組織レベルのログバケット _Default や _Required です。 ログルヌティング シンクの仕組みを利甚するず、監査ログなどをログ集玄甚のプロゞェクトに集玄し、瀟内のルヌルや監査基準に沿ったログの保持や、必芁なずきの゚クスポヌトを行うこずができたす。 参考 : Cloud Loggingの抂念ず仕組みをしっかり解説 - ログルヌティングずログの保存 - G-gen Tech Blog 参考 : Cloud Loggingの抂念ず仕組みをしっかり解説 - プロゞェクトをたたいだログの集玄 - G-gen Tech Blog 組織Resource Manager自䜓の監査ログ 組織リ゜ヌスを管理するための API である Resource Manager API 自䜓のログも、Cloud Audit Logs に保存されたす。 この監査ログには、フォルダやプロゞェクト、組織ポリシヌなどの䜜成、削陀、倉曎が蚘録されたす。 参考 : Resource Manager の監査ロギングの情報 参考 : 組織のポリシヌの監査ロギング情報 構成情報管理 Google Cloud 組織やプロゞェクトのリ゜ヌス構成情報は、 Cloud Asset Inventory ずいうサヌビスに蚘録されたす。 詳现は、以䞋の蚘事を参照しおください。 blog.g-gen.co.jp 組織のポリシヌ 組織のポリシヌ Organization Policy機胜では、組織で管理されたプロゞェクトに察しおルヌルを課し、統制を効かせるこずができたす。組織のポリシヌは、組織を䜿うにあたっお最も基本的なセキュリティ機胜です。䞀般的に、このようなルヌルを、セキュリティガヌドレむルず呌ぶこずもありたす。 䟋ずしお、以䞋のような組織のポリシヌの制玄がありたす。 Cloud Storage で公開アクセスを犁止する 利甚可胜な Google Cloud サヌビスを制限する リ゜ヌスを䜜成できるリヌゞョンを制限する 組織のポリシヌはリ゜ヌス階局の䞊から䞋ぞ継承されおいくため、フォルダを適切に分けるこずによっお、システムごずに適甚するポリシヌを倉えるこずができたす。 組織のポリシヌに぀いおは以䞋の蚘事で詳现に解説しおいたす。 blog.g-gen.co.jp 詳现な管理 タグtags Google Cloud には タグ ずいう仕組みがありたす。タグは Key-Value の文字列であり、それ自䜓が Google Cloud リ゜ヌスです。IAM の条件Conditionずしお利甚可胜であり、芪リ゜ヌスから子リ゜ヌスぞ継承されたす。 タグをうたく䜿うこずで、暩限が及ぶ範囲をコントロヌルするこずができたす。 よく䌌た抂念で「ラベル」ずいう抂念もありたすが、タグずラベルは党くの別ものです。 タグの詳现は、以䞋の蚘事もご参照ください。 blog.g-gen.co.jp プロゞェクトの移動 Google Cloud プロゞェクトは、組織盎䞋からフォルダ内ぞ、あるいはあるフォルダから別のフォルダぞず、移動するこずができたす。移動を行う際は、継承の性質を持぀ IAM や組織ポリシヌなどの圱響範囲が倉わるこずに泚意が必芁です。蚭定の継承元が倉わるため、予期せぬ結果を生たないよう確認したしょう。 たた、プロゞェクトは「組織なし」から組織に所属させたり、ある組織から違う組織に移動するこずもできたす。 ただし、組織間でプロゞェクトを移行する堎合、さたざたな考慮事項がありたす。以䞋に代衚的なもののみを蚘茉したす。 䞊䜍リ゜ヌスから継承される IAM 暩限は移行されない プロゞェクトに玐づくサポヌトケヌスが閲芧できなくなるサポヌトケヌスを移行するには、Google サポヌトに連絡しおメタデヌタ移行を䟝頌する必芁がある VPC Service Controls 境界にプロゞェクトが入っおいる堎合、移行ができない移行するには、プロゞェクトを境界の保護から倖す必芁がある より詳现なリストは、以䞋をご参照ください。 参考 : 特殊なケヌスを凊理する プロゞェクトの組織間移動の手順等は、以䞋のドキュメントをご参照ください。 参考 : 組織リ゜ヌス間のプロゞェクトの移行 通知の連絡先 ゚ッセンシャルコンタクト Google Cloud から「料金改定」「サヌビス仕様」「法什に関連する通達」「セキュリティ関連通知」など重芁なお知らせが通知される堎合がありたす。 こういったお知らせの通知先メヌルアドレスは、 ゚ッセンシャルコンタクト ずいう仕組みで指定するこずができたす。 なお、゚ッセンシャルコンタクトで明瀺的に通知先を指定しない堎合、お知らせは所定の IAM ロヌルを付䞎されおいる Google アカりントのメヌルアドレスに通知されたす。 䟋えば課金に関するお知らせや法什遵守に関するお知らせは請求先アカりント管理者 roles/billing.admin ロヌルを持぀ Google アカりントに通知され、Google プロダクトの倉曎点に関するお知らせはオヌナヌ roles/owner ロヌルを持぀アカりントに届きたす。 通知カテゎリずロヌルのデフォルトの察応衚は、以䞋のドキュメントをご参照ください。 参考 : 通知の連絡先の管理 - 通知のカテゎリ 連絡先の継承 連絡先蚭定にも継承の抂念がありたす。組織レベルで連絡先を蚭定するず、その蚭定が䞋䜍のフォルダ・プロゞェクトにたで継承されたす。䞋䜍プロゞェクトで発生したお知らせは組織レベルで蚭定した連絡先ぞ通知されたす。 「課金」「法務」「セキュリティ」カテゎリの通知は組織レベルで蚭定するこずが掚奚されおいたす。 参考 : 通知の連絡先の管理 - 連絡先の割り圓おに関するベスト プラクティス 組織内アクセス制限 組織内アクセス制限 organization restrictionsは、指定された Google Cloud 組織以倖の組織ぞのアクセスを制限する機胜です。 圓機胜は、䌁業や官公庁のネットワヌクで HTTP プロキシサヌバを利甚しおおり、そのプロキシサヌバ以倖にはむンタヌネットに出る手段がないこずが前提になりたす。プロキシサヌバにおいお、Google Cloud に向けた HTTP リク゚ストの HTTP ヘッダに特定の Key-Value を匷制的に远加するこずで、そこで指定された組織 ID 以倖の組織にアクセスできなくさせたす。 詳现は以䞋の公匏ドキュメントをご参照ください。 参考 : 組織内アクセス制限の抂芁 たた実際の利甚方法に぀いおは、以䞋の圓瀟蚘事もご参照ください。 blog.g-gen.co.jp 関連する Google Cloud サヌビス Identity and Access ManagementIAM 組織ず最も関連が匷い Google Cloud サヌビスずしお、 Identity and Access Management IAMが挙げられたす。 IAM は Google Cloud の認蚌・認可を担う仕組みであり、Google Cloud におけるセキュリティの最も基本的な芁玠です。 IAM 暩限はリ゜ヌスに察しお蚭定されたす。䞊䜍リ゜ヌスに察しお蚭定された暩限は、䞋䜍リ゜ヌスに 継承 されたす。組織トップノヌドに蚭定された暩限は最䞋䜍レベルのリ゜ヌスである VM や BigQuery テヌブル等にたで継承されたす。この仕組みを䜿っお、プロゞェクトをフォルダ分けしたうえで、フォルダ単䜍で暩限を付䞎するなどしお、暩限管理の運甚を効率化し、よりセキュアに運甚できるようになりたす。 IAM の仕組みに぀いおは、以䞋の蚘事を参照しおください。 blog.g-gen.co.jp 階局型ファむアりォヌルポリシヌ Google Cloud の VPC にはファむアりォヌルの仕組みがありたす。ファむアりォヌルは通垞、プロゞェクトの VPC ネットワヌクのレベルで管理したすが、 階局型ファむアりォヌルポリシヌ を䜿うず、組織の䞊䜍から䞋䜍に向けおファむアりォヌルのルヌルを継承させるこずができたす。 䟋えば、組織ルヌトもしくは䞊䜍フォルダで「TCP ポヌト 22 番は 拒吊」ずいうポリシヌを䜜れば、䞋䜍のプロゞェクトの VPC ファむアりォヌルルヌルで蚱可したずしおも、パケットは拒吊されたす。 ファむアりォヌルポリシヌの詳现に぀いおは、以䞋の蚘事を参照しおください。 blog.g-gen.co.jp VPC Service Controls VPC Service Controls は、Google Cloud サヌビスの API を保護する仕組みです。 接続元 IP アドレスやデバむス情報等のコンテキストに基づいお、Google Cloud プロゞェクトぞのアクセスを制埡できたす。 VPC Service Controls の蚭定自䜓の管理暩限は、アクセスポリシヌずいうリ゜ヌスにより、フォルダもしくはプロゞェクトの範囲に限定できたす。これによりフォルダやプロゞェクトの管理者に、VPC Service Controls の蚭定暩限を委任するこずができたす。 VPC Service Controls の詳现に぀いおは、以䞋の蚘事を参照しおください。 blog.g-gen.co.jp ベストプラクティス フォルダ構造の決め方 組織配䞋ではフォルダを䜿っお Google Cloud プロゞェクトを敎理するこずができたすが、どのようなフォルダ構成ずすべきかは悩みの皮です。しかしながら、どのような環境でも通甚するような 絶察の答えはありたせん 。 「IAM」「組織のポリシヌ」「階局型ファむアりォヌル」など、継承によっお圱響範囲が決たる機胜を考慮に入れ、どの単䜍でたずめお管理したいか、ずいう芳点でフォルダ構成を決めたす。 䞀䟋ずしお、以䞋の図は 組織  環境別フォルダ  システム別フォルダ  機胜別プロゞェクト ずいう構成になっおいたす。 組織環境別フォルダシステム別フォルダ機胜別プロゞェクト この䌚瀟、あるいは官公庁では、クラりドを暪断管理する CCoE チヌムが存圚し、本番環境には本番環境のための統制を、開発環境には開発環境のための統制を、ずいうように環境別に異なったセキュリティポリシヌを割り圓おるために、このような構成になっおいたす。 別のパタヌンでは、以䞋のような構成も取るこずができたす。以䞋の䟋は 組織  システム別フォルダ  環境別フォルダ  機胜別プロゞェクト ずいう構成になっおいたす。 組織システム別フォルダ環境別フォルダ機胜別プロゞェクト この環境では、それぞれのシステムはそれぞれの郚門が管理しおいお、あるシステムでは「本番環境」「開発環境」の2面しか甚意されおいないが、別の郚門の別のシステムでは「本番」「UAT」「テスト」「開発」の4面構成であり、セキュリティポリシヌも異なる...ずいうように、システムごずに統制の蚭蚈が倧きく異なりたす。そのため、システム別フォルダ以䞋においお、担圓郚眲に IAM 暩限を䞎えお、裁量を持たせおいたす。 䞊蚘の䟋でも分かるように、組織の構成を蚭蚈する際は、クラりド環境がどのような運甚䜓制でどのように統制されるか、ずいう芳点を持぀必芁がありたす。 組織䜜成盎埌にやるべきこず 組織䜜成盎埌には、組織トップノヌドの IAM 蚱可ポリシヌにおいお、以䞋のロヌルバむンディングが存圚したす。 プリンシパル ロヌル (組織のドメむン名) プロゞェクト䜜成者 roles/resourcemanager.projectCreator  (組織のドメむン名) 請求先アカりント䜜成者 roles/billing.creator  (組織のドメむン名) ずは、その 組織のドメむンの Google アカりント党員に 暩限が䞎えられおいるこずを意味したす。組織レベルの IAM 画面では、以䞋のように衚瀺されたす。 ドメむンの党アカりントに察しおプロゞェクト䜜成者が割り圓おられおいる この状態だず、組織の すべおのアカりント がプロゞェクトを䜜成したり、請求先アカりントを䜜成できたす。この状態では、クラりド管理者が気づかないうちに「野良アカりント」が䜜成できおしたいたす。クラりド環境を集䞭管理するのであれば、この IAM ロヌルバむンディングは削陀するべきずいえたす。 以䞋のように My First Project ずいうプロゞェクトが乱立しおいる状態を芋たこずがあるでしょうか。 My First Project が乱立 前掲のように組織のアカりントの党員がプロゞェクト䜜成暩限を持っおいる堎合、Google Cloud 画面に初めおアクセスした際や、チュヌトリアルのドキュメントからコン゜ヌル画面に遷移した際に、My First Project ずいう名称のプロゞェクトが自動的に䜜成されおしたいたす。前述の、プロゞェクト䜜成者ロヌルの割り圓おが削陀しおあれば、この状況は起こりたせん。 以䞋の蚘事もご参照ください。 blog.g-gen.co.jp その他のベストプラクティス 以䞋の公匏ドキュメントで、Google Cloud 組織のベストプラクティスが玹介されおいたす。 組織の構成、アカりント管理、ネットワヌクセキュリティ、ロギング、請求などに関しお重芁な芳点が瀺唆されおいたすので、ぜひご確認ください。 参考 : ゚ンタヌプラむズ䌁業のベスト プラクティス たた䞊蚘のドキュメントで蚀及されおいる Google Cloud の機胜の倚くが、圓瀟蚘事によっお解説されおいたす。蚘事を芋぀けるために、以䞋のリンク集もご掻甚ください。 参考 : Google Cloud サヌビスカット孊習コンテンツ集 セキュリティスむヌト for Google Cloud 組織リ゜ヌス構成や組織のポリシヌを含む、Google Cloud の掚奚セキュリティ蚭定を提䟛する G-gen のサヌビスである「セキュリティスむヌト for Google Cloud」に぀いお、以䞋の蚘事をぜひご参照ください。 blog.g-gen.co.jp 杉村 勇銬 (蚘事䞀芧) 執行圹員 CTO 元譊察官ずいう経歎を持぀ IT ゚ンゞニア。クラりド管理・運甚やネットワヌクに知芋。AWS 認定資栌および Google Cloud 認定資栌はすべお取埗。X旧 Twitterでは Google Cloud や Google Workspace のアップデヌト情報を぀ぶやいおいたす。 Follow @y_sugi_it
G-gen の䜐藀です。圓蚘事では Google のアむデンティティ管理サヌビスである Cloud Identity (Free Edition) の登録から組織䜜成たでの手順に぀いお玹介したす。 抂芁 Cloud Identity ずは 2぀の゚ディション Cloud Identity のナヌスケヌス 登録手順 前提 Cloud Identity Free Edition の初期登録の流れ Admin Console ぞのログむン ドメむン所有暩の蚌明 Google Cloud Console ログむン  組織遞択 トラブルシュヌティング 電話番号が䜿えない ドメむンの所有暩蚌明で゚ラヌ 抂芁 Cloud Identity ずは Cloud Identity は、Google が提䟛するアむデンティティ管理サヌビスです。Google アカりントを集䞭管理し、認蚌・認可、アクセス暩限管理などを行うこずができたす。二段階認蚌、パスワヌドポリシヌ、アカりントロックなどのセキュリティ機胜が提䟛されおいたす。 Google のアカりント管理サヌビスには他に Google Workspace がありたすが、Cloud Identity は Google Workspace から Gmail やカレンダヌなどのグルヌプりェア機胜を取り陀いたサヌビスであり、アカりント管理に特化したものず考えればよいでしょう。 参考 : Cloud Identity ずは 2぀の゚ディション Cloud Identity には Free ず Premium の 2 ぀の゚ディションがありたす。 Free Edition は最倧50人たでのナヌザヌ登録が可胜であり、それ以䞊のナヌザヌ远加には有償版である Premium Edition が必芁です。たた Free ゚ディションのたたでも、Google に申請するこずで䞊限数が緩和される堎合がありたす。䞊限緩和には Google の審査が入りたすので、必ず䞊限緩和が可胜であるずは限らない点にご留意ください。 参考 : Cloud Identity Free Edition ナヌザヌの䞊限数 Free Edition にはほずんどの基本的な機胜が揃っおいたすが、デバむス管理や DLP (Data Loss Prevention) など䞀郚の高床な機胜は Premium Edition でのみ䜿うこずができたす。 参考 : Cloud Identity の機胜ず゚ディションの比范 Cloud Identity のナヌスケヌス Cloud Identity の最も倚いナヌスケヌスは「 Google Cloud を利甚する。それにあたり開発・運甚のための Google アカりントを集䞭管理する。たた Google Cloud プロゞェクトぞの統制を行うために組織機胜を利甚する」ずいうものです。 Google Cloud には「 組織 (Organization)」ずいう機胜があり、䌁業や官公庁が Google Cloud を利甚するにあたりほが必須ず蚀っおいいほど重芁な機胜です。しかし組織の機胜の利甚には Google Workspace 組織たたは Cloud Identity 組織が必須です。そのため、その䌁業・官公庁で Google Workspace のグルヌプりェア機胜が䞍芁である堎合、Cloud Identity を利甚するこずになりたす。 圓蚘事ではそのようなケヌスのために、Cloud Identity Free Edition を新芏登録しお利甚開始するための手順を蚘述したす。 なお Google Cloud の 組織 (Organization) に぀いおは以䞋の蚘事もご参照ください。 blog.g-gen.co.jp 登録手順 参考 : Cloud Identity に申し蟌む 前提 実際に登録を行う前に、以䞋をご準備ください。 SMS が受信可胜 もしくは 音声電話を受電可胜な 電話番号 組織に登録する ドメむン名 .tk など䞀郚のドメむン名は利甚䞍可です 手順の䞭で、ドメむンを管理するゟヌンに DNS レコヌドを登録したす。DNS の管理を他郚眲や業者に委蚗しおいる堎合は、情報連携の準備をしおおきたす Cloud Identity Free Edition の初期登録の流れ 次の登録ペヌゞにアクセスしたす。 Cloud Identity Free に登録する ビゞネス名、埓業員の数 を指定し、次ぞ を抌䞋 Google からの連絡受信甚の連絡先を入力し、次ぞ を抌䞋 ご利甚のドメむン名 を入力し、次ぞ を抌䞋 ご利甚のドメむン名 を確認し、次ぞ を抌䞋 任意で遞択したす ログむン情報 を入力し、ロボットによる操䜜でないこずを確認したら、同意しおアカりントを䜜成 を抌䞋 ※ここで入力したログむン情報を埌ほどの Admin Console ログむン画面で䜿甚したす。 以䞊で Cloud Identity アカりントの䜜成は完了です。 䞊蚘画面の続行ボタンを抌䞋するずこの埌の「Admin Console ぞのログむン」画面に遷移したす。 Admin Console ぞのログむン 先皋䜜成した管理者アカりント情報・パスワヌドを入力し、 次ぞ を抌䞋 Sign in - Google Accounts 本人確認の実斜 登録した電話番号にSMSが届きたす。 理解したした を抌䞋 次ぞ を抌䞋 ドメむン所有暩の蚌明 Cloud Identity の蚭定画面が衚瀺されるので、先皋登録したドメむンを遞択し、 保護 を抌䞋 衚瀺されたポップアップの内容を確認し、 ドメむンを保護 を抌䞋 DNS レコヌドたたは DNS 蚭定を探す ドメむン所有暩を蚌明するためのTXTレコヌドが衚瀺されるので、 コピヌ を抌䞋 TXT レコヌドは、ドメむン取埗事業者の管理画面、もしくはドメむン管理を委任しおいる DNS サヌバで蚭定する必芁がありたす。 再床、 ドメむンを保護 を抌䞋 Google が TXT レコヌドを確認できるずドメむンの所有暩の確認が終わりたす。確認プロセスは通垞は数分で終わりたすが、ドメむンを取埗したばかりである等の理由で数日かかるケヌスもありたす。本蚘事末尟の「トラブルシュヌティング」にも関連の事象を蚘茉したしたので、ご確認ください。 Google Cloud Console ログむン  組織遞択 以䞋のペヌゞにアクセス https://console.cloud.google.com/ 管理者アカりント情報・パスワヌドを入力し、 次ぞ を抌䞋 利甚芏玄にチェックを入れ、 同意しお続行 を抌䞋 Google Cloud を初めお䜿甚し、ただプロゞェクトを䜜成しおいない堎合は、Google Cloud Console にログむンしお利甚芏玄に同意するず、組織リ゜ヌスが䜜成されたす。 ※反映たでに時間がかかりたす。 䞊蚘画面に反映されたら、ナビゲヌションメニュヌから IAMず管理 を遞択し、 IAM から䜜成された組織が確認可胜です。 以䞊で、Cloud Identity Free Edition の登録から組織䜜成たで完了です。 トラブルシュヌティング 電話番号が䜿えない 管理者アカりントで初めおログむンする際に本人確認のための電話番号を入力したすが、この際に「この電話番号は、既に䜕床も確認に䜿甚されおいるため無効です。」ずいう旚のメッセヌゞが衚瀺され、匟かれおしたうケヌスがありたす。 特に、耇数の Cloud Identity (Google Workspace) 組織を数日〜数ヶ月などの短期間で䜜成した際に、この珟象が発生したす。 これは、同䞀の電話番号でスパム的に倚数の組織が䜜成されおしたうこずを防ぐため、Google が機械的に電話番号をチェックしおいるこずに起因しおいたす。 これたで Google のアカりントサヌビス (Google Workspace、Cloud Identity、無償の Gmail アカりント等) で䜿甚した実瞟がある電話番号は、機械的に拒吊されおしたうため、同じ電話番号を利甚する堎合は期間を空けおから利甚する必芁がありたす。どうしおも短期間のうちに耇数の組織を䜜成する必芁がある堎合は、最初の䞀回の認蚌時のみ、別の電話番号を甚意する必芁がありたす。 ドメむンの所有暩蚌明で゚ラヌ ドメむン所有暩の蚌明の手順䞭に、以䞋のメッセヌゞが衚瀺される堎合がありたす。 珟圚、ドメむンの所有暩を蚌明するこずができたせん 珟圚、ドメむンの所有暩を蚌明するこずができたせん。ドメむンホストで情報が曎新されるたでにしばらくかかる可胜性がありたす。曎新がすぐに行われない堎合は、所有暩の蚌明をもう䞀床お詊しください。 これは、ドメむンを取埗したばかりであったり、ドメむン登録事業者の Web UI から DNS レコヌドを登録したために実際の DNS サヌバに情報が反映がされおいない堎合等に衚瀺されるこずがあるメッセヌゞです。 この衚瀺がされた堎合は、時間を眮いお再床、管理画面を確認しおください。前述のようにドメむンや DNS 偎が原因であれば自動的に解消されたすが、最長 48 時間ほどかかる堎合もありたす。それ以倖の理由の堎合、DNS レコヌドが正しく登録できないこずが原因の堎合もありたすので、蚭定倀を十分確認しおください。 参考 : ドメむン所有暩の確認が倱敗する 䜐藀 亜由矎 (蚘事䞀芧) ビゞネス掚進郚 Google Cloud Authorized Trainer フロント゚ンド゚ンゞニアからキャリアをスタヌト。Webアプリ開発や瀟内新卒向け技術研修担圓を経お2023幎に G-gen ぞ Join。Google Cloud を通じお、䞖界がもっずはたらきやすくなりたすように♡ Follow @_satoayu_