⚡ 3秒でわかる!この記事のポイント
- Gemini CLIでTerraform/CloudFormation等のIaCコードを自動生成
- GCP・AWS・Azureの主要サービスへのデプロイを対話的に構築
- CI/CDパイプラインとの連携でデプロイ完全自動化を実現
「クラウドデプロイの設定ファイルが複雑すぎる」「Terraformのリソース定義に時間がかかる」「マルチクラウド対応の知識が追いつかない」
クラウドインフラの構築とデプロイは、SESエンジニアにとって最も需要の高いスキルの一つです。しかし、各クラウドプロバイダのサービス体系やIaC(Infrastructure as Code)ツールの習得には膨大な時間がかかります。
Gemini CLI(Google Antigravity)を活用すれば、Terraformの設定ファイル生成からクラウドサービスのデプロイ自動化まで、インフラ構築のあらゆるフェーズを効率化できます。Googleの最新AIモデルが、クラウドサービスの仕様を深く理解した上で最適な設定を提案してくれます。
この記事はGoogle Antigravity完全攻略シリーズのEp.27として、クラウドデプロイの自動化を実践的に解説します。
この記事でわかること
- Gemini CLIでTerraformコードを自動生成する方法
- GCP(Cloud Run/GKE)へのデプロイ自動化
- AWS(ECS/Lambda)へのデプロイ設定生成
- マルチ環境(dev/stg/prod)の構成管理
- CI/CDパイプラインとの統合
Gemini CLIでクラウドデプロイが効率化される理由

クラウドデプロイの設定は、サービスの数だけ複雑さが増します。Gemini CLIはGoogleの大規模言語モデルの知識を活用して、各クラウドサービスの最新仕様に基づいた設定を生成します。
従来のデプロイ設定 vs Gemini CLI活用
| 作業 | 従来の方法 | Gemini CLI活用 |
|---|---|---|
| Terraform設定 | ドキュメント参照しながら手書き(2-4時間) | 対話的に生成(15-30分) |
| マルチ環境構成 | コピー&修正(1-2時間) | 差分のみ指示(10分) |
| セキュリティ設定 | チェックリスト確認(1時間) | 自動でベストプラクティス適用 |
| CI/CDパイプライン | テンプレート探し→カスタマイズ(2時間) | プロジェクト分析→最適な構成生成(20分) |
GCPへのデプロイ自動化
Cloud Runへのデプロイ
# Gemini CLIでCloud Runのデプロイ設定を生成
gemini "このNode.jsアプリをCloud Runにデプロイしたい。
Terraformで構成して、以下の要件を満たして:
- リージョン: asia-northeast1
- 最小インスタンス: 1(コールドスタート回避)
- 最大インスタンス: 10
- メモリ: 512MB
- Cloud SQL接続あり
- Secret Managerでシークレット管理"
Gemini CLIが生成するTerraform設定:
# terraform/modules/cloud-run/main.tf
# Cloud Runサービス
resource "google_cloud_run_v2_service" "app" {
name = var.service_name
location = var.region
template {
scaling {
min_instance_count = var.min_instances
max_instance_count = var.max_instances
}
containers {
image = var.container_image
resources {
limits = {
cpu = "1000m"
memory = "512Mi"
}
cpu_idle = true # CPU割り当ての最適化
}
# 環境変数
env {
name = "NODE_ENV"
value = var.environment
}
# Secret Manager から取得
env {
name = "DATABASE_URL"
value_source {
secret_key_ref {
secret = google_secret_manager_secret.db_url.secret_id
version = "latest"
}
}
}
# Cloud SQLプロキシ
volume_mounts {
name = "cloudsql"
mount_path = "/cloudsql"
}
# ヘルスチェック
startup_probe {
http_get {
path = "/health"
port = 3000
}
initial_delay_seconds = 5
period_seconds = 10
failure_threshold = 3
}
liveness_probe {
http_get {
path = "/health"
port = 3000
}
period_seconds = 30
}
}
volumes {
name = "cloudsql"
cloud_sql_instance {
instances = [google_sql_database_instance.main.connection_name]
}
}
# VPCコネクタ(内部通信用)
vpc_access {
connector = google_vpc_access_connector.connector.id
egress = "PRIVATE_RANGES_ONLY"
}
}
traffic {
type = "TRAFFIC_TARGET_ALLOCATION_TYPE_LATEST"
percent = 100
}
}
# IAM(未認証アクセスを許可する場合)
resource "google_cloud_run_v2_service_iam_member" "public" {
count = var.allow_unauthenticated ? 1 : 0
project = google_cloud_run_v2_service.app.project
location = google_cloud_run_v2_service.app.location
name = google_cloud_run_v2_service.app.name
role = "roles/run.invoker"
member = "allUsers"
}
# Secret Manager
resource "google_secret_manager_secret" "db_url" {
secret_id = "${var.service_name}-db-url"
replication {
auto {}
}
}
GKEへの本格デプロイ
gemini "このマイクロサービス群をGKEにデプロイする
Kubernetes マニフェストとTerraformを生成して。
サービス: frontend, backend-api, worker
Autoscaling、Ingress、NetworkPolicyも含めて"
# k8s/backend-api/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-api
namespace: production
spec:
replicas: 3
selector:
matchLabels:
app: backend-api
template:
metadata:
labels:
app: backend-api
spec:
serviceAccountName: backend-api-sa
containers:
- name: backend-api
image: asia-northeast1-docker.pkg.dev/PROJECT/repo/backend-api:latest
ports:
- containerPort: 8000
resources:
requests:
cpu: "250m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
readinessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 10
periodSeconds: 5
livenessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 30
periodSeconds: 10
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: app-secrets
key: database-url
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: backend-api-hpa
namespace: production
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: backend-api
minReplicas: 3
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
AWSへのデプロイ設定生成
ECS Fargateデプロイ
gemini "このアプリをAWS ECS Fargateにデプロイする
Terraformを生成して。ALB、ECR、CloudWatch Logs、
Auto Scalingも含めて"
# terraform/aws/ecs.tf
# ECSクラスター
resource "aws_ecs_cluster" "main" {
name = "${var.project_name}-cluster"
setting {
name = "containerInsights"
value = "enabled"
}
}
# タスク定義
resource "aws_ecs_task_definition" "app" {
family = "${var.project_name}-task"
network_mode = "awsvpc"
requires_compatibilities = ["FARGATE"]
cpu = var.task_cpu
memory = var.task_memory
execution_role_arn = aws_iam_role.ecs_execution.arn
task_role_arn = aws_iam_role.ecs_task.arn
container_definitions = jsonencode([
{
name = "app"
image = "${aws_ecr_repository.app.repository_url}:latest"
portMappings = [
{
containerPort = 3000
protocol = "tcp"
}
]
environment = [
{ name = "NODE_ENV", value = var.environment }
]
secrets = [
{
name = "DATABASE_URL"
valueFrom = aws_ssm_parameter.db_url.arn
}
]
logConfiguration = {
logDriver = "awslogs"
options = {
"awslogs-group" = aws_cloudwatch_log_group.app.name
"awslogs-region" = var.region
"awslogs-stream-prefix" = "ecs"
}
}
healthCheck = {
command = ["CMD-SHELL", "curl -f http://localhost:3000/health || exit 1"]
interval = 30
timeout = 5
retries = 3
startPeriod = 60
}
}
])
}
# ECSサービス
resource "aws_ecs_service" "app" {
name = "${var.project_name}-service"
cluster = aws_ecs_cluster.main.id
task_definition = aws_ecs_task_definition.app.arn
desired_count = var.desired_count
launch_type = "FARGATE"
network_configuration {
subnets = var.private_subnet_ids
security_groups = [aws_security_group.ecs.id]
assign_public_ip = false
}
load_balancer {
target_group_arn = aws_lb_target_group.app.arn
container_name = "app"
container_port = 3000
}
deployment_configuration {
maximum_percent = 200
minimum_healthy_percent = 100
}
}
# Auto Scaling
resource "aws_appautoscaling_target" "ecs" {
max_capacity = 10
min_capacity = 2
resource_id = "service/${aws_ecs_cluster.main.name}/${aws_ecs_service.app.name}"
scalable_dimension = "ecs:service:DesiredCount"
service_namespace = "ecs"
}
resource "aws_appautoscaling_policy" "cpu" {
name = "${var.project_name}-cpu-scaling"
policy_type = "TargetTrackingScaling"
resource_id = aws_appautoscaling_target.ecs.resource_id
scalable_dimension = aws_appautoscaling_target.ecs.scalable_dimension
service_namespace = aws_appautoscaling_target.ecs.service_namespace
target_tracking_scaling_policy_configuration {
target_value = 70.0
predefined_metric_specification {
predefined_metric_type = "ECSServiceAverageCPUUtilization"
}
scale_in_cooldown = 300
scale_out_cooldown = 60
}
}
マルチ環境管理
Terraformワークスペースでの環境分離
gemini "dev/staging/productionの3環境を
Terraformワークスペースで管理する構成にして。
環境ごとにリソースサイズとレプリカ数が異なる設定で"
# terraform/environments/variables.tf
variable "environment_config" {
type = map(object({
instance_count = number
cpu = string
memory = string
min_replicas = number
max_replicas = number
db_tier = string
}))
default = {
dev = {
instance_count = 1
cpu = "250m"
memory = "256Mi"
min_replicas = 1
max_replicas = 2
db_tier = "db-f1-micro"
}
staging = {
instance_count = 2
cpu = "500m"
memory = "512Mi"
min_replicas = 2
max_replicas = 5
db_tier = "db-custom-1-3840"
}
production = {
instance_count = 3
cpu = "1000m"
memory = "1Gi"
min_replicas = 3
max_replicas = 20
db_tier = "db-custom-2-7680"
}
}
}
locals {
env = var.environment_config[terraform.workspace]
}
CI/CDパイプラインとの統合
GitHub Actionsでの自動デプロイ
gemini "GitHub ActionsでCloud Runへの自動デプロイを設定して。
mainブランチへのpushでproduction、
developブランチでstagingにデプロイする構成で"
# .github/workflows/deploy.yml
name: Deploy to Cloud Run
on:
push:
branches: [main, develop]
env:
PROJECT_ID: my-project
REGION: asia-northeast1
REGISTRY: asia-northeast1-docker.pkg.dev
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v4
- name: Set environment
run: |
if [ "${{ github.ref }}" = "refs/heads/main" ]; then
echo "ENV=production" >> $GITHUB_ENV
echo "SERVICE=app-production" >> $GITHUB_ENV
else
echo "ENV=staging" >> $GITHUB_ENV
echo "SERVICE=app-staging" >> $GITHUB_ENV
fi
- name: Authenticate to Google Cloud
uses: google-github-actions/auth@v2
with:
workload_identity_provider: ${{ secrets.WIF_PROVIDER }}
service_account: ${{ secrets.SA_EMAIL }}
- name: Configure Docker
run: gcloud auth configure-docker ${{ env.REGISTRY }}
- name: Build and push
run: |
docker build \
--build-arg NODE_ENV=${{ env.ENV }} \
-t ${{ env.REGISTRY }}/${{ env.PROJECT_ID }}/repo/app:${{ github.sha }} \
-t ${{ env.REGISTRY }}/${{ env.PROJECT_ID }}/repo/app:latest \
.
docker push --all-tags ${{ env.REGISTRY }}/${{ env.PROJECT_ID }}/repo/app
- name: Deploy to Cloud Run
uses: google-github-actions/deploy-cloudrun@v2
with:
service: ${{ env.SERVICE }}
region: ${{ env.REGION }}
image: ${{ env.REGISTRY }}/${{ env.PROJECT_ID }}/repo/app:${{ github.sha }}
SES現場でのクラウドデプロイスキル
求められるスキルレベル
レベル1: 手動デプロイ(コンソール操作)
レベル2: CLI/SDKでのデプロイスクリプト作成
レベル3: IaC(Terraform/CloudFormation)でのインフラ管理
レベル4: GitOps・マルチ環境・カナリアデプロイの設計
単価への影響
- 手動デプロイのみ → 一般的なSES案件(月額50〜65万円)
- IaCでのインフラ管理 → 月額10〜15万円のスキルアップ
- CI/CD + マルチ環境管理 → 月額70〜90万円の案件に対応可能
- マルチクラウド + GitOps → SREポジションで月額90〜120万円
まとめ
Gemini CLIを活用したクラウドデプロイの自動化は、インフラ構築の時間を大幅に削減し、品質を向上させます。
この記事のまとめ
- Gemini CLIでTerraform/Kubernetesの設定を自動生成
- GCP・AWSへのデプロイ設定を対話的に構築可能
- マルチ環境管理をTerraformワークスペースで効率化
- CI/CDパイプラインとの統合で完全自動デプロイを実現
- クラウドデプロイスキルはSES市場で高い需要がある
Google Antigravity完全攻略シリーズの他の記事も合わせてご覧ください: