📑

Google Cloud Unit Test

2025/02/22に公開

Google Cloudのアーキテクチャに対する受け入れテストでは、以下の観点でテストを実施することをお勧めします。Terraformを使用したインフラのテストには、主にTerratest、Inspec、Serverspecなどのツールが使用できます。

以下に主要なテストカテゴリと具体例を示します:

  1. セキュリティコンプライアンステスト
security_test.go
package test

import (
    "testing"
    "github.com/gruntwork-io/terratest/modules/gcp"
    "github.com/stretchr/testify/assert"
)

func TestSecurityCompliance(t *testing.T) {
    projectId := "your-project-id"
    
    // IAMポリシーのテスト
    t.Run("IAM Policy Tests", func(t *testing.T) {
        iamPolicy, err := gcp.GetProjectIamPolicyE(t, projectId)
        assert.NoError(t, err)
        
        // 特権アカウントの確認
        assert.NotContains(t, iamPolicy.Bindings, "roles/owner")
        
        // サービスアカウントの権限確認
        serviceAccounts, err := gcp.GetServiceAccountsE(t, projectId)
        assert.NoError(t, err)
        // 最小権限の原則に従っているか確認
    })
    
    // ファイアウォールルールのテスト
    t.Run("Firewall Rules", func(t *testing.T) {
        rules, err := gcp.GetFirewallRulesE(t, projectId)
        assert.NoError(t, err)
        
        // 公開されているポートの確認
        for _, rule := range rules {
            assert.NotContains(t, rule.Allowed, "0.0.0.0/0")
        }
    })
}
  1. ネットワーク構成テスト
network_test.go
func TestNetworkConfiguration(t *testing.T) {
    projectId := "your-project-id"
    region := "asia-northeast1"
    
    // VPCの設定テスト
    t.Run("VPC Configuration", func(t *testing.T) {
        vpc, err := gcp.GetVPCE(t, projectId, "main-vpc")
        assert.NoError(t, err)
        
        // サブネットの CIDR 範囲チェック
        subnets, err := gcp.GetSubnetsE(t, projectId, region)
        assert.NoError(t, err)
        for _, subnet := range subnets {
            assert.Contains(t, []string{"10.0.0.0/20", "10.1.0.0/20"}, subnet.IpCidrRange)
        }
    })
    
    // Cloud NAT の設定テスト
    t.Run("Cloud NAT Configuration", func(t *testing.T) {
        nats, err := gcp.GetCloudNatsE(t, projectId, region)
        assert.NoError(t, err)
        assert.NotEmpty(t, nats)
    })
}
  1. GKEクラスター設定テスト
gke_test.go
func TestGKEConfiguration(t *testing.T) {
    projectId := "your-project-id"
    region := "asia-northeast1"
    
    t.Run("GKE Cluster Settings", func(t *testing.T) {
        cluster, err := gcp.GetGKEClusterE(t, projectId, region, "main-cluster")
        assert.NoError(t, err)
        
        // プライベートクラスター確認
        assert.True(t, cluster.PrivateClusterConfig.EnablePrivateNodes)
        
        // Workload Identity確認
        assert.NotEmpty(t, cluster.WorkloadIdentityConfig)
        
        // ノードプール設定確認
        nodePools, err := gcp.GetGKENodePoolsE(t, projectId, region, cluster.Name)
        assert.NoError(t, err)
        for _, pool := range nodePools {
            assert.True(t, pool.Autoscaling.Enabled)
            assert.Equal(t, "COS_CONTAINERD", pool.Config.ImageType)
        }
    })
}
  1. 可用性とディザスタリカバリテスト
dr_test.go
func TestDisasterRecovery(t *testing.T) {
    projectId := "your-project-id"
    
    // バックアップ設定のテスト
    t.Run("Backup Configuration", func(t *testing.T) {
        // Cloud SQLバックアップ確認
        instances, err := gcp.GetCloudSQLInstancesE(t, projectId)
        assert.NoError(t, err)
        for _, instance := range instances {
            assert.True(t, instance.BackupConfiguration.Enabled)
        }
        
        // GKEバックアップ確認
        clusters, err := gcp.GetGKEClustersE(t, projectId)
        assert.NoError(t, err)
        for _, cluster := range clusters {
            assert.NotEmpty(t, cluster.BackupConfig)
        }
    })
    
    // リージョン冗長性テスト
    t.Run("Regional Redundancy", func(t *testing.T) {
        // Cloud Storage バケットの冗長性確認
        buckets, err := gcp.GetStorageBucketsE(t, projectId)
        assert.NoError(t, err)
        for _, bucket := range buckets {
            assert.Equal(t, "REGIONAL", bucket.StorageClass)
        }
    })
}
  1. コスト最適化テスト
cost_test.go
func TestCostOptimization(t *testing.T) {
    projectId := "your-project-id"
    
    // 未使用リソースのチェック
    t.Run("Unused Resources", func(t *testing.T) {
        // 未接続の永続ディスク
        disks, err := gcp.GetComputeDisksE(t, projectId)
        assert.NoError(t, err)
        for _, disk := range disks {
            assert.NotEmpty(t, disk.Users, "Unused disk found: %s", disk.Name)
        }
        
        // 未使用のIPアドレス
        ips, err := gcp.GetComputeAddressesE(t, projectId)
        assert.NoError(t, err)
        for _, ip := range ips {
            assert.NotEmpty(t, ip.Users, "Unused IP found: %s", ip.Address)
        }
    })
}
  1. モニタリングと監査設定テスト
monitoring_test.go
func TestMonitoringConfiguration(t *testing.T) {
    projectId := "your-project-id"
    
    // Cloud Loggingの設定確認
    t.Run("Logging Configuration", func(t *testing.T) {
        sinks, err := gcp.GetLoggingSinksE(t, projectId)
        assert.NoError(t, err)
        assert.NotEmpty(t, sinks)
    })
    
    // Cloud Monitoringの設定確認
    t.Run("Monitoring Configuration", func(t *testing.T) {
        // アラートポリシーの確認
        policies, err := gcp.GetMonitoringAlertPoliciesE(t, projectId)
        assert.NoError(t, err)
        assert.NotEmpty(t, policies)
        
        // 必須メトリクスの確認
        for _, policy := range policies {
            assert.Contains(t, []string{
                "CPU使用率",
                "メモリ使用率",
                "ディスク使用率",
            }, policy.DisplayName)
        }
    })
}

テスト実行時の注意点:

  1. 環境変数の設定
export GOOGLE_CLOUD_PROJECT="your-project-id"
export GOOGLE_CREDENTIALS="/path/to/service-account.json"
  1. テスト実行コマンド
go test -v ./... -timeout 30m
  1. テストスイートの構成
  • テストは並行実行可能な形で設計
  • 各テストは独立して実行可能であること
  • テスト失敗時のクリーンアップ処理を含める
  1. 追加推奨事項
  • テスト結果のレポート出力
  • CI/CDパイプラインへの組み込み
  • 定期的な自動テスト実行
  • 結果の監査ログ保存

これらのテストは、アーキテクチャの品質を確保する上で重要な基準となります。実際の環境に合わせてカスタマイズし、必要に応じてテストケースを追加してください。

Discussion