opencode-skills-collection 4.0.68 → 4.0.69
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundled-skills/.antigravity-install-manifest.json +266 -1
- package/bundled-skills/access-review/SKILL.md +394 -0
- package/bundled-skills/access-review/references/details.md +121 -0
- package/bundled-skills/agent-evals/SKILL.md +420 -0
- package/bundled-skills/agent-observability/SKILL.md +346 -0
- package/bundled-skills/agent-observability/references/details.md +786 -0
- package/bundled-skills/ai-agent-security/SKILL.md +393 -0
- package/bundled-skills/ai-agent-security/references/details.md +912 -0
- package/bundled-skills/ai-coding-agent-guardrails/SKILL.md +442 -0
- package/bundled-skills/ai-coding-agent-guardrails/references/details.md +753 -0
- package/bundled-skills/ai-inference-service-mesh/SKILL.md +449 -0
- package/bundled-skills/ai-pipeline-orchestration/SKILL.md +287 -0
- package/bundled-skills/ai-red-teaming/SKILL.md +409 -0
- package/bundled-skills/ai-security-hardening/SKILL.md +343 -0
- package/bundled-skills/ai-sre-incident-response/SKILL.md +336 -0
- package/bundled-skills/alerting-oncall/SKILL.md +458 -0
- package/bundled-skills/alerting-oncall/references/details.md +84 -0
- package/bundled-skills/apk-redteam-pipeline/SKILL.md +446 -0
- package/bundled-skills/argocd-gitops/SKILL.md +469 -0
- package/bundled-skills/arm-templates/SKILL.md +438 -0
- package/bundled-skills/arm-templates/references/details.md +64 -0
- package/bundled-skills/asset-inventory/SKILL.md +412 -0
- package/bundled-skills/asset-inventory/references/details.md +127 -0
- package/bundled-skills/audit-logging/SKILL.md +476 -0
- package/bundled-skills/aws-cloudtrail/SKILL.md +486 -0
- package/bundled-skills/aws-cost-optimization/SKILL.md +331 -0
- package/bundled-skills/aws-ec2/SKILL.md +426 -0
- package/bundled-skills/aws-ecs-fargate/SKILL.md +388 -0
- package/bundled-skills/aws-iam/SKILL.md +463 -0
- package/bundled-skills/aws-lambda/SKILL.md +428 -0
- package/bundled-skills/aws-rds/SKILL.md +380 -0
- package/bundled-skills/aws-s3/SKILL.md +434 -0
- package/bundled-skills/aws-secrets-manager/SKILL.md +486 -0
- package/bundled-skills/aws-vpc/SKILL.md +436 -0
- package/bundled-skills/azure-ai-document-intelligence-ts/SKILL.md +1 -1
- package/bundled-skills/azure-aks/SKILL.md +423 -0
- package/bundled-skills/azure-devops/SKILL.md +457 -0
- package/bundled-skills/azure-functions-devsec/SKILL.md +436 -0
- package/bundled-skills/azure-keyvault/SKILL.md +455 -0
- package/bundled-skills/azure-keyvault/references/details.md +83 -0
- package/bundled-skills/azure-monitor-audit/SKILL.md +379 -0
- package/bundled-skills/azure-networking/SKILL.md +448 -0
- package/bundled-skills/azure-networking/references/details.md +135 -0
- package/bundled-skills/azure-sql/SKILL.md +413 -0
- package/bundled-skills/azure-sql/references/details.md +113 -0
- package/bundled-skills/azure-vms/SKILL.md +402 -0
- package/bundled-skills/azure-vms/references/details.md +134 -0
- package/bundled-skills/backup-recovery/SKILL.md +388 -0
- package/bundled-skills/bb-methodology/SKILL.md +451 -0
- package/bundled-skills/bb-methodology/references/details.md +120 -0
- package/bundled-skills/block-storage/SKILL.md +371 -0
- package/bundled-skills/blue-green-deploy/SKILL.md +453 -0
- package/bundled-skills/blue-green-deploy/references/details.md +90 -0
- package/bundled-skills/bug-bounty/SKILL.md +447 -0
- package/bundled-skills/bug-bounty/references/details.md +1316 -0
- package/bundled-skills/bugcrowd-reporting/SKILL.md +351 -0
- package/bundled-skills/business-continuity/SKILL.md +463 -0
- package/bundled-skills/career-ops/SKILL.md +186 -0
- package/bundled-skills/cdn-setup/SKILL.md +374 -0
- package/bundled-skills/change-management/SKILL.md +438 -0
- package/bundled-skills/change-management/references/details.md +105 -0
- package/bundled-skills/circleci/SKILL.md +475 -0
- package/bundled-skills/cis-benchmarks/SKILL.md +150 -0
- package/bundled-skills/cloudflare-pages/SKILL.md +318 -0
- package/bundled-skills/cloudflare-r2/SKILL.md +353 -0
- package/bundled-skills/cloudflare-workers/SKILL.md +415 -0
- package/bundled-skills/cloudflare-zero-trust/SKILL.md +361 -0
- package/bundled-skills/cloudformation/SKILL.md +461 -0
- package/bundled-skills/constraint-driven-development/SKILL.md +335 -0
- package/bundled-skills/constraint-driven-development/references/floor-guard.md +99 -0
- package/bundled-skills/container-hardening/SKILL.md +126 -0
- package/bundled-skills/container-registries/SKILL.md +435 -0
- package/bundled-skills/container-scanning/SKILL.md +416 -0
- package/bundled-skills/convex-backend/SKILL.md +338 -0
- package/bundled-skills/dast-scanning/SKILL.md +437 -0
- package/bundled-skills/database-backups/SKILL.md +425 -0
- package/bundled-skills/datadog/SKILL.md +487 -0
- package/bundled-skills/dependency-scanning/SKILL.md +457 -0
- package/bundled-skills/devcontainers-nix/SKILL.md +416 -0
- package/bundled-skills/disaster-recovery/SKILL.md +374 -0
- package/bundled-skills/disaster-recovery/references/details.md +219 -0
- package/bundled-skills/dns-management/SKILL.md +375 -0
- package/bundled-skills/docker-compose/SKILL.md +482 -0
- package/bundled-skills/docker-management/SKILL.md +426 -0
- package/bundled-skills/ebpf-observability/SKILL.md +436 -0
- package/bundled-skills/ebpf-observability/references/details.md +542 -0
- package/bundled-skills/elk-stack/SKILL.md +487 -0
- package/bundled-skills/enterprise-vpn-attack/SKILL.md +395 -0
- package/bundled-skills/evidence-hygiene/SKILL.md +404 -0
- package/bundled-skills/feature-flags/SKILL.md +426 -0
- package/bundled-skills/feature-flags/references/details.md +86 -0
- package/bundled-skills/fedramp-compliance/SKILL.md +453 -0
- package/bundled-skills/firebase-app-platform/SKILL.md +381 -0
- package/bundled-skills/firewall-config/SKILL.md +479 -0
- package/bundled-skills/gcp-audit-logs/SKILL.md +452 -0
- package/bundled-skills/gcp-audit-logs/references/details.md +56 -0
- package/bundled-skills/gcp-cloud-functions/SKILL.md +284 -0
- package/bundled-skills/gcp-cloud-sql/SKILL.md +277 -0
- package/bundled-skills/gcp-compute/SKILL.md +319 -0
- package/bundled-skills/gcp-gke/SKILL.md +307 -0
- package/bundled-skills/gcp-networking/SKILL.md +293 -0
- package/bundled-skills/gcp-secret-manager/SKILL.md +421 -0
- package/bundled-skills/gcp-secret-manager/references/details.md +131 -0
- package/bundled-skills/gdpr-compliance/SKILL.md +451 -0
- package/bundled-skills/gdpr-compliance/references/details.md +145 -0
- package/bundled-skills/geo-audit/SKILL.md +368 -0
- package/bundled-skills/geo-brand-mentions/SKILL.md +68 -0
- package/bundled-skills/geo-brand-mentions/references/details.md +471 -0
- package/bundled-skills/geo-citability/SKILL.md +350 -0
- package/bundled-skills/geo-compare/SKILL.md +340 -0
- package/bundled-skills/geo-content/SKILL.md +383 -0
- package/bundled-skills/geo-crawlers/SKILL.md +408 -0
- package/bundled-skills/geo-llmstxt/SKILL.md +464 -0
- package/bundled-skills/geo-platform-optimizer/SKILL.md +314 -0
- package/bundled-skills/geo-proposal/SKILL.md +378 -0
- package/bundled-skills/geo-prospect/SKILL.md +225 -0
- package/bundled-skills/geo-report/SKILL.md +436 -0
- package/bundled-skills/geo-report-pdf/SKILL.md +157 -0
- package/bundled-skills/geo-schema/SKILL.md +408 -0
- package/bundled-skills/geo-technical/SKILL.md +78 -0
- package/bundled-skills/geo-technical/references/details.md +543 -0
- package/bundled-skills/git-workflow/SKILL.md +460 -0
- package/bundled-skills/github-actions/SKILL.md +368 -0
- package/bundled-skills/gitlab-ci/SKILL.md +340 -0
- package/bundled-skills/gpu-kubernetes-operations/SKILL.md +468 -0
- package/bundled-skills/gpu-server-management/SKILL.md +236 -0
- package/bundled-skills/hashicorp-vault/SKILL.md +408 -0
- package/bundled-skills/helm-charts/SKILL.md +469 -0
- package/bundled-skills/hipaa-compliance/SKILL.md +451 -0
- package/bundled-skills/hunt-aspnet/SKILL.md +321 -0
- package/bundled-skills/hunt-ato/SKILL.md +184 -0
- package/bundled-skills/hunt-auth-bypass/SKILL.md +426 -0
- package/bundled-skills/hunt-auth-bypass/references/details.md +80 -0
- package/bundled-skills/hunt-brute-force/SKILL.md +341 -0
- package/bundled-skills/hunt-business-logic/SKILL.md +281 -0
- package/bundled-skills/hunt-cache-poison/SKILL.md +382 -0
- package/bundled-skills/hunt-captcha-bypass/SKILL.md +136 -0
- package/bundled-skills/hunt-cicd/SKILL.md +311 -0
- package/bundled-skills/hunt-clickjacking/SKILL.md +110 -0
- package/bundled-skills/hunt-cors/SKILL.md +335 -0
- package/bundled-skills/hunt-dom/SKILL.md +323 -0
- package/bundled-skills/hunt-exceptional-conditions/SKILL.md +111 -0
- package/bundled-skills/hunt-file-upload/SKILL.md +202 -0
- package/bundled-skills/hunt-fintech-graphql/SKILL.md +289 -0
- package/bundled-skills/hunt-forgot-password/SKILL.md +114 -0
- package/bundled-skills/hunt-grpc/SKILL.md +317 -0
- package/bundled-skills/hunt-host-header/SKILL.md +309 -0
- package/bundled-skills/hunt-html-injection/SKILL.md +106 -0
- package/bundled-skills/hunt-http-smuggling/SKILL.md +129 -0
- package/bundled-skills/hunt-http-smuggling/references/phase2h-smuggling-cachepoison.md +177 -0
- package/bundled-skills/hunt-idor/SKILL.md +434 -0
- package/bundled-skills/hunt-jwt-crypto/SKILL.md +221 -0
- package/bundled-skills/hunt-k8s/SKILL.md +337 -0
- package/bundled-skills/hunt-laravel/SKILL.md +255 -0
- package/bundled-skills/hunt-ldap/SKILL.md +351 -0
- package/bundled-skills/hunt-lfi/SKILL.md +311 -0
- package/bundled-skills/hunt-llm-ai/SKILL.md +289 -0
- package/bundled-skills/hunt-mfa-bypass/SKILL.md +177 -0
- package/bundled-skills/hunt-misc/SKILL.md +378 -0
- package/bundled-skills/hunt-nextjs/SKILL.md +299 -0
- package/bundled-skills/hunt-nodejs/SKILL.md +263 -0
- package/bundled-skills/hunt-nosqli/SKILL.md +210 -0
- package/bundled-skills/hunt-ntlm-info/SKILL.md +314 -0
- package/bundled-skills/hunt-oauth/SKILL.md +459 -0
- package/bundled-skills/hunt-open-redirect/SKILL.md +223 -0
- package/bundled-skills/hunt-race-condition/SKILL.md +381 -0
- package/bundled-skills/hunt-race-condition/references/details.md +159 -0
- package/bundled-skills/hunt-rag-vector/SKILL.md +212 -0
- package/bundled-skills/hunt-rce/SKILL.md +444 -0
- package/bundled-skills/hunt-rce/references/details.md +110 -0
- package/bundled-skills/hunt-saml/SKILL.md +156 -0
- package/bundled-skills/hunt-session/SKILL.md +342 -0
- package/bundled-skills/hunt-shadow-api/SKILL.md +198 -0
- package/bundled-skills/hunt-source-leak/SKILL.md +345 -0
- package/bundled-skills/hunt-spa-api/SKILL.md +163 -0
- package/bundled-skills/hunt-springboot/SKILL.md +285 -0
- package/bundled-skills/hunt-sqli/SKILL.md +466 -0
- package/bundled-skills/hunt-ssrf/SKILL.md +396 -0
- package/bundled-skills/hunt-ssrf/references/details.md +179 -0
- package/bundled-skills/hunt-ssti/SKILL.md +163 -0
- package/bundled-skills/hunt-subdomain/SKILL.md +379 -0
- package/bundled-skills/hunt-tls-network/SKILL.md +399 -0
- package/bundled-skills/hunt-xxe/SKILL.md +466 -0
- package/bundled-skills/i-have-adhd/SKILL.md +170 -0
- package/bundled-skills/identity-access-management/SKILL.md +382 -0
- package/bundled-skills/identity-access-management/references/details.md +524 -0
- package/bundled-skills/incident-management/SKILL.md +484 -0
- package/bundled-skills/incident-response/SKILL.md +448 -0
- package/bundled-skills/incident-response/references/details.md +113 -0
- package/bundled-skills/interview-me/SKILL.md +248 -0
- package/bundled-skills/iso27001-compliance/SKILL.md +460 -0
- package/bundled-skills/jenkins/SKILL.md +462 -0
- package/bundled-skills/jev-use/SKILL.md +158 -0
- package/bundled-skills/kubernetes-hardening/SKILL.md +154 -0
- package/bundled-skills/kubernetes-ops/SKILL.md +449 -0
- package/bundled-skills/kubernetes-ops/references/details.md +108 -0
- package/bundled-skills/kustomize/SKILL.md +478 -0
- package/bundled-skills/linux-administration/SKILL.md +367 -0
- package/bundled-skills/linux-hardening/SKILL.md +154 -0
- package/bundled-skills/llm-app-security/SKILL.md +389 -0
- package/bundled-skills/llm-app-security/references/details.md +674 -0
- package/bundled-skills/llm-caching/SKILL.md +334 -0
- package/bundled-skills/llm-cost-optimization/SKILL.md +311 -0
- package/bundled-skills/llm-fine-tuning/SKILL.md +329 -0
- package/bundled-skills/llm-gateway/SKILL.md +282 -0
- package/bundled-skills/llm-inference-scaling/SKILL.md +286 -0
- package/bundled-skills/llmops-platform-engineering/SKILL.md +472 -0
- package/bundled-skills/load-balancing/SKILL.md +403 -0
- package/bundled-skills/loki-logging/SKILL.md +479 -0
- package/bundled-skills/m365-entra-attack/SKILL.md +423 -0
- package/bundled-skills/mac-mini-llm-lab/SKILL.md +350 -0
- package/bundled-skills/mcp-server-security/SKILL.md +356 -0
- package/bundled-skills/mcp-server-security/references/details.md +745 -0
- package/bundled-skills/mdm-device-management/SKILL.md +404 -0
- package/bundled-skills/mdm-device-management/references/details.md +410 -0
- package/bundled-skills/meme-coin-audit/SKILL.md +402 -0
- package/bundled-skills/mid-engagement-ir-detection/SKILL.md +377 -0
- package/bundled-skills/model-registry-governance/SKILL.md +452 -0
- package/bundled-skills/model-serving-kubernetes/SKILL.md +339 -0
- package/bundled-skills/model-supply-chain-security/SKILL.md +427 -0
- package/bundled-skills/mongodb/SKILL.md +436 -0
- package/bundled-skills/multi-tenant-llm-hosting/SKILL.md +435 -0
- package/bundled-skills/multi-tenant-llm-hosting/references/details.md +211 -0
- package/bundled-skills/mysql/SKILL.md +390 -0
- package/bundled-skills/new-relic/SKILL.md +472 -0
- package/bundled-skills/nfs-storage/SKILL.md +356 -0
- package/bundled-skills/object-storage/SKILL.md +378 -0
- package/bundled-skills/offensive-osint/SKILL.md +443 -0
- package/bundled-skills/okta-attack/SKILL.md +436 -0
- package/bundled-skills/ollama-stack/SKILL.md +379 -0
- package/bundled-skills/openclaw-deployment-hardening/SKILL.md +135 -0
- package/bundled-skills/openclaw-local-mac-mini/SKILL.md +426 -0
- package/bundled-skills/openclaw-local-mac-mini/references/details.md +221 -0
- package/bundled-skills/openclaw-security-hardening/SKILL.md +135 -0
- package/bundled-skills/openshift/SKILL.md +485 -0
- package/bundled-skills/opentelemetry/SKILL.md +438 -0
- package/bundled-skills/opentelemetry/references/details.md +78 -0
- package/bundled-skills/opentofu-migration/SKILL.md +349 -0
- package/bundled-skills/osint-methodology/SKILL.md +460 -0
- package/bundled-skills/osint-methodology/references/details.md +1350 -0
- package/bundled-skills/pci-dss-compliance/SKILL.md +446 -0
- package/bundled-skills/penetration-testing/SKILL.md +152 -0
- package/bundled-skills/performance-tuning/SKILL.md +381 -0
- package/bundled-skills/planetscale/SKILL.md +297 -0
- package/bundled-skills/platform-engineering/SKILL.md +348 -0
- package/bundled-skills/platform-engineering/references/details.md +944 -0
- package/bundled-skills/podman/SKILL.md +405 -0
- package/bundled-skills/policy-as-code/SKILL.md +434 -0
- package/bundled-skills/policy-as-code/references/details.md +204 -0
- package/bundled-skills/postgresql-devsec/SKILL.md +378 -0
- package/bundled-skills/prometheus-grafana/SKILL.md +469 -0
- package/bundled-skills/prompt-injection-defense/SKILL.md +483 -0
- package/bundled-skills/rag-infrastructure/SKILL.md +269 -0
- package/bundled-skills/rag-observability-evals/SKILL.md +444 -0
- package/bundled-skills/rag-observability-evals/references/details.md +92 -0
- package/bundled-skills/recon-scope-triage/SKILL.md +128 -0
- package/bundled-skills/redis/SKILL.md +421 -0
- package/bundled-skills/redteam-report-template/SKILL.md +370 -0
- package/bundled-skills/report-writing/SKILL.md +426 -0
- package/bundled-skills/report-writing/references/details.md +187 -0
- package/bundled-skills/reverse-proxy/SKILL.md +420 -0
- package/bundled-skills/runbook-creation/SKILL.md +438 -0
- package/bundled-skills/runbook-creation/references/details.md +71 -0
- package/bundled-skills/saas-security-posture/SKILL.md +415 -0
- package/bundled-skills/sast-scanning/SKILL.md +444 -0
- package/bundled-skills/sbom-supply-chain/SKILL.md +433 -0
- package/bundled-skills/security-arsenal/SKILL.md +446 -0
- package/bundled-skills/security-arsenal/references/details.md +540 -0
- package/bundled-skills/security-automation/SKILL.md +146 -0
- package/bundled-skills/semantic-versioning/SKILL.md +434 -0
- package/bundled-skills/semantic-versioning/references/details.md +83 -0
- package/bundled-skills/service-mesh/SKILL.md +422 -0
- package/bundled-skills/soc2-compliance/SKILL.md +409 -0
- package/bundled-skills/sops-encryption/SKILL.md +124 -0
- package/bundled-skills/sre-dashboards/SKILL.md +143 -0
- package/bundled-skills/ssh-configuration/SKILL.md +324 -0
- package/bundled-skills/ssl-tls-management/SKILL.md +428 -0
- package/bundled-skills/ssl-tls-management/references/details.md +99 -0
- package/bundled-skills/startup-it-troubleshooting/SKILL.md +415 -0
- package/bundled-skills/supply-chain-attack-recon/SKILL.md +453 -0
- package/bundled-skills/supply-chain-attack-recon/references/details.md +258 -0
- package/bundled-skills/systemd-services/SKILL.md +379 -0
- package/bundled-skills/terraform-aws/SKILL.md +125 -0
- package/bundled-skills/terraform-azure/SKILL.md +415 -0
- package/bundled-skills/terraform-azure/references/details.md +231 -0
- package/bundled-skills/terraform-gcp/SKILL.md +369 -0
- package/bundled-skills/threat-modeling/SKILL.md +487 -0
- package/bundled-skills/user-management/SKILL.md +383 -0
- package/bundled-skills/using-agent-skills/SKILL.md +220 -0
- package/bundled-skills/vector-database-ops/SKILL.md +300 -0
- package/bundled-skills/vendor-management/SKILL.md +439 -0
- package/bundled-skills/vendor-management/references/details.md +109 -0
- package/bundled-skills/vercel-deployments/SKILL.md +296 -0
- package/bundled-skills/vllm-server/SKILL.md +236 -0
- package/bundled-skills/vmware-vcenter-attack/SKILL.md +412 -0
- package/bundled-skills/vpn-setup/SKILL.md +452 -0
- package/bundled-skills/vulnerability-scanning/SKILL.md +448 -0
- package/bundled-skills/waf-setup/SKILL.md +354 -0
- package/bundled-skills/waf-setup/references/details.md +211 -0
- package/bundled-skills/web2-recon/SKILL.md +440 -0
- package/bundled-skills/web2-recon/references/details.md +319 -0
- package/bundled-skills/web3-audit/SKILL.md +445 -0
- package/bundled-skills/web3-audit/references/details.md +224 -0
- package/bundled-skills/windows-hardening/SKILL.md +454 -0
- package/bundled-skills/windows-hardening/references/details.md +204 -0
- package/bundled-skills/windows-server/SKILL.md +318 -0
- package/bundled-skills/zero-trust/SKILL.md +461 -0
- package/package.json +1 -1
- package/skills_index.json +6943 -323
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# Details (moved from SKILL.md)
|
|
2
|
+
|
|
3
|
+
> Extended reference content for `terraform-azure`, kept under `references/` so the entrypoint stays within the audit budget.
|
|
4
|
+
|
|
5
|
+
## SQL Database
|
|
6
|
+
|
|
7
|
+
### database.tf
|
|
8
|
+
|
|
9
|
+
```hcl
|
|
10
|
+
resource "azurerm_mssql_server" "main" {
|
|
11
|
+
name = "${local.name_prefix}-sql"
|
|
12
|
+
resource_group_name = azurerm_resource_group.main.name
|
|
13
|
+
location = azurerm_resource_group.main.location
|
|
14
|
+
version = "12.0"
|
|
15
|
+
administrator_login = "sqladmin"
|
|
16
|
+
administrator_login_password = var.sql_admin_password
|
|
17
|
+
minimum_tls_version = "1.2"
|
|
18
|
+
|
|
19
|
+
azuread_administrator {
|
|
20
|
+
login_username = "SQL Admins"
|
|
21
|
+
object_id = var.aks_admin_group_id
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
tags = local.common_tags
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
resource "azurerm_mssql_database" "main" {
|
|
28
|
+
name = "${var.project_name}-db"
|
|
29
|
+
server_id = azurerm_mssql_server.main.id
|
|
30
|
+
collation = "SQL_Latin1_General_CP1_CI_AS"
|
|
31
|
+
sku_name = var.environment == "prod" ? "BC_Gen5_4" : "GP_S_Gen5_2"
|
|
32
|
+
max_size_gb = var.environment == "prod" ? 256 : 32
|
|
33
|
+
zone_redundant = var.environment == "prod"
|
|
34
|
+
|
|
35
|
+
short_term_retention_policy {
|
|
36
|
+
retention_days = var.environment == "prod" ? 14 : 7
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
tags = local.common_tags
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
resource "azurerm_private_endpoint" "sql" {
|
|
43
|
+
name = "${local.name_prefix}-sql-pe"
|
|
44
|
+
location = azurerm_resource_group.main.location
|
|
45
|
+
resource_group_name = azurerm_resource_group.main.name
|
|
46
|
+
subnet_id = azurerm_subnet.data.id
|
|
47
|
+
|
|
48
|
+
private_service_connection {
|
|
49
|
+
name = "sql-connection"
|
|
50
|
+
private_connection_resource_id = azurerm_mssql_server.main.id
|
|
51
|
+
subresource_names = ["sqlServer"]
|
|
52
|
+
is_manual_connection = false
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
tags = local.common_tags
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
## Outputs
|
|
61
|
+
|
|
62
|
+
### outputs.tf
|
|
63
|
+
|
|
64
|
+
```hcl
|
|
65
|
+
output "resource_group_name" {
|
|
66
|
+
value = azurerm_resource_group.main.name
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
output "aks_cluster_name" {
|
|
70
|
+
value = azurerm_kubernetes_cluster.main.name
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
output "aks_kube_config" {
|
|
74
|
+
value = azurerm_kubernetes_cluster.main.kube_config_raw
|
|
75
|
+
sensitive = true
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
output "key_vault_uri" {
|
|
79
|
+
value = azurerm_key_vault.main.vault_uri
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
output "sql_server_fqdn" {
|
|
83
|
+
value = azurerm_mssql_server.main.fully_qualified_domain_name
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
output "vnet_id" {
|
|
87
|
+
value = azurerm_virtual_network.main.id
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
## Terraform Workflow Commands
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
# Initialize (download providers, configure backend)
|
|
96
|
+
terraform init
|
|
97
|
+
|
|
98
|
+
# Validate configuration syntax
|
|
99
|
+
terraform validate
|
|
100
|
+
|
|
101
|
+
# Format all .tf files
|
|
102
|
+
terraform fmt -recursive
|
|
103
|
+
|
|
104
|
+
# Plan changes for a specific environment
|
|
105
|
+
terraform plan \
|
|
106
|
+
-var-file="terraform.prod.tfvars" \
|
|
107
|
+
-var="sql_admin_password=$(az keyvault secret show --vault-name ops-vault --name sql-pass --query value -o tsv)" \
|
|
108
|
+
-out=tfplan
|
|
109
|
+
|
|
110
|
+
# Apply the saved plan
|
|
111
|
+
terraform apply tfplan
|
|
112
|
+
|
|
113
|
+
# Apply with auto-approve (CI/CD pipelines only)
|
|
114
|
+
terraform apply \
|
|
115
|
+
-var-file="terraform.prod.tfvars" \
|
|
116
|
+
-auto-approve
|
|
117
|
+
|
|
118
|
+
# Destroy infrastructure (careful!)
|
|
119
|
+
terraform plan -destroy -var-file="terraform.prod.tfvars" -out=destroyplan
|
|
120
|
+
terraform apply destroyplan
|
|
121
|
+
|
|
122
|
+
# Import existing resources into state
|
|
123
|
+
terraform import azurerm_resource_group.main /subscriptions/{sub}/resourceGroups/myapp-prod-rg
|
|
124
|
+
|
|
125
|
+
# Show current state
|
|
126
|
+
terraform state list
|
|
127
|
+
terraform state show azurerm_kubernetes_cluster.main
|
|
128
|
+
|
|
129
|
+
# Move resources in state (renaming)
|
|
130
|
+
terraform state mv azurerm_resource_group.old azurerm_resource_group.new
|
|
131
|
+
|
|
132
|
+
# Refresh state from real infrastructure
|
|
133
|
+
terraform refresh -var-file="terraform.prod.tfvars"
|
|
134
|
+
|
|
135
|
+
# Unlock stuck state
|
|
136
|
+
terraform force-unlock LOCK_ID
|
|
137
|
+
|
|
138
|
+
# Use workspaces for environment isolation
|
|
139
|
+
terraform workspace new prod
|
|
140
|
+
terraform workspace select prod
|
|
141
|
+
terraform workspace list
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
## Module Structure
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
project/
|
|
149
|
+
modules/
|
|
150
|
+
networking/
|
|
151
|
+
main.tf
|
|
152
|
+
variables.tf
|
|
153
|
+
outputs.tf
|
|
154
|
+
aks/
|
|
155
|
+
main.tf
|
|
156
|
+
variables.tf
|
|
157
|
+
outputs.tf
|
|
158
|
+
database/
|
|
159
|
+
main.tf
|
|
160
|
+
variables.tf
|
|
161
|
+
outputs.tf
|
|
162
|
+
environments/
|
|
163
|
+
dev/
|
|
164
|
+
main.tf
|
|
165
|
+
terraform.tfvars
|
|
166
|
+
backend.tf
|
|
167
|
+
prod/
|
|
168
|
+
main.tf
|
|
169
|
+
terraform.tfvars
|
|
170
|
+
backend.tf
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Using Modules
|
|
174
|
+
|
|
175
|
+
```hcl
|
|
176
|
+
# environments/prod/main.tf
|
|
177
|
+
module "networking" {
|
|
178
|
+
source = "../../modules/networking"
|
|
179
|
+
|
|
180
|
+
environment = var.environment
|
|
181
|
+
location = var.location
|
|
182
|
+
project_name = var.project_name
|
|
183
|
+
address_space = ["10.0.0.0/16"]
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
module "aks" {
|
|
187
|
+
source = "../../modules/aks"
|
|
188
|
+
|
|
189
|
+
environment = var.environment
|
|
190
|
+
location = var.location
|
|
191
|
+
project_name = var.project_name
|
|
192
|
+
resource_group_name = module.networking.resource_group_name
|
|
193
|
+
subnet_id = module.networking.aks_subnet_id
|
|
194
|
+
admin_group_id = var.aks_admin_group_id
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
module "database" {
|
|
198
|
+
source = "../../modules/database"
|
|
199
|
+
|
|
200
|
+
environment = var.environment
|
|
201
|
+
location = var.location
|
|
202
|
+
project_name = var.project_name
|
|
203
|
+
resource_group_name = module.networking.resource_group_name
|
|
204
|
+
subnet_id = module.networking.data_subnet_id
|
|
205
|
+
admin_password = var.sql_admin_password
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
## Troubleshooting
|
|
211
|
+
|
|
212
|
+
| Symptom | Cause | Fix |
|
|
213
|
+
|---------|-------|-----|
|
|
214
|
+
| `Error acquiring state lock` | Previous run crashed or concurrent access | Run `terraform force-unlock LOCK_ID` after confirming no other run is active |
|
|
215
|
+
| `Provider version constraint error` | Version conflict in required_providers | Run `terraform init -upgrade` to fetch compatible versions |
|
|
216
|
+
| `Resource already exists` | Resource created outside Terraform | Import with `terraform import` to bring it under management |
|
|
217
|
+
| `Cycle detected` in plan | Circular dependency between resources | Restructure references or use `depends_on` carefully |
|
|
218
|
+
| State file corruption | Concurrent writes or manual edits | Restore from state backup in the storage account versioning |
|
|
219
|
+
| `AuthorizationFailed` during apply | Service principal lacks RBAC permissions | Assign Contributor role on subscription or resource group |
|
|
220
|
+
| Plan shows unexpected changes | Drift from manual portal changes | Run `terraform refresh` then `terraform plan` to reconcile |
|
|
221
|
+
| Module source not found | Incorrect relative path or registry reference | Verify path in `source` attribute; run `terraform init` again |
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
## Related Skills
|
|
225
|
+
|
|
226
|
+
- `arm-templates` -- Azure-native IaC alternative with Bicep.
|
|
227
|
+
- `azure-aks` -- AKS cluster details and kubectl operations.
|
|
228
|
+
- `azure-networking` -- VNet and NSG design referenced in Terraform configs.
|
|
229
|
+
- `azure-sql` -- Database provisioning and security configurations.
|
|
230
|
+
- `azure-vms` -- VM sizing and scale set configurations.
|
|
231
|
+
|
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: terraform-gcp
|
|
3
|
+
description: Provision GCP infrastructure with Terraform. Configure providers and
|
|
4
|
+
deploy Google Cloud resources. Use when implementing IaC for GCP.
|
|
5
|
+
category: devops
|
|
6
|
+
risk: critical
|
|
7
|
+
source: https://github.com/BagelHole/DevOps-Security-Agent-Skills
|
|
8
|
+
source_repo: BagelHole/DevOps-Security-Agent-Skills
|
|
9
|
+
source_type: community
|
|
10
|
+
date_added: '2026-09-20'
|
|
11
|
+
license: MIT
|
|
12
|
+
license_source: https://github.com/BagelHole/DevOps-Security-Agent-Skills/blob/main/LICENSE
|
|
13
|
+
compatibility: Requires the relevant OS/platform tooling and privileged access where
|
|
14
|
+
noted. Docs-only; helper scripts and templates not bundled.
|
|
15
|
+
metadata:
|
|
16
|
+
author: devops-skills
|
|
17
|
+
version: '1.0'
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Terraform GCP
|
|
21
|
+
|
|
22
|
+
Provision and manage Google Cloud Platform infrastructure using Terraform with the `hashicorp/google` provider.
|
|
23
|
+
|
|
24
|
+
## When to Use
|
|
25
|
+
|
|
26
|
+
- Defining GCP infrastructure as code for repeatable, auditable deployments
|
|
27
|
+
- Managing multi-environment setups (dev, staging, production) from a single codebase
|
|
28
|
+
- Provisioning complex resource graphs (VPC + GKE + Cloud SQL + IAM) in one plan
|
|
29
|
+
- Integrating infrastructure changes into CI/CD pipelines with plan/apply stages
|
|
30
|
+
|
|
31
|
+
## Prerequisites
|
|
32
|
+
|
|
33
|
+
- Terraform >= 1.5 installed
|
|
34
|
+
- Google Cloud SDK or a service account key for CI
|
|
35
|
+
- A GCP project with billing enabled
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
gcloud auth application-default login # local dev
|
|
39
|
+
export GOOGLE_APPLICATION_CREDENTIALS="sa.json" # CI/CD
|
|
40
|
+
terraform version
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Provider Configuration
|
|
44
|
+
|
|
45
|
+
```hcl
|
|
46
|
+
# versions.tf
|
|
47
|
+
terraform {
|
|
48
|
+
required_version = ">= 1.5"
|
|
49
|
+
required_providers {
|
|
50
|
+
google = { source = "hashicorp/google"; version = "~> 5.0" }
|
|
51
|
+
google-beta = { source = "hashicorp/google-beta"; version = "~> 5.0" }
|
|
52
|
+
}
|
|
53
|
+
backend "gcs" { bucket = "my-project-tf-state"; prefix = "terraform/state" }
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
provider "google" { project = var.project_id; region = var.region }
|
|
57
|
+
provider "google-beta" { project = var.project_id; region = var.region }
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
```hcl
|
|
61
|
+
# variables.tf
|
|
62
|
+
variable "project_id" { type = string }
|
|
63
|
+
variable "region" { type = string; default = "us-central1" }
|
|
64
|
+
variable "environment" {
|
|
65
|
+
type = string
|
|
66
|
+
validation {
|
|
67
|
+
condition = contains(["dev", "staging", "production"], var.environment)
|
|
68
|
+
error_message = "Must be dev, staging, or production."
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Project Setup and State Bucket
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
gcloud storage buckets create gs://my-project-tf-state \
|
|
77
|
+
--location=us-central1 --uniform-bucket-level-access --public-access-prevention
|
|
78
|
+
gcloud storage buckets update gs://my-project-tf-state --versioning
|
|
79
|
+
|
|
80
|
+
terraform init
|
|
81
|
+
terraform plan -var="project_id=my-project" -var="environment=production" -out=tfplan
|
|
82
|
+
terraform apply tfplan
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
```hcl
|
|
86
|
+
resource "google_project_service" "apis" {
|
|
87
|
+
for_each = toset([
|
|
88
|
+
"compute.googleapis.com", "container.googleapis.com",
|
|
89
|
+
"sqladmin.googleapis.com", "servicenetworking.googleapis.com",
|
|
90
|
+
"cloudfunctions.googleapis.com", "run.googleapis.com",
|
|
91
|
+
"secretmanager.googleapis.com", "artifactregistry.googleapis.com",
|
|
92
|
+
])
|
|
93
|
+
project = var.project_id
|
|
94
|
+
service = each.value
|
|
95
|
+
disable_dependent_services = false
|
|
96
|
+
disable_on_destroy = false
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Networking Module
|
|
101
|
+
|
|
102
|
+
```hcl
|
|
103
|
+
# modules/networking/main.tf
|
|
104
|
+
resource "google_compute_network" "vpc" {
|
|
105
|
+
name = "${var.environment}-vpc"
|
|
106
|
+
auto_create_subnetworks = false
|
|
107
|
+
routing_mode = "REGIONAL"
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
resource "google_compute_subnetwork" "main" {
|
|
111
|
+
name = "${var.environment}-main-subnet"
|
|
112
|
+
ip_cidr_range = var.subnet_cidr
|
|
113
|
+
region = var.region
|
|
114
|
+
network = google_compute_network.vpc.id
|
|
115
|
+
private_ip_google_access = true
|
|
116
|
+
log_config { aggregation_interval = "INTERVAL_5_SEC"; flow_sampling = 0.5 }
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
resource "google_compute_subnetwork" "gke" {
|
|
120
|
+
name = "${var.environment}-gke-subnet"
|
|
121
|
+
ip_cidr_range = var.gke_subnet_cidr
|
|
122
|
+
region = var.region
|
|
123
|
+
network = google_compute_network.vpc.id
|
|
124
|
+
private_ip_google_access = true
|
|
125
|
+
secondary_ip_range { range_name = "pods"; ip_cidr_range = var.pods_cidr }
|
|
126
|
+
secondary_ip_range { range_name = "services"; ip_cidr_range = var.services_cidr }
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
resource "google_compute_firewall" "allow_iap" {
|
|
130
|
+
name = "${var.environment}-allow-iap"
|
|
131
|
+
network = google_compute_network.vpc.name
|
|
132
|
+
allow { protocol = "tcp"; ports = ["22", "3389"] }
|
|
133
|
+
source_ranges = ["35.235.240.0/20"]
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
resource "google_compute_router" "router" {
|
|
137
|
+
name = "${var.environment}-router"
|
|
138
|
+
region = var.region
|
|
139
|
+
network = google_compute_network.vpc.id
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
resource "google_compute_router_nat" "nat" {
|
|
143
|
+
name = "${var.environment}-nat"
|
|
144
|
+
router = google_compute_router.router.name
|
|
145
|
+
region = var.region
|
|
146
|
+
nat_ip_allocate_option = "AUTO_ONLY"
|
|
147
|
+
source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"
|
|
148
|
+
log_config { enable = true; filter = "ERRORS_ONLY" }
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
output "vpc_id" { value = google_compute_network.vpc.id }
|
|
152
|
+
output "gke_subnet_id" { value = google_compute_subnetwork.gke.id }
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## GKE Cluster Module
|
|
156
|
+
|
|
157
|
+
```hcl
|
|
158
|
+
# modules/gke/main.tf
|
|
159
|
+
resource "google_container_cluster" "primary" {
|
|
160
|
+
name = "${var.environment}-cluster"
|
|
161
|
+
location = var.region
|
|
162
|
+
|
|
163
|
+
release_channel { channel = var.release_channel }
|
|
164
|
+
workload_identity_config { workload_pool = "${var.project_id}.svc.id.goog" }
|
|
165
|
+
network = var.vpc_name
|
|
166
|
+
subnetwork = var.gke_subnet_name
|
|
167
|
+
|
|
168
|
+
ip_allocation_policy {
|
|
169
|
+
cluster_secondary_range_name = "pods"
|
|
170
|
+
services_secondary_range_name = "services"
|
|
171
|
+
}
|
|
172
|
+
private_cluster_config {
|
|
173
|
+
enable_private_nodes = true
|
|
174
|
+
master_ipv4_cidr_block = "172.16.0.0/28"
|
|
175
|
+
}
|
|
176
|
+
network_policy { enabled = true }
|
|
177
|
+
logging_config { enable_components = ["SYSTEM_COMPONENTS", "WORKLOADS"] }
|
|
178
|
+
monitoring_config {
|
|
179
|
+
enable_components = ["SYSTEM_COMPONENTS", "WORKLOADS"]
|
|
180
|
+
managed_prometheus { enabled = true }
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
remove_default_node_pool = true
|
|
184
|
+
initial_node_count = 1
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
resource "google_container_node_pool" "primary" {
|
|
188
|
+
name = "primary-pool"
|
|
189
|
+
cluster = google_container_cluster.primary.name
|
|
190
|
+
location = var.region
|
|
191
|
+
|
|
192
|
+
initial_node_count = var.initial_node_count
|
|
193
|
+
autoscaling { min_node_count = var.min_nodes; max_node_count = var.max_nodes }
|
|
194
|
+
management { auto_repair = true; auto_upgrade = true }
|
|
195
|
+
|
|
196
|
+
node_config {
|
|
197
|
+
machine_type = var.machine_type
|
|
198
|
+
disk_size_gb = 100
|
|
199
|
+
oauth_scopes = ["https://www.googleapis.com/auth/cloud-platform"]
|
|
200
|
+
shielded_instance_config { enable_secure_boot = true; enable_integrity_monitoring = true }
|
|
201
|
+
metadata = { disable-legacy-endpoints = "true" }
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
output "cluster_name" { value = google_container_cluster.primary.name }
|
|
206
|
+
output "cluster_endpoint" { value = google_container_cluster.primary.endpoint; sensitive = true }
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## Cloud SQL Module
|
|
210
|
+
|
|
211
|
+
```hcl
|
|
212
|
+
# modules/cloud-sql/main.tf
|
|
213
|
+
resource "google_sql_database_instance" "main" {
|
|
214
|
+
name = "${var.environment}-db"
|
|
215
|
+
database_version = var.database_version
|
|
216
|
+
region = var.region
|
|
217
|
+
|
|
218
|
+
settings {
|
|
219
|
+
tier = var.tier
|
|
220
|
+
availability_type = var.environment == "production" ? "REGIONAL" : "ZONAL"
|
|
221
|
+
disk_type = "PD_SSD"
|
|
222
|
+
disk_size = var.disk_size
|
|
223
|
+
disk_autoresize = true
|
|
224
|
+
|
|
225
|
+
backup_configuration {
|
|
226
|
+
enabled = true
|
|
227
|
+
start_time = "02:00"
|
|
228
|
+
point_in_time_recovery_enabled = true
|
|
229
|
+
backup_retention_settings { retained_backups = var.environment == "production" ? 30 : 7 }
|
|
230
|
+
}
|
|
231
|
+
ip_configuration {
|
|
232
|
+
ipv4_enabled = false
|
|
233
|
+
private_network = var.vpc_id
|
|
234
|
+
require_ssl = true
|
|
235
|
+
}
|
|
236
|
+
database_flags { name = "max_connections"; value = var.max_connections }
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
deletion_protection = var.environment == "production"
|
|
240
|
+
depends_on = [var.private_vpc_connection]
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
resource "google_sql_database" "app" { name = var.database_name; instance = google_sql_database_instance.main.name }
|
|
244
|
+
resource "google_sql_user" "app" { name = var.db_user; instance = google_sql_database_instance.main.name; password = random_password.db.result }
|
|
245
|
+
resource "random_password" "db" { length = 32; special = true }
|
|
246
|
+
|
|
247
|
+
output "connection_name" { value = google_sql_database_instance.main.connection_name }
|
|
248
|
+
output "private_ip" { value = google_sql_database_instance.main.private_ip_address }
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
## IAM and Service Accounts
|
|
252
|
+
|
|
253
|
+
```hcl
|
|
254
|
+
resource "google_service_account" "gke_nodes" {
|
|
255
|
+
account_id = "${var.environment}-gke-nodes"
|
|
256
|
+
display_name = "GKE Node Pool SA"
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
resource "google_project_iam_member" "gke_nodes" {
|
|
260
|
+
for_each = toset([
|
|
261
|
+
"roles/logging.logWriter", "roles/monitoring.metricWriter",
|
|
262
|
+
"roles/artifactregistry.reader",
|
|
263
|
+
])
|
|
264
|
+
project = var.project_id
|
|
265
|
+
role = each.value
|
|
266
|
+
member = "serviceAccount:${google_service_account.gke_nodes.email}"
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
resource "google_service_account" "app" {
|
|
270
|
+
account_id = "${var.environment}-app"
|
|
271
|
+
display_name = "Application SA"
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
resource "google_service_account_iam_member" "workload_identity" {
|
|
275
|
+
service_account_id = google_service_account.app.name
|
|
276
|
+
role = "roles/iam.workloadIdentityUser"
|
|
277
|
+
member = "serviceAccount:${var.project_id}.svc.id.goog[myapp/app-ksa]"
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
## Root Module Composition
|
|
282
|
+
|
|
283
|
+
```hcl
|
|
284
|
+
module "networking" {
|
|
285
|
+
source = "./modules/networking"
|
|
286
|
+
project_id = var.project_id
|
|
287
|
+
environment = var.environment
|
|
288
|
+
region = var.region
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
module "gke" {
|
|
292
|
+
source = "./modules/gke"
|
|
293
|
+
project_id = var.project_id
|
|
294
|
+
environment = var.environment
|
|
295
|
+
region = var.region
|
|
296
|
+
vpc_name = module.networking.vpc_id
|
|
297
|
+
gke_subnet_name = module.networking.gke_subnet_id
|
|
298
|
+
node_sa_email = google_service_account.gke_nodes.email
|
|
299
|
+
depends_on = [module.networking]
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
module "database" {
|
|
303
|
+
source = "./modules/cloud-sql"
|
|
304
|
+
project_id = var.project_id
|
|
305
|
+
environment = var.environment
|
|
306
|
+
region = var.region
|
|
307
|
+
vpc_id = module.networking.vpc_id
|
|
308
|
+
database_version = "POSTGRES_16"
|
|
309
|
+
tier = "db-custom-4-16384"
|
|
310
|
+
private_vpc_connection = module.networking.private_vpc_connection
|
|
311
|
+
depends_on = [module.networking]
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## Environment Configuration
|
|
316
|
+
|
|
317
|
+
```hcl
|
|
318
|
+
# environments/production.tfvars
|
|
319
|
+
project_id = "my-company-prod"
|
|
320
|
+
environment = "production"
|
|
321
|
+
region = "us-central1"
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
```bash
|
|
325
|
+
terraform plan -var-file=environments/production.tfvars -out=tfplan
|
|
326
|
+
terraform apply tfplan
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
## CI/CD Integration
|
|
330
|
+
|
|
331
|
+
```bash
|
|
332
|
+
terraform init -input=false
|
|
333
|
+
terraform validate && terraform fmt -check
|
|
334
|
+
terraform plan -var-file=environments/${ENV}.tfvars -out=tfplan -input=false
|
|
335
|
+
terraform apply -input=false tfplan
|
|
336
|
+
|
|
337
|
+
# Import existing resources
|
|
338
|
+
terraform import google_compute_network.vpc projects/${PROJECT_ID}/global/networks/prod-vpc
|
|
339
|
+
|
|
340
|
+
# State management
|
|
341
|
+
terraform state list
|
|
342
|
+
terraform state mv google_compute_instance.old google_compute_instance.new
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
## Troubleshooting
|
|
346
|
+
|
|
347
|
+
| Symptom | Cause | Fix |
|
|
348
|
+
|---------|-------|-----|
|
|
349
|
+
| `Error 403: Access Not Configured` | API not enabled | Add API to `google_project_service` resources |
|
|
350
|
+
| `Error acquiring the state lock` | Concurrent run or stale lock | Run `terraform force-unlock LOCK_ID` after verification |
|
|
351
|
+
| `Resource already exists` | Created outside Terraform | Import with `terraform import` |
|
|
352
|
+
| `Quota exceeded` | Project quota too low | Request increase in Cloud Console > Quotas |
|
|
353
|
+
| Plan shows destroy/recreate | Changed force-new attribute | Use `moved` blocks or `terraform state mv` |
|
|
354
|
+
| `Backend initialization required` | Changed backend config | Run `terraform init -migrate-state` |
|
|
355
|
+
| Cycle in resource graph | Circular references | Refactor with data sources; split applies |
|
|
356
|
+
|
|
357
|
+
## Related Skills
|
|
358
|
+
|
|
359
|
+
- **gcp-networking** - VPC and firewall resources managed by Terraform
|
|
360
|
+
- **gcp-gke** - GKE cluster provisioning with Terraform modules
|
|
361
|
+
- **gcp-cloud-sql** - Cloud SQL instance management via Terraform
|
|
362
|
+
- **gcp-compute** - Compute Engine resources defined in Terraform
|
|
363
|
+
- **gcp-cloud-functions** - Serverless function deployment with Terraform
|
|
364
|
+
|
|
365
|
+
## Limitations
|
|
366
|
+
|
|
367
|
+
- Infrastructure commands can disrupt services: confirm target host/scope and have backups/snapshots before mutating state.
|
|
368
|
+
- Docs-only import: upstream scripts and templates not bundled.
|
|
369
|
+
|