G-gen の藤岡です。当記事では、 Google Cloud(旧称 GCP)の Filestore を Compute Engine(以下 GCE)の Windows Server にマウントする方法を紹介します。
- サービスの概要
- 実施内容
- 構築
- 注意点
サービスの概要
Filestore とは
Filestore は、 GCE や GKE クラスタ、オンプレミスマシンに接続できるフルマネージドのファイルサーバーです。 プロトコルは NFSv3 で NFSv3 互換のクライアントがサポートされています。
Cloud VPN または Cloud Interconnect を使用して、異なる VPC のGCE やオンプレミスマシン等のリモートネットワーク上のクライアントに接続することもできます。 Linux や Windows にマウントしてファイルサーバーとして利用出来るため、オンプレミスマシンの急な容量不足にも対応可能です。
ネットワーク
Filestore では、ネットワークに 標準 VPC または 共有 VPC を選択できます。クライアントが Filestore にアクセスするには Filestore と同じネットワーク上にある必要があり、作成後にネットワークを変更することはできません。
Filestore のインスタンスはサービスプロデューサーのネットワークと呼ばれる Google が管理する専用ネットワークに配置されます。Cloud SQL や Cloud Build 等と同様の扱い になります。
Filestore インスタンスに使われる IP アドレスは内部 IP アドレス(10.0.0.0/8
, 172.16.0.0/12
, 192.168.0.0/16
)の範囲である必要があり、後述するサービスティアによって /29
や /26
のように必要となるレンジが異なります。
なお、推移的ピアリングをサポートしていません。そのため、当記事で紹介する構成で、 vpc-a と vpc-b を Cloud VPN ではなく、 VPC ネットワークピアリング で接続していた場合、 vpc-b 内のインスタンスは Filestore へアクセスできません。
サービスティア
サービスティアとは、 Filestore インスタンスのインスタンスタイプとストレージタイプを組み合わせたものです。以下の4種類があり、インスタンスの作成後にサービスティアを変更することはできません。
- 基本 HDD
- 基本 SSD
- 高スケール SSD
- エンタープライズ
パフォーマンスはもちろん、プロビジョニング可能な容量もサービスティアによって異なりますので、ユースケースに合わせて選択してください。
- 参考:サービスティア
クライアントへの接続
前述の通り、 GCE や GKE クラスタ、オンプレミスマシンにマウントすることが出来ますが、最適なパフォーマンスを得るには、マシンタイプファミリーが n1-standard-8 以上のスペックのクライアントにマウントすることが推奨されています。
実施内容
構成図
今回の作成する構成は以下の通りです。
前提条件
当記事では、 gcloud CLI を使用してリソースを作成するため、 CUI 操作に慣れていない方は以下の記事で Cloud VPN をコンソールから作成する方法について紹介していますのでご参照ください。 blog.g-gen.co.jp
各コマンドは Cloud Shell から実行 します。参考までに、実行時の環境は以下の通りです。
fujioka@cloudshell:~ (fujioka-xxxx)$ gcloud -v Google Cloud SDK 416.0.0 alpha 2023.01.30 app-engine-go 1.9.72 app-engine-java 2.0.10 app-engine-python 1.9.101 app-engine-python-extras 1.9.97 beta 2023.01.30 bigtable bq 2.0.84 bundled-python3-unix 3.9.16 cbt 0.13.0 cloud-datastore-emulator 2.3.0 cloud-run-proxy 0.3.0 core 2023.01.30 gcloud-crc32c 1.0.0 gke-gcloud-auth-plugin 0.4.0 gsutil 5.19 kpt 1.0.0-beta.24 local-extract 1.5.7 minikube 1.29.0 pubsub-emulator 0.7.4 skaffold 2.1.0 fujioka@cloudshell:~ (fujioka-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
API の有効化
これ以降は、実行したコマンドを出力結果とともに記載します。コマンドのリファレンスを参考に載せているので、試す際にはリソース名やオプション等は環境に合わせて適宜置き換えてください。
今回有効化する API は以下の2つです。
- Compute Engine API
- Cloud Filestore API
環境によりますが、 API の有効化には数分程度かかる場合があります。
fujioka@cloudshell:~ (fujioka-230212)$ gcloud services enable compute.googleapis.com && \ gcloud services enable file.googleapis.com Operation "operations/acf.p2-381487557941-71a52ef2-f5c9-49de-9a68-fbd6f88beafa" finished successfully. Operation "operations/acf.p2-381487557941-81c07e57-3e55-4386-ac3a-33767bbef368" finished successfully. fujioka@cloudshell:~ (fujioka-230212)$
ネットワーク構築
VPC とサブネットの作成
2つの VPC とサブネットを作成します。
fujioka@cloudshell:~ (fujioka-230212)$ gcloud compute networks create vpc-a --subnet-mode custom && \ gcloud compute networks subnets create subnet-a --network vpc-a --region asia-northeast1 --range 10.0.0.0/24 && \ gcloud compute networks create vpc-b --subnet-mode custom && \ gcloud compute networks subnets create subnet-b --network vpc-b --region asia-northeast1 --range 172.16.0.0/24 ~省略~ Created [https://www.googleapis.com/compute/v1/projects/fujioka-230212/regions/asia-northeast1/subnetworks/subnet-b]. NAME: subnet-b REGION: asia-northeast1 NETWORK: vpc-b RANGE: 172.16.0.0/24 STACK_TYPE: IPV4_ONLY IPV6_ACCESS_TYPE: INTERNAL_IPV6_PREFIX: EXTERNAL_IPV6_PREFIX: fujioka@cloudshell:~ (fujioka-230212)$
作成済みの VPC とサブネットを確認します。今回はデフォルトで作成される default
以外を出力させます。
fujioka@cloudshell:~ (fujioka-230212)$ gcloud compute networks list --filter="name!='default'" && \ gcloud compute networks subnets list --filter="name!='default'" NAME: vpc-a SUBNET_MODE: CUSTOM BGP_ROUTING_MODE: REGIONAL IPV4_RANGE: GATEWAY_IPV4: NAME: vpc-b SUBNET_MODE: CUSTOM BGP_ROUTING_MODE: REGIONAL IPV4_RANGE: GATEWAY_IPV4: NAME: subnet-a REGION: asia-northeast1 NETWORK: vpc-a RANGE: 10.0.0.0/24 STACK_TYPE: IPV4_ONLY IPV6_ACCESS_TYPE: INTERNAL_IPV6_PREFIX: EXTERNAL_IPV6_PREFIX: NAME: subnet-b REGION: asia-northeast1 NETWORK: vpc-b RANGE: 172.16.0.0/24 STACK_TYPE: IPV4_ONLY IPV6_ACCESS_TYPE: INTERNAL_IPV6_PREFIX: EXTERNAL_IPV6_PREFIX: fujioka@cloudshell:~ (fujioka-230212)$
ファイアウォールルールの作成
各 VPC に2つのファイアウォールルールを作成します。 icmp
は GCE 同士の疎通確認用です。 tcp:3389
は RDP 用のため、 --source-ranges ${YOUR_GROBAL_IP_ADDRESS}
は自身のグローバル IP アドレスに置き換えてください。
fujioka@cloudshell:~ (fujioka-230212)$ gcloud compute firewall-rules create allow-rdp-from-home-a \ --network vpc-a \ --direction ingress \ --action allow \ --source-ranges ${YOUR_GROBAL_IP_ADDRESS} \ --rules=tcp:3389 && \ gcloud compute firewall-rules create allow-icmp-from-subnet-b-a \ --network vpc-a \ --direction ingress \ --action allow \ --source-ranges 172.16.0.0/24 \ --rules=icmp && \ gcloud compute firewall-rules create allow-rdp-from-home-b \ --network vpc-b \ --direction ingress \ --action allow \ --source-ranges ${YOUR_GROBAL_IP_ADDRESS} \ --rules=tcp:3389 && \ gcloud compute firewall-rules create allow-icmp-from-subnet-a-b \ --network vpc-b \ --direction ingress \ --action allow \ --source-ranges 10.0.0.0/24 \ --rules=icmp ~省略~ Creating firewall...working..Created [https://www.googleapis.com/compute/v1/projects/fujioka-230212/global/firewalls/allow-icmp-from-subnet-a-b]. Creating firewall...done. NAME: allow-icmp-from-subnet-a-b NETWORK: vpc-b DIRECTION: INGRESS PRIORITY: 1000 ALLOW: icmp DENY: DISABLED: False fujioka@cloudshell:~ (fujioka-230212)$
作成済みのファイアウォールルールを確認します。デフォルトで作成されるルール以外を出力させます。
fujioka@cloudshell:~ (fujioka-230212)$ gcloud compute firewall-rules list --filter="name!='default'" NAME: allow-icmp-from-subnet-a-b NETWORK: vpc-b DIRECTION: INGRESS PRIORITY: 1000 ALLOW: icmp DENY: DISABLED: False NAME: allow-icmp-from-subnet-b-a NETWORK: vpc-a DIRECTION: INGRESS PRIORITY: 1000 ALLOW: icmp DENY: DISABLED: False NAME: allow-rdp-from-home-a NETWORK: vpc-a DIRECTION: INGRESS PRIORITY: 1000 ALLOW: tcp:3389 DENY: DISABLED: False NAME: allow-rdp-from-home-b NETWORK: vpc-b DIRECTION: INGRESS PRIORITY: 1000 ALLOW: tcp:3389 DENY: DISABLED: False To show all fields of the firewall, please show in JSON format: --format=json To show all fields in table format, please see the examples in --help. fujioka@cloudshell:~ (fujioka-230212)$
HA Cloud VPN ゲートウェイの作成
今回は 高可用性(HA)Cloud VPN を使用します。はじめに、vpc-a と vpc-b に HA Cloud VPN ゲートウェイを作成します。
fujioka@cloudshell:~ (fujioka-230212)$ gcloud compute vpn-gateways create vpn-gateway-a \ --region=asia-northeast1 --network=vpc-a && \ gcloud compute vpn-gateways create vpn-gateway-b \ --region=asia-northeast1 --network=vpc-b ~省略~ Creating VPN Gateway...done. NAME: vpn-gateway-b INTERFACE0: 34.157.79.62 INTERFACE1: 34.157.206.255 NETWORK: vpc-b REGION: asia-northeast1 fujioka@cloudshell:~ (fujioka-230212)$
作成されていることを確認します。
fujioka@cloudshell:~ (fujioka-230212)$ gcloud compute vpn-gateways list NAME: vpn-gateway-a INTERFACE0: 34.157.66.147 INTERFACE1: 34.157.195.105 NETWORK: vpc-a REGION: asia-northeast1 NAME: vpn-gateway-b INTERFACE0: 34.157.79.62 INTERFACE1: 34.157.206.255 NETWORK: vpc-b REGION: asia-northeast1 fujioka@cloudshell:~ (fujioka-230212)$
Cloud Router の作成
次に、vpc-a と vpc-b に Cloud Router を作成します。
fujioka@cloudshell:~ (fujioka-230212)$ gcloud compute routers create cloud-router-a \ --region=asia-northeast1 --network=vpc-a \ --asn=65001 && \ gcloud compute routers create cloud-router-b \ --region=asia-northeast1 --network=vpc-b \ --asn=65002 ~省略~ Creating router [cloud-router-b]...done. NAME: cloud-router-b REGION: asia-northeast1 NETWORK: vpc-b fujioka@cloudshell:~ (fujioka-230212)$
作成されていることを確認します。
fujioka@cloudshell:~ (fujioka-230212)$ gcloud compute routers list NAME: cloud-router-a REGION: asia-northeast1 NETWORK: vpc-a NAME: cloud-router-b REGION: asia-northeast1 NETWORK: vpc-b fujioka@cloudshell:~ (fujioka-230212)$
VPN トンネルの作成
HA Cloud VPN のため、トンネルは計4本作ります。
fujioka@cloudshell:~ (fujioka-230212)$ gcloud compute vpn-tunnels create vpn-tunnel-a-1 \ --peer-gcp-gateway=vpn-gateway-b \ --region=asia-northeast1 \ --ike-version=2 \ --shared-secret=sdijennji29duj \ --router=cloud-router-a \ --vpn-gateway=vpn-gateway-a \ --interface=0 && \ gcloud compute vpn-tunnels create vpn-tunnel-b-1 \ --peer-gcp-gateway=vpn-gateway-a \ --region=asia-northeast1 \ --ike-version=2 \ --shared-secret=sdijennji29duj \ --router=cloud-router-b \ --vpn-gateway=vpn-gateway-b \ --interface=0 && \ gcloud compute vpn-tunnels create vpn-tunnel-a-2 \ --peer-gcp-gateway=vpn-gateway-b \ --region=asia-northeast1 \ --ike-version=2 \ --shared-secret=sdijennji29duj65 \ --router=cloud-router-a \ --vpn-gateway=vpn-gateway-a \ --interface=1 && \ gcloud compute vpn-tunnels create vpn-tunnel-b-2 \ --peer-gcp-gateway=vpn-gateway-a \ --region=asia-northeast1 \ --ike-version=2 \ --shared-secret=sdijennji29duj65 \ --router=cloud-router-b \ --vpn-gateway=vpn-gateway-b \ --interface=1 ~省略~ Creating VPN tunnel...done. NAME: vpn-tunnel-b-2 REGION: asia-northeast1 GATEWAY: vpn-gateway-b VPN_INTERFACE: 1 PEER_ADDRESS: 34.157.195.105 fujioka@cloudshell:~ (fujioka-230212)$
作成されていることを確認します。
fujioka@cloudshell:~ (fujioka-230212)$ gcloud compute vpn-tunnels list NAME: vpn-tunnel-a-1 REGION: asia-northeast1 GATEWAY: vpn-gateway-a PEER_ADDRESS: 34.157.79.62 NAME: vpn-tunnel-a-2 REGION: asia-northeast1 GATEWAY: vpn-gateway-a PEER_ADDRESS: 34.157.206.255 NAME: vpn-tunnel-b-1 REGION: asia-northeast1 GATEWAY: vpn-gateway-b PEER_ADDRESS: 34.157.66.147 NAME: vpn-tunnel-b-2 REGION: asia-northeast1 GATEWAY: vpn-gateway-b PEER_ADDRESS: 34.157.195.105 fujioka@cloudshell:~ (fujioka-230212)$
現時点をコンソールから確認をすると、トンネルは確立されていますが BGP セッションが構成されていません。
BGPセッションの構成
BGP セッションを構成します。
fujioka@cloudshell:~ (fujioka-230212)$ gcloud compute routers add-interface cloud-router-a \ --interface-name=bgp-a-1 \ --ip-address=169.254.0.1 \ --mask-length=30 \ --vpn-tunnel=vpn-tunnel-a-1 \ --region=asia-northeast1 && \ gcloud compute routers add-bgp-peer cloud-router-a \ --peer-name=bgp-b-1 \ --interface=bgp-a-1 \ --peer-ip-address=169.254.0.2 \ --peer-asn=65002 \ --region=asia-northeast1 && \ gcloud compute routers add-interface cloud-router-b \ --interface-name=bgp-b-1 \ --ip-address=169.254.0.2 \ --mask-length=30 \ --vpn-tunnel=vpn-tunnel-b-1 \ --region=asia-northeast1 && \ gcloud compute routers add-bgp-peer cloud-router-b \ --peer-name=bgp-a-1 \ --interface=bgp-b-1 \ --peer-ip-address=169.254.0.1 \ --peer-asn=65001 \ --region=asia-northeast1 && \ gcloud compute routers add-interface cloud-router-a \ --interface-name=bgp-a-2 \ --ip-address=169.254.0.5 \ --mask-length=30 \ --vpn-tunnel=vpn-tunnel-a-2 \ --region=asia-northeast1 && \ gcloud compute routers add-bgp-peer cloud-router-a \ --peer-name=bgp-b-2 \ --interface=bgp-a-2 \ --peer-ip-address=169.254.0.6 \ --peer-asn=65002 \ --region=asia-northeast1 && \ gcloud compute routers add-interface cloud-router-b \ --interface-name=bgp-b-2 \ --ip-address=169.254.0.6 \ --mask-length=30 \ --vpn-tunnel=vpn-tunnel-b-2 \ --region=asia-northeast1 && \ gcloud compute routers add-bgp-peer cloud-router-b \ --peer-name=bgp-a-2 \ --interface=bgp-b-2 \ --peer-ip-address=169.254.0.5 \ --peer-asn=65001 \ --region=asia-northeast1 ~省略~ Creating peer [bgp-a-2] in router [cloud-router-b]...done. fujioka@cloudshell:~ (fujioka-230212)$
以上でネットワークの構築は完了です。先程構成されていなかった BGP セッションも構成されています。
GCE 構築
GCE(Windows Server)の作成
次に Filestore をマウントする用の GCE を2つ作成します。OS は Windows Server 2022 を使用します。
fujioka@cloudshell:~ (fujioka-230212)$ gcloud compute instances create nfs-client-a \ --zone asia-northeast1-a \ --boot-disk-auto-delete \ --image-project windows-cloud \ --image-family windows-2022 \ --machine-type n1-standard-8 \ --network=vpc-a \ --subnet=subnet-a \ --private-network-ip=10.0.0.2 && \ gcloud compute instances create nfs-client-b \ --zone asia-northeast1-a \ --boot-disk-auto-delete \ --image-project windows-cloud \ --image-family windows-2022 \ --machine-type n1-standard-8 \ --network=vpc-b \ --subnet=subnet-b \ --private-network-ip=172.16.0.2 ~省略~ Created [https://www.googleapis.com/compute/v1/projects/fujioka-230212/zones/asia-northeast1-a/instances/nfs-client-b]. NAME: nfs-client-b ZONE: asia-northeast1-a MACHINE_TYPE: n1-standard-8 PREEMPTIBLE: INTERNAL_IP: 172.16.0.2 EXTERNAL_IP: 34.84.161.249 STATUS: RUNNING fujioka@cloudshell:~ (fujioka-230212)$
作成されていることを確認します。
fujioka@cloudshell:~ (fujioka-230212)$ gcloud compute instances list NAME: nfs-client-a ZONE: asia-northeast1-a MACHINE_TYPE: n1-standard-8 PREEMPTIBLE: INTERNAL_IP: 10.0.0.2 EXTERNAL_IP: 35.187.213.228 STATUS: RUNNING NAME: nfs-client-b ZONE: asia-northeast1-a MACHINE_TYPE: n1-standard-8 PREEMPTIBLE: INTERNAL_IP: 172.16.0.2 EXTERNAL_IP: 34.84.161.249 STATUS: RUNNING fujioka@cloudshell:~ (fujioka-230212)$
GCE に RDP
Windows Server に初回ログイン時は Windows パスワードを再設定する必要があります。2台分の GCE のパスワードを再設定します。出力される password
を使用して各 GCE へ RDP します。
fujioka@cloudshell:~ (fujioka-230212)$ gcloud beta compute reset-windows-password "nfs-client-a" --zone "asia-northeast1-a" && \ gcloud beta compute reset-windows-password "nfs-client-b" --zone "asia-northeast1-a" ~省略~ Would you like to set or reset the password for [fujioka] (Y/n)? Y Resetting and retrieving password for [fujioka] on [nfs-client-a] Updated [https://www.googleapis.com/compute/beta/projects/fujioka-230212/zones/asia-northeast1-a/instances/nfs-client-a]. ip_address: 35.187.213.228 password: [ao9+Tf4TitXWyh username: fujioka ~省略~ Would you like to set or reset the password for [fujioka] (Y/n)? Y Resetting and retrieving password for [fujioka] on [nfs-client-b] Updated [https://www.googleapis.com/compute/beta/projects/fujioka-230212/zones/asia-northeast1-a/instances/nfs-client-b]. ip_address: 34.84.161.249 password: .fD_brM2U~k$yeR username: fujioka fujioka@cloudshell:~ (fujioka-230212)$
コンソールから [RDP] をクリックし、再設定したパスワードを入力し、ログインします。
疎通テスト
異なる VPC に属する GCE 同士が内部 IP アドレスで疎通出来ることを確認します。左が nfs-client-a、右が nfs-client-b です。
問題なく疎通出来ています。
Filestore 構築
Filestore の作成
Filestore を作成します。サービスティアや環境によって異なりますが、数分〜数十分程かかる場合があります。
fujioka@cloudshell:~ (fujioka-230212)$ gcloud filestore instances create nfs-server \ --zone=asia-northeast1-a \ --tier=basic-hdd \ --file-share=name="vol",capacity=1TB \ --network=name="vpc-a",reserved-ip-range="10.0.1.0/29" Waiting for [operation-1676217502204-5f482ccc90135-fd023b8f-aac4ad51] to finish...done. fujioka@cloudshell:~ (fujioka-230212)$
マウント(nfs-client-a)
NFS クライアントの設定
nfs-client-a のインスタンスで ドキュメント に従い、管理者として PowerShell を開き 以下を順に実行します。
- NFS クライアントをインストールする
Install-WindowsFeature -Name NFS-Client
インスタンスを再起動する
NFS クライアントが使用するユーザー ID を構成する
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default" ` -Name "AnonymousUid" -Value "0" -PropertyType DWORD
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default" ` -Name "AnonymousGid" -Value "0" -PropertyType DWORD
- NFS クライアントサービスを再起動する
nfsadmin client stop
nfsadmin client start
- PowerShell を終了する
exit
マウント
マウント前は C ドライブのみです。
Command Prompt で Filestore 上のファイル共有名とドライブ文字をマッピングし、マウントします。
mount -o mtype=hard 10.0.1.2:/vol Z:
ルートのアドバタイズ
nfs-client-b に Filestore をマウントする前に、Filestore のサービス用サブネット(10.0.1.0/29
)をアドバタイズする必要があります。アドバタイズしない場合に発生するエラーについては後述の 注意点
の通りです。
vpc-a のルートでは 10.0.1.0/29
へのルートがあります。
それに対し、vpc-b には 10.0.1.0/29
へのルートがありません。
cloud-router-a で 10.0.1.0/29
のルートをアドバタイズします。
fujioka@cloudshell:~ (fujioka-230212)$ gcloud compute routers update cloud-router-a \ --advertisement-mode=CUSTOM \ --region=asia-northeast1 \ --set-advertisement-groups=ALL_SUBNETS \ --set-advertisement-ranges 10.0.1.0/29=filestore-range Updating router [cloud-router-a]...done. fujioka@cloudshell:~ (fujioka-230212)$
vpc-b に Filestore のサービス用サブネット(10.0.1.0/29
)がアドバタイズされました。
マウント(nfs-client-b)
上記の マウント(nfs-client-a)
と同様の手順を nfs-client-b にも行い、Filestore をマウントをさせます。
テスト
nfs-client-a の Z ドライブ(Filestore)で任意のファイルを作成し、nfs-client-b の Z ドライブにも反映されていることが確認できます。左が nfs-client-a、右が nfs-client-b です。
事後作業
プロジェクトの削除
fujioka@cloudshell:~ (fujioka-230212)$ gcloud projects delete fujioka-230212 Your project will be deleted. Do you want to continue (Y/n)? Y Deleted [https://cloudresourcemanager.googleapis.com/v1/projects/fujioka-230212]. You can undo this operation for a limited period by running the command below. $ gcloud projects undelete fujioka-230212 See https://cloud.google.com/resource-manager/docs/creating-managing-projects for information on shutting down projects. fujioka@cloudshell:~ (fujioka-xxxx)$
注意点
nfs-client-b に Filestore をマウントする前に、Filestore のサービス用サブネット(10.0.1.0/29
)をアドバタイズせずにマウントをしようとすると、以下のようなエラーが発生します。エラー発生時には、ルートが原因の場合がありますので、確認してください。
C:\Users\fujioka>hostname nfs-client-b C:\Users\fujioka> C:\Users\fujioka>mount -o mtype=hard 10.0.1.2:/vol Z: Network Error - 53 Type 'NET HELPMSG 53' for more information. C:\Users\fujioka>
藤岡 里美 (記事一覧)
クラウドソリューション部
数年前までチキン売ったりドレスショップで働いてました!2022年9月 G-gen にジョイン。ハイキューの映画を4回は見に行きたい。
Google Cloud All Certifications Engineer / Google Cloud Partner Top Engineer 2024
Follow @fujioka57621469