Google Cloud Platform (GCP)
クラウドプラットフォーム
Google Cloud Platform (GCP)
概要
Google Cloud Platform(GCP)は、Googleのクラウドインフラストラクチャとサービスです。機械学習、データ分析、Kubernetesに強みを持ち、BigQuery、TensorFlowなど革新的なサービスを提供しています。AI・機械学習分野でのリーダーシップを発揮し、データドリブンな企業やスタートアップでの採用が増加しています。Kubernetesの開発元としての強みも活かし、コンテナ化とマイクロサービスアーキテクチャの分野で優位性を持っています。
詳細
GCPは2008年にApp Engineから開始し、現在では35以上のリージョンで展開され、Googleのコアテクノロジーをクラウドサービスとして提供しています。特にデータ分析(BigQuery)、機械学習(Vertex AI)、Kubernetesマネージドサービス(GKE)において業界をリードしています。2025年の注目機能として、Vertex AIでの新しいマルチモーダルモデル対応、BigQueryでの強化されたマルチクラウド分析機能、Cloud Runでの第3世代実行環境、Document AI APIの拡張などがあります。
主な特徴
- 機械学習: Vertex AI、AutoML、TensorFlowによる包括的なMLプラットフォーム
- データ分析: BigQuery、Dataflow、Pub/Subによるリアルタイム分析
- コンテナ: GKE(Google Kubernetes Engine)による業界最高レベルのKubernetes体験
- サーバーレス: Cloud Run、Cloud Functionsによる完全マネージドコンピューティング
- グローバルネットワーク: Googleの世界規模のインフラストラクチャ
2025年の最新機能
- Vertex AI: マルチモーダル対応とより柔軟なモデル展開
- BigQuery: 強化されたクロスクラウド分析とAI統合
- Cloud Run: 第3世代実行環境でパフォーマンス向上
- Document AI: より高精度な文書解析機能
- Security Command Center: 強化されたクラウドセキュリティ監視
メリット・デメリット
メリット
- データ分析・機械学習における業界最高レベルの技術力
- Kubernetesネイティブなコンテナプラットフォーム
- BigQueryによる高速で大規模なデータ分析
- シンプルで一貫性のあるAPI設計
- 従量課金制による優れたコストパフォーマンス
- Googleの高品質なグローバルネットワークインフラ
- 環境配慮:カーボンニュートラルなクラウドサービス
デメリット
- AWSと比較してサービス数が少ない
- エンタープライズ向けサポートがAWS・Azureより弱い
- 一部の地域でのデータセンター数が限定的
- サードパーティツールとの統合がAWSより少ない
- ドキュメントの日本語化が不十分な場合がある
- 歴史が浅いため、レガシーシステムとの統合に課題
参考ページ
- Google Cloud公式サイト
- Google Cloudドキュメント
- Google Cloud料金計算ツール
- Google Cloud Architecture Framework
- Google Cloud無料利用枠
- Google Cloud Skillsとトレーニング
書き方の例
1. 基本セットアップとアカウント設定
# Google Cloud SDKのインストール
curl https://sdk.cloud.google.com | bash
exec -l $SHELL
# gcloudの初期化
gcloud init
# 認証設定
gcloud auth login
gcloud auth application-default login
# プロジェクトの作成
gcloud projects create my-project-id --name="My Project"
# プロジェクトの設定
gcloud config set project my-project-id
# 利用可能なリージョン一覧
gcloud compute regions list
# デフォルトリージョンの設定
gcloud config set compute/region asia-northeast1
gcloud config set compute/zone asia-northeast1-a
# 現在の設定確認
gcloud config list
# 請求アカウントの確認
gcloud billing accounts list
# 請求アカウントをプロジェクトにリンク
gcloud billing projects link my-project-id --billing-account=BILLING_ACCOUNT_ID
# APIの有効化
gcloud services enable compute.googleapis.com
gcloud services enable container.googleapis.com
gcloud services enable bigquery.googleapis.com
2. コンピュートサービス(VM、コンテナ)
# Compute Engine VM作成(Google Cloud Python SDK)
from google.cloud import compute_v1
import time
# クライアントの初期化
instances_client = compute_v1.InstancesClient()
networks_client = compute_v1.NetworksClient()
firewalls_client = compute_v1.FirewallsClient()
project_id = "my-project-id"
zone = "asia-northeast1-a"
region = "asia-northeast1"
# ファイアウォールルールの作成
firewall_rule = compute_v1.Firewall()
firewall_rule.name = "allow-web-traffic"
firewall_rule.direction = "INGRESS"
firewall_rule.allowed = [
compute_v1.Allowed(I_p_protocol="tcp", ports=["80", "443", "22"])
]
firewall_rule.source_ranges = ["0.0.0.0/0"]
firewall_rule.target_tags = ["web-server"]
operation = firewalls_client.insert(
project=project_id,
firewall_resource=firewall_rule
)
print(f"Creating firewall rule: {firewall_rule.name}")
# VM インスタンスの作成
instance = compute_v1.Instance()
instance.name = "web-server-vm"
instance.machine_type = f"zones/{zone}/machineTypes/e2-medium"
# ブートディスクの設定
disk = compute_v1.AttachedDisk()
initialize_params = compute_v1.AttachedDiskInitializeParams()
initialize_params.source_image = "projects/ubuntu-os-cloud/global/images/family/ubuntu-2004-lts"
initialize_params.disk_size_gb = 20
initialize_params.disk_type = f"zones/{zone}/diskTypes/pd-standard"
disk.initialize_params = initialize_params
disk.auto_delete = True
disk.boot = True
instance.disks = [disk]
# ネットワーク設定
network_interface = compute_v1.NetworkInterface()
network_interface.network = "global/networks/default"
access_config = compute_v1.AccessConfig()
access_config.type_ = compute_v1.AccessConfig.Type.ONE_TO_ONE_NAT.name
access_config.name = "External NAT"
network_interface.access_configs = [access_config]
instance.network_interfaces = [network_interface]
# メタデータとスタートアップスクリプト
metadata = compute_v1.Metadata()
metadata.items = [
compute_v1.Items(
key="startup-script",
value="""#!/bin/bash
apt-get update
apt-get install -y nginx
systemctl start nginx
systemctl enable nginx
echo '<h1>Hello from Google Cloud!</h1>' > /var/www/html/index.html
"""
)
]
instance.metadata = metadata
# タグの設定
instance.tags = compute_v1.Tags(items=["web-server"])
# ラベルの設定
instance.labels = {
"environment": "production",
"application": "webapp"
}
# インスタンス作成の実行
operation = instances_client.insert(
project=project_id,
zone=zone,
instance_resource=instance
)
print(f"Creating instance: {instance.name}")
# 作成完了を待機
while operation.status != compute_v1.Operation.Status.DONE:
time.sleep(1)
operation = instances_client.get(
project=project_id,
zone=zone,
instance=operation.target_link.split('/')[-1]
)
print(f"Instance {instance.name} created successfully")
# Google Kubernetes Engine (GKE) クラスター作成
apiVersion: container.googleapis.com/v1
kind: Cluster
metadata:
name: webapp-cluster
spec:
location: asia-northeast1
initialNodeCount: 3
nodeConfig:
machineType: e2-medium
diskSizeGb: 50
preemptible: false
oauthScopes:
- https://www.googleapis.com/auth/cloud-platform
metadata:
disable-legacy-endpoints: "true"
labels:
environment: production
application: webapp
networkPolicy:
enabled: true
addonsConfig:
httpLoadBalancing:
disabled: false
horizontalPodAutoscaling:
disabled: false
networkPolicyConfig:
disabled: false
workloadIdentityConfig:
workloadPool: my-project-id.svc.id.goog
releaseChannel:
channel: REGULAR
maintenancePolicy:
window:
dailyMaintenanceWindow:
startTime: "03:00"
3. ストレージとデータベースサービス
# Cloud Storage操作
from google.cloud import storage
from google.cloud import firestore
from google.cloud import spanner
import datetime
# Cloud Storage操作
storage_client = storage.Client()
# バケット作成
bucket_name = "my-webapp-bucket"
bucket = storage_client.bucket(bucket_name)
bucket.location = "ASIA-NORTHEAST1"
bucket.storage_class = "STANDARD"
# バケットが存在しない場合は作成
if not bucket.exists():
bucket = storage_client.create_bucket(bucket_name, location="asia-northeast1")
print(f"Bucket {bucket_name} created")
# ライフサイクル管理ルールの設定
bucket.lifecycle_management_rules = [
{
"action": {"type": "SetStorageClass", "storageClass": "NEARLINE"},
"condition": {"age": 30}
},
{
"action": {"type": "SetStorageClass", "storageClass": "COLDLINE"},
"condition": {"age": 365}
},
{
"action": {"type": "Delete"},
"condition": {"age": 2555} # 7 years
}
]
bucket.patch()
# ファイルアップロード
blob = bucket.blob("uploads/sample.txt")
blob.metadata = {
"author": "user123",
"purpose": "demo",
"uploaded_at": datetime.datetime.now().isoformat()
}
with open("local-file.txt", "rb") as file:
blob.upload_from_file(file, content_type="text/plain")
print(f"File uploaded to {blob.name}")
# Firestore(NoSQLデータベース)操作
firestore_client = firestore.Client()
# コレクションの作成とドキュメント追加
users_ref = firestore_client.collection('users')
user_doc = {
'name': '田中太郎',
'email': '[email protected]',
'status': 'active',
'created_at': firestore.SERVER_TIMESTAMP,
'preferences': {
'theme': 'dark',
'language': 'ja'
}
}
doc_ref = users_ref.document('user123')
doc_ref.set(user_doc)
# ドキュメント読み取り
doc = doc_ref.get()
if doc.exists:
print(f"User data: {doc.to_dict()}")
# クエリの実行
active_users = users_ref.where('status', '==', 'active').stream()
for user in active_users:
print(f"Active user: {user.id} => {user.to_dict()}")
# Cloud Spanner(分散RDBMSデータベース)操作
from google.cloud.spanner_v1 import param_types
spanner_client = spanner.Client()
instance_id = "webapp-instance"
database_id = "webapp-db"
# Spannerインスタンスの作成(必要に応じて)
instance_config = f"projects/{project_id}/instanceConfigs/regional-asia-northeast1"
instance = spanner_client.instance(instance_id, instance_config)
if not instance.exists():
operation = instance.create()
print(f"Creating Spanner instance: {instance_id}")
operation.result(120) # 2分でタイムアウト
# データベースの作成
database = instance.database(database_id, ddl_statements=[
"""
CREATE TABLE Users (
UserId STRING(36) NOT NULL,
Name STRING(100),
Email STRING(255),
CreatedAt TIMESTAMP,
Status STRING(20)
) PRIMARY KEY (UserId)
""",
"""
CREATE INDEX UsersByStatus ON Users(Status)
"""
])
if not database.exists():
operation = database.create()
print(f"Creating Spanner database: {database_id}")
operation.result(120)
# データの挿入
with database.batch() as batch:
batch.insert(
table="Users",
columns=("UserId", "Name", "Email", "CreatedAt", "Status"),
values=[
("user123", "田中太郎", "[email protected]", spanner.COMMIT_TIMESTAMP, "active"),
("user456", "佐藤花子", "[email protected]", spanner.COMMIT_TIMESTAMP, "active")
]
)
# データの読み取り
with database.snapshot() as snapshot:
results = snapshot.execute_sql(
"SELECT UserId, Name, Email FROM Users WHERE Status = @status",
params={"status": "active"},
param_types={"status": param_types.STRING}
)
for row in results:
print(f"User: {row[0]} - {row[1]} ({row[2]})")
4. ネットワーキングとセキュリティ
# Cloud IAM とセキュリティ設定
from google.cloud import secretmanager
from google.cloud import iam
from google.oauth2 import service_account
# Secret Manager操作
secrets_client = secretmanager.SecretManagerServiceClient()
project_path = f"projects/{project_id}"
# シークレットの作成
secret_id = "database-password"
secret_path = secrets_client.secret_path(project_id, secret_id)
try:
secret = secrets_client.create_secret(
request={
"parent": project_path,
"secret_id": secret_id,
"secret": {
"replication": {"automatic": {}}
}
}
)
print(f"Created secret: {secret.name}")
except Exception as e:
print(f"Secret may already exist: {e}")
# シークレットバージョンの追加
secret_value = "SecurePassword123!"
response = secrets_client.add_secret_version(
request={
"parent": secret_path,
"payload": {"data": secret_value.encode("UTF-8")}
}
)
print(f"Added secret version: {response.name}")
# シークレットの取得
version_path = secrets_client.secret_version_path(project_id, secret_id, "latest")
response = secrets_client.access_secret_version(request={"name": version_path})
secret_data = response.payload.data.decode("UTF-8")
print(f"Retrieved secret: {secret_data}")
# VPC ネットワーク作成
networks_client = compute_v1.NetworksClient()
subnets_client = compute_v1.SubnetworksClient()
# カスタムVPCネットワーク
network = compute_v1.Network()
network.name = "webapp-vpc"
network.routing_config = compute_v1.NetworkRoutingConfig()
network.routing_config.routing_mode = "REGIONAL"
operation = networks_client.insert(
project=project_id,
network_resource=network
)
print(f"Creating VPC network: {network.name}")
# サブネット作成
subnet = compute_v1.Subnetwork()
subnet.name = "webapp-subnet"
subnet.ip_cidr_range = "10.0.1.0/24"
subnet.network = f"projects/{project_id}/global/networks/{network.name}"
subnet.region = region
operation = subnets_client.insert(
project=project_id,
region=region,
subnetwork_resource=subnet
)
print(f"Creating subnet: {subnet.name}")
# ファイアウォールルール(詳細設定)
firewall_rules = [
{
"name": "allow-internal",
"direction": "INGRESS",
"allowed": [{"IPProtocol": "tcp"}, {"IPProtocol": "udp"}, {"IPProtocol": "icmp"}],
"source_ranges": ["10.0.0.0/8"],
"target_tags": ["internal"]
},
{
"name": "allow-ssh",
"direction": "INGRESS",
"allowed": [{"IPProtocol": "tcp", "ports": ["22"]}],
"source_ranges": ["0.0.0.0/0"],
"target_tags": ["ssh-allowed"]
},
{
"name": "allow-web-traffic",
"direction": "INGRESS",
"allowed": [{"IPProtocol": "tcp", "ports": ["80", "443"]}],
"source_ranges": ["0.0.0.0/0"],
"target_tags": ["web-server"]
}
]
for rule_config in firewall_rules:
firewall_rule = compute_v1.Firewall()
firewall_rule.name = rule_config["name"]
firewall_rule.direction = rule_config["direction"]
firewall_rule.allowed = [
compute_v1.Allowed(**allowed) for allowed in rule_config["allowed"]
]
firewall_rule.source_ranges = rule_config["source_ranges"]
firewall_rule.target_tags = rule_config["target_tags"]
firewall_rule.network = f"projects/{project_id}/global/networks/{network.name}"
operation = firewalls_client.insert(
project=project_id,
firewall_resource=firewall_rule
)
print(f"Creating firewall rule: {firewall_rule.name}")
5. サーバーレスとFunctions
# Cloud Functions (Python)
import functions_framework
from google.cloud import firestore
from google.cloud import pubsub_v1
import json
import logging
@functions_framework.http
def process_user_request(request):
"""HTTPトリガーのCloud Function"""
# CORSヘッダーの設定
if request.method == 'OPTIONS':
headers = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST',
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Max-Age': '3600'
}
return ('', 204, headers)
headers = {'Access-Control-Allow-Origin': '*'}
try:
# リクエストデータの取得
request_json = request.get_json()
if not request_json:
return ({'error': 'No JSON body provided'}, 400, headers)
# Firestore クライアントの初期化
firestore_client = firestore.Client()
if request.method == 'POST':
# ユーザー作成
user_data = {
'name': request_json.get('name'),
'email': request_json.get('email'),
'status': 'active',
'created_at': firestore.SERVER_TIMESTAMP
}
doc_ref = firestore_client.collection('users').document()
doc_ref.set(user_data)
# Pub/Sub にメッセージ送信
publisher = pubsub_v1.PublisherClient()
topic_path = publisher.topic_path('my-project-id', 'user-events')
message_data = {
'event_type': 'user_created',
'user_id': doc_ref.id,
'user_data': user_data
}
publisher.publish(
topic_path,
json.dumps(message_data, default=str).encode('utf-8')
)
return ({'message': 'User created', 'user_id': doc_ref.id}, 201, headers)
elif request.method == 'GET':
# ユーザー一覧取得
users_ref = firestore_client.collection('users')
users = [doc.to_dict() for doc in users_ref.stream()]
return ({'users': users, 'count': len(users)}, 200, headers)
except Exception as e:
logging.error(f"Error processing request: {str(e)}")
return ({'error': str(e)}, 500, headers)
@functions_framework.cloud_event
def process_pubsub_message(cloud_event):
"""Pub/SubトリガーのCloud Function"""
import base64
# Pub/Subメッセージのデコード
message_data = base64.b64decode(cloud_event.data['message']['data']).decode('utf-8')
message_json = json.loads(message_data)
logging.info(f"Processing message: {message_json}")
# メッセージタイプに応じた処理
event_type = message_json.get('event_type')
if event_type == 'user_created':
# ユーザー作成時の処理
user_id = message_json['user_id']
user_data = message_json['user_data']
# 例:ウェルカムメール送信、ユーザー統計更新など
logging.info(f"Welcome new user: {user_data['name']} ({user_id})")
# BigQueryへデータ挿入
from google.cloud import bigquery
bigquery_client = bigquery.Client()
table_id = "my-project-id.analytics.user_events"
rows_to_insert = [
{
"event_timestamp": firestore.SERVER_TIMESTAMP,
"event_type": event_type,
"user_id": user_id,
"user_name": user_data['name'],
"user_email": user_data['email']
}
]
errors = bigquery_client.insert_rows_json(table_id, rows_to_insert)
if not errors:
logging.info("Event logged to BigQuery successfully")
else:
logging.error(f"BigQuery insert errors: {errors}")
# Cloud Run サービス(FastAPI)
from fastapi import FastAPI, HTTPException
from google.cloud import firestore
from typing import List, Optional
import uvicorn
app = FastAPI(title="WebApp API", version="1.0.0")
# Firestore クライアント
firestore_client = firestore.Client()
@app.get("/")
async def root():
return {"message": "Hello from Cloud Run!", "service": "webapp-api"}
@app.get("/health")
async def health_check():
return {"status": "healthy", "service": "webapp-api"}
@app.get("/users")
async def get_users():
try:
users_ref = firestore_client.collection('users')
users = []
for doc in users_ref.stream():
user_data = doc.to_dict()
user_data['id'] = doc.id
users.append(user_data)
return {"users": users, "count": len(users)}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.post("/users")
async def create_user(user_data: dict):
try:
doc_ref = firestore_client.collection('users').document()
user_data['created_at'] = firestore.SERVER_TIMESTAMP
user_data['status'] = 'active'
doc_ref.set(user_data)
return {"message": "User created", "user_id": doc_ref.id}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8080)
6. 監視とDevOps統合
# Cloud Monitoring とLogging設定
from google.cloud import monitoring_v3
from google.cloud import logging
import time
# Cloud Monitoring クライアント
monitoring_client = monitoring_v3.MetricServiceClient()
alert_client = monitoring_v3.AlertPolicyServiceClient()
project_name = f"projects/{project_id}"
# カスタムメトリクスの作成
descriptor = monitoring_v3.MetricDescriptor()
descriptor.type = "custom.googleapis.com/webapp/user_registrations"
descriptor.metric_kind = monitoring_v3.MetricDescriptor.MetricKind.GAUGE
descriptor.value_type = monitoring_v3.MetricDescriptor.ValueType.INT64
descriptor.description = "Number of user registrations"
descriptor = monitoring_client.create_metric_descriptor(
name=project_name,
metric_descriptor=descriptor
)
# メトリクスデータポイントの送信
series = monitoring_v3.TimeSeries()
series.metric.type = "custom.googleapis.com/webapp/user_registrations"
series.resource.type = "gce_instance"
series.resource.labels["instance_id"] = "your-instance-id"
series.resource.labels["zone"] = "asia-northeast1-a"
now = time.time()
seconds = int(now)
nanos = int((now - seconds) * 10 ** 9)
interval = monitoring_v3.TimeInterval(
{"end_time": {"seconds": seconds, "nanos": nanos}}
)
point = monitoring_v3.Point(
{"interval": interval, "value": {"int64_value": 10}}
)
series.points = [point]
monitoring_client.create_time_series(
name=project_name,
time_series=[series]
)
# アラートポリシーの作成
alert_policy = monitoring_v3.AlertPolicy(
display_name="High CPU Usage Alert",
documentation=monitoring_v3.AlertPolicy.Documentation(
content="Alert when CPU usage exceeds 80%"
),
conditions=[
monitoring_v3.AlertPolicy.Condition(
display_name="CPU usage condition",
condition_threshold=monitoring_v3.AlertPolicy.Condition.MetricThreshold(
filter='resource.type="gce_instance"',
comparison=monitoring_v3.ComparisonType.COMPARISON_GREATER_THAN,
threshold_value=0.8,
duration={"seconds": 300},
aggregations=[
monitoring_v3.Aggregation(
alignment_period={"seconds": 60},
per_series_aligner=monitoring_v3.Aggregation.Aligner.ALIGN_MEAN,
)
],
),
)
],
enabled=True,
)
alert_policy = alert_client.create_alert_policy(
name=project_name,
alert_policy=alert_policy
)
print(f"Created alert policy: {alert_policy.name}")
# Cloud Logging 設定
logging_client = logging.Client()
logging_client.setup_logging()
# ログの送信
logger = logging_client.logger("webapp-api")
logger.log_struct(
{
"message": "User registration completed",
"user_id": "user123",
"timestamp": time.time(),
"severity": "INFO"
}
)
# Cloud Build CI/CD パイプライン (cloudbuild.yaml)
steps:
# ソースコードのビルド
- name: 'gcr.io/cloud-builders/docker'
args:
- 'build'
- '-t'
- 'gcr.io/$PROJECT_ID/webapp:$BUILD_ID'
- '-t'
- 'gcr.io/$PROJECT_ID/webapp:latest'
- '.'
# イメージのプッシュ
- name: 'gcr.io/cloud-builders/docker'
args:
- 'push'
- 'gcr.io/$PROJECT_ID/webapp:$BUILD_ID'
- name: 'gcr.io/cloud-builders/docker'
args:
- 'push'
- 'gcr.io/$PROJECT_ID/webapp:latest'
# テストの実行
- name: 'gcr.io/cloud-builders/docker'
args:
- 'run'
- '--rm'
- 'gcr.io/$PROJECT_ID/webapp:$BUILD_ID'
- 'npm'
- 'test'
# Cloud Run にデプロイ
- name: 'gcr.io/cloud-builders/gcloud'
args:
- 'run'
- 'deploy'
- 'webapp-service'
- '--image'
- 'gcr.io/$PROJECT_ID/webapp:$BUILD_ID'
- '--region'
- 'asia-northeast1'
- '--platform'
- 'managed'
- '--allow-unauthenticated'
- '--memory'
- '512Mi'
- '--cpu'
- '1'
- '--concurrency'
- '100'
- '--max-instances'
- '10'
- '--set-env-vars'
- 'PROJECT_ID=$PROJECT_ID,ENVIRONMENT=production'
# デプロイ後のヘルスチェック
- name: 'gcr.io/cloud-builders/curl'
args:
- '-f'
- 'https://webapp-service-asia-northeast1.run.app/health'
# BigQuery に デプロイ ログを記録
- name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
bq query --use_legacy_sql=false \
"INSERT INTO \`$PROJECT_ID.analytics.deployment_logs\` \
(deployment_id, build_id, service_name, image_tag, deployed_at, status) \
VALUES ('$BUILD_ID', '$BUILD_ID', 'webapp-service', 'gcr.io/$PROJECT_ID/webapp:$BUILD_ID', CURRENT_TIMESTAMP(), 'SUCCESS')"
# ビルドトリガー設定
options:
logging: CLOUD_LOGGING_ONLY
machineType: 'E2_HIGHCPU_8'
timeout: '1200s'
# 成果物の保存
images:
- 'gcr.io/$PROJECT_ID/webapp:$BUILD_ID'
- 'gcr.io/$PROJECT_ID/webapp:latest'
# 環境変数
substitutions:
_DEPLOY_REGION: 'asia-northeast1'
_SERVICE_NAME: 'webapp-service'
Google Cloud Platformは、データ分析・機械学習に特化した革新的なサービスと、Googleの世界規模のインフラストラクチャにより、データドリブンなアプリケーション開発を強力にサポートします。