📑
Google Cloud Unit Test
Google Cloudのアーキテクチャに対する受け入れテストでは、以下の観点でテストを実施することをお勧めします。Terraformを使用したインフラのテストには、主にTerratest、Inspec、Serverspecなどのツールが使用できます。
以下に主要なテストカテゴリと具体例を示します:
- セキュリティコンプライアンステスト
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")
}
})
}
- ネットワーク構成テスト
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)
})
}
- 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)
}
})
}
- 可用性とディザスタリカバリテスト
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)
}
})
}
- コスト最適化テスト
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)
}
})
}
- モニタリングと監査設定テスト
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)
}
})
}
テスト実行時の注意点:
- 環境変数の設定
export GOOGLE_CLOUD_PROJECT="your-project-id"
export GOOGLE_CREDENTIALS="/path/to/service-account.json"
- テスト実行コマンド
go test -v ./... -timeout 30m
- テストスイートの構成
- テストは並行実行可能な形で設計
- 各テストは独立して実行可能であること
- テスト失敗時のクリーンアップ処理を含める
- 追加推奨事項
- テスト結果のレポート出力
- CI/CDパイプラインへの組み込み
- 定期的な自動テスト実行
- 結果の監査ログ保存
これらのテストは、アーキテクチャの品質を確保する上で重要な基準となります。実際の環境に合わせてカスタマイズし、必要に応じてテストケースを追加してください。
Discussion