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_