20TD02U_ForAlle_Blooms_Side15_AWS_IAC - itnett/FTD02H-N GitHub Wiki

+++markdown

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

Introduksjon

AWS (Amazon Web Services) Infrastructure as Code (IaC) lar deg definere og administrere skyinfrastruktur på en deklarativ måte gjennom kode. Ved å bruke verktøy som AWS CloudFormation, AWS CDK (Cloud Development Kit), og Terraform, kan du provisionere, oppdatere, og administrere AWS-ressurser på en konsistent, repeterbar, og sikker måte. Denne veiledningen tar deg med på en omfattende reise gjennom AWS IaC, fra grunnleggende konsepter til avansert bruk, sikkerhetspraksis, og integrasjon med DevOps.

🚀 Grunnleggende Konsepter i AWS IaC

🛠 AWS CloudFormation

AWS CloudFormation er en tjeneste som lar deg definere infrastruktur som kode ved hjelp av JSON- eller YAML-maler. CloudFormation håndterer opprettelse, oppdatering, og sletting av AWS-ressurser på en deklarativ måte.

Eksempel på en Enkel CloudFormation-mal:

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  MyBucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      BucketName: 'my-example-bucket'

🌐 AWS CDK (Cloud Development Kit)

AWS CDK er et rammeverk som lar deg definere AWS-infrastruktur ved hjelp av kjente programmeringsspråk som TypeScript, Python, Java, og C#. CDK bygger på CloudFormation, og genererer automatisk CloudFormation-maler basert på koden din.

Eksempel på en Enkel CDK-applikasjon i TypeScript:

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';

export class MyStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    new s3.Bucket(this, 'MyBucket', {
      bucketName: 'my-example-bucket',
      versioned: true
    });
  }
}

const app = new cdk.App();
new MyStack(app, 'MyStack');

🌍 Terraform for AWS

Terraform er et kraftig IaC-verktøy som støtter flere skyleverandører, inkludert AWS. Ved hjelp av deklarative konfigurasjonsfiler kan du definere og provisionere AWS-infrastruktur på en effektiv og repeterbar måte.

Eksempel på en Enkel Terraform-konfigurasjon for AWS:

provider "aws" {
  region = "us-west-2"
}

resource "aws_s3_bucket" "my_bucket" {
  bucket = "my-example-bucket"
  acl    = "private"
}

🛠 Avanserte Funksjoner og Bruk

📦 CloudFormation Stacks og Nested Stacks

CloudFormation-stakker lar deg organisere og administrere relaterte AWS-ressurser som en enhet. Du kan også bruke nested stacks for å dele opp komplekse infrastrukturkonfigurasjoner i mindre, gjenbrukbare moduler.

Eksempel på en Nested Stack i CloudFormation:

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  VPCStack:
    Type: 'AWS::CloudFormation::Stack'
    Properties:
      TemplateURL: 'https://s3.amazonaws.com/my-bucket/vpc-stack.yaml'
      Parameters:
        VpcId: !Ref VpcId

🌐 AWS CDK Construct Libraries

AWS CDK har et rikt bibliotek av Constructs, som er gjenbrukbare komponenter for å bygge komplekse ressurser. Disse konstruksjonene gir et høyt abstraksjonsnivå, noe som forenkler opprettelsen av infrastruktur.

Eksempel på Bruk av CDK Construct for en Fargate-tjeneste:

import * as ecs from 'aws-cdk-lib/aws-ecs';
import * as ec2 from 'aws-cdk-lib/aws-ec2';

const vpc = new ec2.Vpc(this, 'VPC');
const cluster = new ecs.Cluster(this, 'Cluster', { vpc });

new ecs_patterns.ApplicationLoadBalancedFargateService(this, 'FargateService', {
  cluster,
  taskImageOptions: {
    image: ecs.ContainerImage.fromRegistry('amazon/amazon-ecs-sample'),
  },
});

🔄 Terraform State Management i AWS

Terraform bruker en state-fil for å spore tilstanden til infrastrukturressursene. Du kan lagre denne state-filen i en S3-bøtte for samarbeid og sikkerhet, og låse den ved hjelp av DynamoDB for å unngå race conditions.

Konfigurasjon av Terraform Backend i AWS:

terraform {
  backend "s3" {
    bucket         = "terraform-state-bucket"
    key            = "global/s3/terraform.tfstate"
    region         = "us-west-2"
    dynamodb_table = "terraform-locks"
  }
}

🧪 Testing av AWS IaC

Testing av IaC er avgjørende for å sikre at infrastrukturen din fungerer som forventet. Her er noen teknikker og verktøy for å teste AWS IaC.

  1. CloudFormation Change Sets:

    • CloudFormation Change Sets lar deg se hvilke endringer som vil bli gjort i stakken før du utfører dem.
    aws cloudformation create-change-set --stack-name my-stack --template-body file://template.yaml --change-set-name my-change-set
    
  2. AWS CDK Unit Tests:

    • CDK har støtte for enhetstester for å validere konstruksjoner før de deployeres.

    Eksempel på CDK-test med Jest:

    import { Template } from 'aws-cdk-lib/assertions';
    import * as cdk from 'aws-cdk-lib';
    import * as MyApp from '../lib/my-app-stack';
    
    test('S3 Bucket Created', () => {
      const app = new cdk.App();
      const stack = new MyApp.MyStack(app, 'MyTestStack');
      const template = Template.fromStack(stack);
      
      template.hasResourceProperties('AWS::S3::Bucket', {
        VersioningConfiguration: {
          Status: 'Enabled'
        }
      });
    });
    
  3. Terratest for Terraform:

    • Terratest er et Go-bibliotek som lar deg skrive automatiserte tester for Terraform-konfigurasjoner.

    Eksempel på Terratest for AWS:

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

🛡 Sikkerhetspraksis i AWS IaC

🔐 Sikring av Hemmeligheter

Unngå å hardkode sensitive opplysninger som API-nøkler eller passord i IaC-kode. Bruk AWS Secrets Manager eller SSM Parameter Store for å håndtere hemmeligheter sikkert.

Eksempel på Bruk av AWS Secrets Manager i CloudFormation:

Resources:
  MySecret:
    Type: 'AWS::SecretsManager::Secret'
    Properties:
      Name: 'MySecret'
      Description: 'En hemmelighet for applikasjonen'

📜 IAM Policy-as-Code

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

Eksempel på en IAM Policy i Terraform:

resource "aws_iam_policy" "example" {
  name        = "example_policy"
  description = "En eksempelpolicy"
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action   = "s3:ListBucket"
        Effect   = "Allow"
        Resource = "*"
      },
    ]
  })
}

🛡 Logging og Overvåking

Aktiver logging og overvåking for alle AWS-ressurser som provisioneres via IaC. Bruk CloudTrail, CloudWatch, og GuardDuty for å overvåke aktivitet og reagere på sikkerhetshendelser.

Aktivering av Logging for S3-bøtter i CloudFormation:

Resources:
  MyBucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      LoggingConfiguration:
        DestinationBucketName: 'my-log-bucket'
        LogFilePrefix: 'logs/'

🚀 DevOps Integrasjon

🔄 CI/CD med AWS CodePipeline

AWS CodePipeline gir en kontinuerlig leveringspipeline som kan integreres med dine IaC-konfigurasjoner for å automatisere deployment til AWS.

Eksempel på en Enkel CodePipeline Definisjon:

Resources:
  MyPipeline:
   

 Type: 'AWS::CodePipeline::Pipeline'
    Properties:
      Stages:
        - Name: Source
          Actions:
            - Name: Source
              ActionTypeId:
                Category: Source
                Owner: AWS
                Provider: S3
                Version: 1
              OutputArtifacts:
                - Name: SourceOutput
              Configuration:
                S3Bucket: 'source-bucket'
                S3ObjectKey: 'source.zip'

🌍 GitOps med ArgoCD og AWS

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

Eksempel på ArgoCD-konfigurasjon for AWS:

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

🧪 Infrastruktur Testing med AWS CDK og Terratest

Terratest og AWS CDK gir kraftige verktøy for å skrive automatiserte tester av AWS-infrastruktur definert som kode.

Eksempel på Terratest med AWS:

package test

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

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

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

  bucketID := terraform.Output(t, terraformOptions, "bucket_id")
  assert.NotEmpty(t, bucketID)
}

🎯 Konklusjon

AWS Infrastructure as Code (IaC) gir utviklere og IT-administratorer en kraftig metode for å definere, administrere, og sikre skyinfrastruktur på en konsistent og repeterbar måte. Ved å bruke verktøy som AWS CloudFormation, AWS CDK, og Terraform, kombinert med beste praksis for sikkerhet, overvåking og testing, kan du bygge robuste og skalerbare infrastrukturmiljøer i AWS. Integrasjon med DevOps-verktøy som CodePipeline og ArgoCD gir muligheten til å automatisere hele livssyklusen for applikasjonsutvikling og -drift.


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