𝕏 f B! L
案件・求人数 12,345
案件を探す(準備中) エージェントを探す(準備中) お役立ち情報 ログイン
案件・求人数 12,345
Gemini CLIでクラウドデプロイを自動化する方法|GCP・AWS・Azure対応ガイド

Gemini CLIでクラウドデプロイを自動化する方法|GCP・AWS・Azure対応ガイド

Gemini CLIクラウドデプロイIaCSESエンジニア
目次
⚡ 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によるクラウドデプロイ自動化の全体像

クラウドデプロイの設定は、サービスの数だけ複雑さが増します。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完全攻略シリーズの他の記事も合わせてご覧ください:

SES案件をお探しですか?

SES記事をもっと読む →
🏗️

SES BASE 編集長

SES業界歴10年以上のメンバーが在籍する編集チーム。SES企業での営業・エンジニア経験、フリーランス独立経験を持つメンバーが、業界のリアルな情報をお届けします。

📊 業界データに基づく記事制作 🔍 IPA・経済産業省データ参照 💼 SES実務経験者が執筆・監修