20TD02U_ForAlle_Blooms_Side16_GCP_IAC - itnett/FTD02H-N GitHub Wiki

+++markdown

☁️ Google Cloud Infrastructure as Code (IaC): En Helhetlig Reise

Introduksjon

Google Cloud Infrastructure as Code (IaC) gir deg muligheten til å definere, administrere og provisionere Google Cloud-ressurser gjennom kode. Dette sikrer at infrastrukturen din er konsistent, repeterbar og lett å versjonskontrollere. Verktøy som Google Cloud Deployment Manager, Terraform, og Pulumi brukes ofte for å implementere IaC på Google Cloud Platform (GCP). Denne veiledningen tar deg gjennom de grunnleggende og avanserte aspektene ved Google Cloud IaC, fra konseptene og verktøyene til sikkerhet og DevOps-integrasjoner.

🚀 Grunnleggende Konsepter i Google Cloud IaC

🛠 Google Cloud Deployment Manager

Google Cloud Deployment Manager er en GCP-tjeneste som lar deg definere infrastruktur som kode ved hjelp av YAML, JSON, eller Python-skript. Deployment Manager bruker deklarative maler for å opprette og administrere Google Cloud-ressurser.

Eksempel på en Enkel Deployment Manager-mal:

resources:
  - name: my-vm-instance
    type: compute.v1.instance
    properties:
      zone: us-central1-a
      machineType: zones/us-central1-a/machineTypes/n1-standard-1
      disks:
        - deviceName: boot
          type: PERSISTENT
          boot: true
          initializeParams:
            sourceImage: projects/debian-cloud/global/images/family/debian-9
      networkInterfaces:
        - network: global/networks/default

🌐 Terraform for Google Cloud

Terraform er et populært IaC-verktøy som støtter flere skyleverandører, inkludert Google Cloud. Ved hjelp av Terraform kan du definere og administrere GCP-ressurser ved hjelp av deklarative konfigurasjonsfiler.

Eksempel på en Enkel Terraform-konfigurasjon for Google Cloud:

provider "google" {
  project = "my-gcp-project"
  region  = "us-central1"
}

resource "google_compute_instance" "vm_instance" {
  name         = "terraform-instance"
  machine_type = "n1-standard-1"
  zone         = "us-central1-a"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }

  network_interface {
    network = "default"
    access_config {}
  }
}

🌍 Pulumi for Google Cloud

Pulumi er et verktøy som lar deg skrive infrastrukturkode ved hjelp av vanlige programmeringsspråk som TypeScript, Python, Go, og C#. Pulumi støtter også Google Cloud, og tilbyr en fleksibel måte å definere og administrere ressurser på.

Eksempel på en Enkel Pulumi-konfigurasjon for Google Cloud i TypeScript:

import * as gcp from "@pulumi/gcp";

const instance = new gcp.compute.Instance("instance", {
  machineType: "n1-standard-1",
  zone: "us-central1-a",
  bootDisk: {
    initializeParams: {
      image: "debian-cloud/debian-9"
    }
  },
  networkInterfaces: [{
    network: "default",
    accessConfigs: [{}],
  }]
});

🛠 Avanserte Funksjoner og Bruk

📦 Deployment Manager Templates

Deployment Manager støtter bruk av maler for å definere komplekse ressurser. Dette gjør det mulig å gjenbruke kode og organisere komplekse infrastrukturkonfigurasjoner på en modulær måte.

Eksempel på en Python-basert Template i Deployment Manager:

def GenerateConfig(context):
    resources = [{
        'name': 'my-vm-instance',
        'type': 'compute.v1.instance',
        'properties': {
            'zone': context.properties['zone'],
            'machineType': ''.join(['zones/', context.properties['zone'],
                                    '/machineTypes/', context.properties['machineType']]),
            'disks': [{
                'deviceName': 'boot',
                'type': 'PERSISTENT',
                'boot': True,
                'initializeParams': {
                    'sourceImage': context.properties['sourceImage']
                }
            }],
            'networkInterfaces': [{
                'network': 'global/networks/default'
            }]
        }
    }]
    return {'resources': resources}

🌐 Terraform Modules

Terraform-moduler lar deg organisere og gjenbruke Terraform-kode på en effektiv måte. Moduler kan pakkes og deles, noe som gjør det enkelt å bygge komplekse infrastrukturkomponenter.

Eksempel på en Terraform-modul for Google Cloud:

module "gce_instance" {
  source         = "terraform-google-modules/vm/google"
  project_id     = var.project_id
  zone           = var.zone
  name           = "terraform-instance"
  machine_type   = "n1-standard-1"
  image          = "debian-cloud/debian-9"
  network        = "default"
  subnetwork     = "default"
}

🔄 Terraform State Management på GCP

Terraform bruker en state-fil for å spore tilstanden til ressurser. For samarbeid og sikkerhet kan du lagre state-filen i en Google Cloud Storage-bøtte.

Konfigurasjon av Terraform Backend i GCS:

terraform {
  backend "gcs" {
    bucket  = "my-terraform-state"
    prefix  = "terraform/state"
  }
}

🧪 Testing av GCP IaC

Testing av infrastruktur som kode er essensielt for å sikre at deploymenter fungerer som forventet.

  1. Terraform Plan:

    • Terraform plan lar deg se hva som vil endres før du faktisk utfører endringene.
    terraform plan
    
  2. InSpec for GCP:

    • InSpec er et verktøy for å skrive sikkerhetstester for infrastrukturen din. Med InSpec kan du verifisere at GCP-ressurser overholder policyene dine.

    Eksempel på InSpec-test for GCP:

    describe google_compute_instance(project: 'my-project', zone: 'us-central1-a', name: 'my-instance') do
      it { should exist }
      its('machine_type') { should match 'n1-standard-1' }
    end
    
  3. Terratest for Terraform:

    • Terratest er et Go-bibliotek for å skrive automatiserte tester for Terraform-konfigurasjoner, inkludert de som kjører på GCP.

    Eksempel på Terratest for GCP:

    package test
    
    import (
      "testing"
      "github.com/gruntwork-io/terratest/modules/terraform"
      "github.com/stretchr/testify/assert"
    )
    
    func TestTerraformGCEInstance(t *testing.T) {
      terraformOptions := &terraform.Options{
        TerraformDir: "../path_to_your_terraform_code",
      }
    
      defer terraform.Destroy(t, terraformOptions)
      terraform.InitAndApply(t, terraformOptions)
    
      instanceName := terraform.Output(t, terraformOptions, "instance_name")
      assert.Equal(t, "terraform-instance", instanceName)
    }
    

🛡 Sikkerhetspraksis i Google Cloud IaC

🔐 Sikring av Hemmeligheter

Unngå å hardkode sensitive data som API-nøkler eller passord i IaC-koden din. Bruk Google Secret Manager for sikker håndtering av hemmeligheter.

Eksempel på Bruk av Google Secret Manager i Terraform:

resource "google_secret_manager_secret" "my_secret" {
  secret_id = "my-secret"
  replication {
    automatic = true
  }
}

resource "google_secret_manager_secret_version" "secret_version" {
  secret      = google_secret_manager_secret.my_secret.id
  secret_data = "my-secret-value"
}

📜 IAM Policy-as-Code

Bruk IAM policy-as-code for å definere og håndheve sikkerhetspolicyer for GCP-ressurser. Dette gir bedre kontroll over hvem som har tilgang til hvilke ressurser.

Eksempel på en IAM Policy i Terraform:

resource "google_project_iam_member" "binding" {
  project = "my-gcp-project"
  role    = "roles/viewer"
  member  = "user:[email protected]"
}

🛡 Logging og Overvåking

Aktiver logging og overvåking for alle Google Cloud-ressurser som provisioneres via IaC. Bruk Google Cloud Logging og Monitoring for å overvåke aktivitet og reagere på sikkerhetshendelser.

Aktivering av Logging for GCS-bøtter i Terraform:

resource "google_logging_project_sink" "gcs_logging" {
  name        = "gcs-logging"
  destination = "storage.googleapis.com/my-log-bucket"
  filter      = "resource.type=gcs_bucket"
}

🚀 DevOps Integrasjon

🔄 CI/CD med Google Cloud Build

Google Cloud Build er en CI/CD-tjeneste som kan integreres med dine IaC-konfigurasjoner for å automatisere deployment til GCP.

Eksempel på en Enkel Cloud Build YAML-fil:

steps:
  - name: 'hashicorp

/terraform:light'
    args: ['init']
  - name: 'hashicorp/terraform:light'
    args: ['apply', '-auto-approve']
    env:
      - 'GOOGLE_APPLICATION_CREDENTIALS=/workspace/credentials.json'
  - name: 'gcr.io/cloud-builders/gcloud'
    args: ['app', 'deploy']
images:
  - 'gcr.io/my-project/my-image'

🌍 GitOps med ArgoCD og GCP

For en GitOps-tilnærming kan du bruke ArgoCD sammen med GCP for å automatisere deployment basert på endringer i Git-repositorier.

Eksempel på ArgoCD-konfigurasjon for GCP:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-gcp-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: 'https://github.com/myorg/myrepo.git'
    path: 'gcp'
    targetRevision: HEAD
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: my-gcp-app
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

🧪 Infrastruktur Testing med Terraform og Terratest

Terratest gir deg muligheten til å skrive automatiserte tester for GCP-infrastruktur som er definert med Terraform.

Eksempel på Terratest med GCP:

package test

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

func TestTerraformGCEInstance(t *testing.T) {
  terraformOptions := &terraform.Options{
    TerraformDir: "../path_to_your_terraform_code",
  }

  defer terraform.Destroy(t, terraformOptions)
  terraform.InitAndApply(t, terraformOptions)

  instanceName := terraform.Output(t, terraformOptions, "instance_name")
  assert.Equal(t, "terraform-instance", instanceName)
}

🎯 Konklusjon

Google Cloud Infrastructure as Code (IaC) gir deg verktøyene til å bygge, administrere og sikre skyinfrastruktur på en repeterbar og effektiv måte. Ved å bruke verktøy som Google Cloud Deployment Manager, Terraform, og Pulumi, kombinert med beste praksis for sikkerhet, logging, overvåking og testing, kan du oppnå en robust og skalerbar infrastruktur i Google Cloud. Integrasjon med DevOps-verktøy som Cloud Build og ArgoCD gir mulighet for full automatisering av infrastruktur- og applikasjonslivssyklusen.


Opprettet og optimalisert for Github Wiki. Følg med for flere dyptgående veiledninger om Google Cloud IaC, Terraform, DevOps, og beste praksis for skyinfrastruktur. +++