20TD02Å Spyder - itnett/FTD02H-N GitHub Wiki

20TD02Å Spyder

La oss lage et omfattende Python-skript som dekker temaet "Skytjenester" i henhold til den oppgitte fagplanen. Skriptet vil inkludere praktiske eksempler på grunnleggende skytjenester, IaaS, PaaS og SaaS, sikkerhet, og Infrastructure as Code (IaC). Dette vil gi en grundig forståelse av konseptene og deres praktiske anvendelse i både skole- og arbeidskontekster.

Komplett Skript

import boto3
import json
import requests
import os

# --- GRUNNLEGGENDE SKYTJENESTER ---
def list_s3_buckets():
    """Lister alle S3-bøtter på en AWS-konto."""
    s3 = boto3.client('s3')
    response = s3.list_buckets()
    print("S3 Buckets:")
    for bucket in response['Buckets']:
        print(f" - {bucket['Name']}")

def create_s3_bucket(bucket_name):
    """Oppretter en ny S3-bøtte."""
    s3 = boto3.client('s3')
    response = s3.create_bucket(Bucket=bucket_name)
    print(f"Bøtten {bucket_name} ble opprettet.")

# --- IaaS, PaaS OG SaaS ---
def deploy_iaas_instance():
    """Simulerer opprettelsen av en IaaS-instans (EC2) på AWS."""
    ec2 = boto3.client('ec2')
    response = ec2.run_instances(
        ImageId='ami-0abcdef1234567890',  # Bruk en gyldig AMI ID for din region
        InstanceType='t2.micro',
        MinCount=1,
        MaxCount=1
    )
    print(f"EC2 Instance created with ID: {response['Instances'][0]['InstanceId']}")

def deploy_paas_application():
    """Simulerer opprettelsen av en PaaS-applikasjon på AWS Elastic Beanstalk."""
    beanstalk = boto3.client('elasticbeanstalk')
    response = beanstalk.create_application(
        ApplicationName='MySampleApp',
        Description='My sample application'
    )
    print(f"Elastic Beanstalk Application created: {response['ApplicationName']}")

def use_saas_service():
    """Simulerer bruk av en SaaS-tjeneste ved å få værdata fra en offentlig API."""
    api_key = 'din_api_nøkkel'  # Sett inn din API-nøkkel her
    city = 'Oslo'
    url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}"
    response = requests.get(url)
    data = response.json()
    if response.status_code == 200:
        print(f"Været i {city}: {data['weather'][0]['description']}")
    else:
        print(f"Feil ved henting av værdata for {city}")

# --- SIKKERHET I SKYTJENESTER ---
def enforce_s3_bucket_policy(bucket_name):
    """Implementerer en enkel S3-bøttepolicy for sikkerhet."""
    s3 = boto3.client('s3')
    bucket_policy = {
        "Version": "2012-10-17",
        "Statement": [{
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": f"arn:aws:s3:::{bucket_name}/*"
        }]
    }
    bucket_policy = json.dumps(bucket_policy)
    s3.put_bucket_policy(Bucket=bucket_name, Policy=bucket_policy)
    print(f"Policy applied to bucket: {bucket_name}")

# --- INFRASTRUCTURE AS CODE (IaC) ---
def deploy_with_cloudformation():
    """Deploy en stack ved hjelp av AWS CloudFormation."""
    cloudformation = boto3.client('cloudformation')
    with open('cloudformation_template.json', 'r') as template_file:
        template_body = template_file.read()
    response = cloudformation.create_stack(
        StackName='MyStack',
        TemplateBody=template_body,
        Parameters=[
            {
                'ParameterKey': 'InstanceType',
                'ParameterValue': 't2.micro'
            },
        ]
    )
    print(f"CloudFormation stack created: {response['StackId']}")

# --- HOVEDFUNKSJON FOR Å KJØRE EKSEMPLENE ---
def run_cloud_services_examples():
    print("Starter eksempler på skytjenester...")
    list_s3_buckets()
    create_s3_bucket('my-new-bucket')
    deploy_iaas_instance()
    deploy_paas_application()
    use_saas_service()
    enforce_s3_bucket_policy('my-new-bucket')
    deploy_with_cloudformation()
    print("Eksempler på skytjenester fullført.")

if __name__ == "__main__":
    run_cloud_services_examples()

Forklaring og sammenheng

Grunnleggende skytjenester:

  • Funksjonene list_s3_buckets og create_s3_bucket demonstrerer grunnleggende operasjoner med S3-bøtter på AWS.

IaaS, PaaS og SaaS:

  • Funksjonene deploy_iaas_instance, deploy_paas_application og use_saas_service viser eksempler på hvordan man kan bruke IaaS (EC2), PaaS (Elastic Beanstalk) og SaaS (OpenWeather API).

Sikkerhet i skytjenester:

  • Funksjonen enforce_s3_bucket_policy viser hvordan man kan implementere en enkel sikkerhetspolicy for en S3-bøtte.

Infrastructure as Code (IaC):

  • Funksjonen deploy_with_cloudformation viser hvordan man kan bruke AWS CloudFormation for å distribuere infrastruktur som kode.

Forutsetninger og oppsett

For å kjøre dette skriptet trenger du:

  1. En AWS-konto og konfigurert AWS CLI med nødvendige tillatelser.
  2. En gyldig API-nøkkel fra OpenWeather (hvis du vil kjøre use_saas_service).
  3. En CloudFormation-mal (cloudformation_template.json) som beskriver ønsket infrastruktur.

Eksempler på CloudFormation-mal

Du kan bruke en enkel CloudFormation-mal for å opprette en EC2-instans:

{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "MyEC2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "InstanceType": {
                    "Ref": "InstanceType"
                },
                "ImageId": "ami-0abcdef1234567890"  # Bruk en gyldig AMI ID for din region
            }
        }
    },
    "Parameters": {
        "InstanceType": {
            "Description": "EC2 instance type",
            "Type": "String",
            "Default": "t2.micro",
            "AllowedValues": ["t2.micro", "t2.small", "t2.medium"]
        }
    }
}

Plasser denne JSON-filen i samme katalog som skriptet, og navngi den cloudformation_template.json.

Instruksjoner for kjøring

  1. Konfigurer AWS CLI med nødvendige tillatelser.
  2. Sett inn din API-nøkkel i use_saas_service-funksjonen.
  3. Lagre CloudFormation-malen som cloudformation_template.json.
  4. Kjør skriptet.

Dette skriptet dekker de viktigste elementene i emnet "Skytjenester" i henhold til fagplanen, og gir praktiske eksempler som kan overføres til både skole- og arbeidskontekster. Det gir en omfattende forståelse av grunnleggende skytjenester, IaaS, PaaS og SaaS, sikkerhet, og Infrastructure as Code (IaC).

Forbedret Skript for Skytjenester med Feilhåndtering, Validering og Lokal Simulering

La oss forbedre skriptet ditt ved å legge til try-except-blokker for feil- og unntakshåndtering, validering av inndata, forbedret modularitet, flere kommentarer, og fleksibilitet. Vi skal også vise hvordan man kan bruke LocalStack for lokal simulering av AWS-tjenester.

Oppdatert Skript

import boto3
import json
import requests
import os
import logging
import argparse
from botocore.exceptions import NoCredentialsError, PartialCredentialsError, ClientError

# Konfigurer boto3 til å bruke LocalStack (for lokal simulering)
LOCALSTACK = os.environ.get('LOCALSTACK', 'false').lower() == 'true'
if LOCALSTACK:
    endpoint_url = 'http://localhost:4566'
    boto3.setup_default_session(
        aws_access_key_id='test',
        aws_secret_access_key='test',
        region_name='us-east-1'
    )
else:
    endpoint_url = None

# Sett opp logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# --- GRUNNLEGGENDE SKYTJENESTER ---
def list_s3_buckets():
    """Lister alle S3-bøtter på en AWS-konto."""
    s3 = boto3.client('s3', endpoint_url=endpoint_url)
    try:
        response = s3.list_buckets()
        logger.info("S3 Buckets:")
        for bucket in response['Buckets']:
            logger.info(f" - {bucket['Name']}")
    except (NoCredentialsError, PartialCredentialsError) as e:
        logger.error(f"Feil ved autentisering: {e}")
    except ClientError as e:
        logger.error(f"Klientfeil: {e}")

def create_s3_bucket(bucket_name):
    """Oppretter en ny S3-bøtte."""
    s3 = boto3.client('s3', endpoint_url=endpoint_url)
    try:
        if not bucket_name.islower() or ' ' in bucket_name:
            raise ValueError("Bucket navn må være i små bokstaver og uten mellomrom.")
        response = s3.create_bucket(Bucket=bucket_name)
        logger.info(f"Bøtten {bucket_name} ble opprettet.")
    except (NoCredentialsError, PartialCredentialsError) as e:
        logger.error(f"Feil ved autentisering: {e}")
    except ClientError as e:
        logger.error(f"Klientfeil: {e}")
    except ValueError as e:
        logger.error(f"Valideringsfeil: {e}")

# --- IaaS, PaaS OG SaaS ---
def deploy_iaas_instance():
    """Simulerer opprettelsen av en IaaS-instans (EC2) på AWS."""
    ec2 = boto3.client('ec2', endpoint_url=endpoint_url)
    try:
        response = ec2.run_instances(
            ImageId='ami-0abcdef1234567890',  # Bruk en gyldig AMI ID for din region
            InstanceType='t2.micro',
            MinCount=1,
            MaxCount=1
        )
        logger.info(f"EC2 Instance created with ID: {response['Instances'][0]['InstanceId']}")
    except (NoCredentialsError, PartialCredentialsError) as e:
        logger.error(f"Feil ved autentisering: {e}")
    except ClientError as e:
        logger.error(f"Klientfeil: {e}")

def deploy_paas_application():
    """Simulerer opprettelsen av en PaaS-applikasjon på AWS Elastic Beanstalk."""
    beanstalk = boto3.client('elasticbeanstalk', endpoint_url=endpoint_url)
    try:
        response = beanstalk.create_application(
            ApplicationName='MySampleApp',
            Description='My sample application'
        )
        logger.info(f"Elastic Beanstalk Application created: {response['ApplicationName']}")
    except (NoCredentialsError, PartialCredentialsError) as e:
        logger.error(f"Feil ved autentisering: {e}")
    except ClientError as e:
        logger.error(f"Klientfeil: {e}")

def use_saas_service(api_key, city='Oslo'):
    """Simulerer bruk av en SaaS-tjeneste ved å få værdata fra en offentlig API."""
    url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}"
    try:
        response = requests.get(url)
        data = response.json()
        if response.status_code == 200:
            logger.info(f"Været i {city}: {data['weather'][0]['description']}")
        else:
            logger.error(f"Feil ved henting av værdata for {city}: {data}")
    except requests.RequestException as e:
        logger.error(f"HTTP-feil: {e}")

# --- SIKKERHET I SKYTJENESTER ---
def enforce_s3_bucket_policy(bucket_name):
    """Implementerer en enkel S3-bøttepolicy for sikkerhet."""
    s3 = boto3.client('s3', endpoint_url=endpoint_url)
    bucket_policy = {
        "Version": "2012-10-17",
        "Statement": [{
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": f"arn:aws:s3:::{bucket_name}/*"
        }]
    }
    bucket_policy = json.dumps(bucket_policy)
    try:
        s3.put_bucket_policy(Bucket=bucket_name, Policy=bucket_policy)
        logger.info(f"Policy applied to bucket: {bucket_name}")
    except (NoCredentialsError, PartialCredentialsError) as e:
        logger.error(f"Feil ved autentisering: {e}")
    except ClientError as e:
        logger.error(f"Klientfeil: {e}")

# --- INFRASTRUCTURE AS CODE (IaC) ---
def deploy_with_cloudformation():
    """Deploy en stack ved hjelp av AWS CloudFormation."""
    cloudformation = boto3.client('cloudformation', endpoint_url=endpoint_url)
    try:
        with open('cloudformation_template.json', 'r') as template_file:
            template_body = template_file.read()
        response = cloudformation.create_stack(
            StackName='MyStack',
            TemplateBody=template_body,
            Parameters=[
                {
                    'ParameterKey': 'InstanceType',
                    'ParameterValue': 't2.micro'
                },
            ]
        )
        logger.info(f"CloudFormation stack created: {response['StackId']}")
    except (NoCredentialsError, PartialCredentialsError) as e:
        logger.error(f"Feil ved autentisering: {e}")
    except ClientError as e:
        logger.error(f"Klientfeil: {e}")
    except FileNotFoundError as e:
        logger.error(f"Fil ikke funnet: {e}")

# --- HOVEDFUNKSJON FOR Å KJØRE EKSEMPLENE ---
def run_cloud_services_examples(api_key):
    logger.info("Starter eksempler på skytjenester...")
    list_s3_buckets()
    create_s3_bucket('my-new-bucket')
    deploy_iaas_instance()
    deploy_paas_application()
    use_saas_service(api_key)
    enforce_s3_bucket_policy('my-new-bucket')
    deploy_with_cloudformation()
    logger.info("Eksempler på skytjenester fullført.")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Kjør eksempler på skytjenester.')
    parser.add_argument('--api_key', type=str, required=True, help='API-nøkkel for SaaS-tjenesten')
    args = parser.parse_args()
    
    run_cloud_services_examples(args.api_key)

Forklaring og forbedringer

  1. Feilhåndtering:

    • try-except-blokker er lagt til for å håndtere feil som kan oppstå ved autentisering, klientfeil og filfeil.
  2. Validering av inndata:

    • Validering av bøttenavn er lagt til i create_s3_bucket for å sikre at det overholder AWS-navngivningskonvensjoner.
  3. Modularitet og fleksibilitet:

    • Koden er delt opp i flere funksjoner for bedre lesbarhet og gjenbrukbarhet.
    • Bruk av kommandolinjeargumenter (argparse) for å få API-nøkkel som input fra brukeren.
  4. Logging:

    • Implementert logging for å spore hendelser og feil under kjøring av skriptet.
  5. Lokal simulering med LocalStack:

    • Mulighet for lokal simulering ved å sette LOCALSTACK miljøvariabelen til true og konfigurere boto3 til å bruke LocalStack endpoint.

Instruksjoner for kjøring

  1. Konfigurer AWS CLI med nødvendige tillatelser eller bruk LocalStack for lokal simulering.
  2. Sett inn din API-nøkkel som kommandolinjeargument.
  3. Lagre CloudFormation-malen som cloudformation_template.json.
  4. Kjør skriptet med kommandolinjeargument for API-nøkkel:
python script_name.py --api_key din_api_nøkkel

Dette oppdaterte skriptet gir en omfattende forståelse av skytjenester, inkludert IaaS, PaaS

og SaaS, sikkerhet, og Infrastructure as Code, samtidig som det er robust og håndterer potensielle feil.

For å lage en versjon av skriptet som kan kjøres i Spyder eller Trinket, og som simulerer skytjenester uten å trenge en faktisk cloud-konto, kan vi bruke biblioteket moto for å mocke AWS-tjenester. Dette vil gi en realistisk simulering av AWS-operasjoner. Vi kan også lage noen dummy-data for SaaS-tjenesten.

Oppdatert Skript for Lokal Simulering

import boto3
import json
import random
import logging
import argparse
from moto import mock_s3, mock_ec2, mock_elasticbeanstalk, mock_cloudformation
from botocore.exceptions import NoCredentialsError, PartialCredentialsError, ClientError

# Sett opp logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# --- GRUNNLEGGENDE SKYTJENESTER ---
@mock_s3
def list_s3_buckets():
    """Lister alle S3-bøtter på en simulert AWS-konto."""
    s3 = boto3.client('s3')
    try:
        response = s3.list_buckets()
        logger.info("S3 Buckets:")
        for bucket in response['Buckets']:
            logger.info(f" - {bucket['Name']}")
    except (NoCredentialsError, PartialCredentialsError) as e:
        logger.error(f"Feil ved autentisering: {e}")
    except ClientError as e:
        logger.error(f"Klientfeil: {e}")

@mock_s3
def create_s3_bucket(bucket_name):
    """Oppretter en ny S3-bøtte på en simulert AWS-konto."""
    s3 = boto3.client('s3')
    try:
        if not bucket_name.islower() or ' ' in bucket_name:
            raise ValueError("Bucket navn må være i små bokstaver og uten mellomrom.")
        response = s3.create_bucket(Bucket=bucket_name)
        logger.info(f"Bøtten {bucket_name} ble opprettet.")
    except (NoCredentialsError, PartialCredentialsError) as e:
        logger.error(f"Feil ved autentisering: {e}")
    except ClientError as e:
        logger.error(f"Klientfeil: {e}")
    except ValueError as e:
        logger.error(f"Valideringsfeil: {e}")

# --- IaaS, PaaS OG SaaS ---
@mock_ec2
def deploy_iaas_instance():
    """Simulerer opprettelsen av en IaaS-instans (EC2) på en simulert AWS-konto."""
    ec2 = boto3.client('ec2')
    try:
        response = ec2.run_instances(
            ImageId='ami-0abcdef1234567890',  # Bruk en gyldig AMI ID for din region
            InstanceType='t2.micro',
            MinCount=1,
            MaxCount=1
        )
        logger.info(f"EC2 Instance created with ID: {response['Instances'][0]['InstanceId']}")
    except (NoCredentialsError, PartialCredentialsError) as e:
        logger.error(f"Feil ved autentisering: {e}")
    except ClientError as e:
        logger.error(f"Klientfeil: {e}")

@mock_elasticbeanstalk
def deploy_paas_application():
    """Simulerer opprettelsen av en PaaS-applikasjon på en simulert AWS Elastic Beanstalk."""
    beanstalk = boto3.client('elasticbeanstalk')
    try:
        response = beanstalk.create_application(
            ApplicationName='MySampleApp',
            Description='My sample application'
        )
        logger.info(f"Elastic Beanstalk Application created: {response['ApplicationName']}")
    except (NoCredentialsError, PartialCredentialsError) as e:
        logger.error(f"Feil ved autentisering: {e}")
    except ClientError as e:
        logger.error(f"Klientfeil: {e}")

def use_saas_service(city='Oslo'):
    """Simulerer bruk av en SaaS-tjeneste ved å generere dummy værdata."""
    weather_conditions = ["Clear sky", "Few clouds", "Scattered clouds", "Broken clouds", "Shower rain", "Rain", "Thunderstorm", "Snow", "Mist"]
    weather = random.choice(weather_conditions)
    logger.info(f"Været i {city}: {weather}")

# --- SIKKERHET I SKYTJENESTER ---
@mock_s3
def enforce_s3_bucket_policy(bucket_name):
    """Implementerer en enkel S3-bøttepolicy for sikkerhet på en simulert AWS-konto."""
    s3 = boto3.client('s3')
    bucket_policy = {
        "Version": "2012-10-17",
        "Statement": [{
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": f"arn:aws:s3:::{bucket_name}/*"
        }]
    }
    bucket_policy = json.dumps(bucket_policy)
    try:
        s3.put_bucket_policy(Bucket=bucket_name, Policy=bucket_policy)
        logger.info(f"Policy applied to bucket: {bucket_name}")
    except (NoCredentialsError, PartialCredentialsError) as e:
        logger.error(f"Feil ved autentisering: {e}")
    except ClientError as e:
        logger.error(f"Klientfeil: {e}")

# --- INFRASTRUCTURE AS CODE (IaC) ---
@mock_cloudformation
def deploy_with_cloudformation():
    """Deploy en stack ved hjelp av AWS CloudFormation på en simulert AWS-konto."""
    cloudformation = boto3.client('cloudformation')
    try:
        template_body = json.dumps({
            "AWSTemplateFormatVersion": "2010-09-09",
            "Resources": {
                "MyEC2Instance": {
                    "Type": "AWS::EC2::Instance",
                    "Properties": {
                        "InstanceType": "t2.micro",
                        "ImageId": "ami-0abcdef1234567890"
                    }
                }
            }
        })
        response = cloudformation.create_stack(
            StackName='MyStack',
            TemplateBody=template_body,
            Parameters=[
                {
                    'ParameterKey': 'InstanceType',
                    'ParameterValue': 't2.micro'
                },
            ]
        )
        logger.info(f"CloudFormation stack created: {response['StackId']}")
    except (NoCredentialsError, PartialCredentialsError) as e:
        logger.error(f"Feil ved autentisering: {e}")
    except ClientError as e:
        logger.error(f"Klientfeil: {e}")

# --- HOVEDFUNKSJON FOR Å KJØRE EKSEMPLENE ---
def run_cloud_services_examples():
    logger.info("Starter eksempler på skytjenester...")
    list_s3_buckets()
    create_s3_bucket('my-new-bucket')
    deploy_iaas_instance()
    deploy_paas_application()
    use_saas_service()
    enforce_s3_bucket_policy('my-new-bucket')
    deploy_with_cloudformation()
    logger.info("Eksempler på skytjenester fullført.")

if __name__ == "__main__":
    run_cloud_services_examples()

Forklaring og forbedringer

  1. Mocking med Moto:

    • Funksjoner som list_s3_buckets, create_s3_bucket, deploy_iaas_instance, deploy_paas_application, enforce_s3_bucket_policy og deploy_with_cloudformation bruker moto-dekortør (@mock_s3, @mock_ec2, @mock_elasticbeanstalk, @mock_cloudformation) for å simulere AWS-tjenester lokalt.
  2. SaaS-tjeneste simulering:

    • Funksjonen use_saas_service genererer dummy værdata i stedet for å gjøre et faktisk API-kall.
  3. Logging:

    • Logging er konfigurert for å spore hendelser og feil under kjøring av skriptet.
  4. Inngangsvalidering og feilhåndtering:

    • Inngangsvalidering for bøttenavn og feilhåndtering med try-except-blokker er lagt til for å sikre robusthet.

Instruksjoner for kjøring

  1. Installer nødvendige pakker:

    • Sørg for å ha boto3 og moto installert:
    pip install boto3 moto
    
  2. Kjør skriptet i Spyder eller Trinket:

    • Kopier hele skriptet inn i en ny Python-fil og kjør skriptet.

Dette oppdaterte skriptet gir en realistisk simulering av skytjenester uten å kreve en faktisk cloud-konto, noe som gjør det egnet for bruk i skole- og arbeidskontekster.

Visualizing the Enhanced Python Script for Cloud Services

Here is a visual breakdown of the enhanced Python script covering cloud services. The script includes basic cloud services, IaaS, PaaS, SaaS, security, and Infrastructure as Code (IaC) with improvements for error handling, validation, and local simulation using moto.

Script Structure and Components

The script is modular, with functions for each cloud service operation. It uses the moto library for local simulation and includes robust error handling and input validation.

Key Components:

  1. Imports and Configuration
  2. Basic Cloud Services:
    • List S3 Buckets
    • Create S3 Bucket
  3. IaaS, PaaS, and SaaS:
    • Deploy IaaS Instance
    • Deploy PaaS Application
    • Use SaaS Service
  4. Security in Cloud Services:
    • Enforce S3 Bucket Policy
  5. Infrastructure as Code (IaC):
    • Deploy with CloudFormation
  6. Main Function:
    • Run Cloud Services Examples

Visual Diagram

1. Imports and Configuration

  +----------------------------------+
  |          Imports and Config      |
  +----------------------------------+
  | boto3, json, requests, os, ...   |
  | Configure LocalStack if needed   |
  +----------------------------------+

2. Basic Cloud Services

  +----------------------------------+
  |      Basic Cloud Services        |
  +----------------------------------+
  | 1. list_s3_buckets()             |
  |    - List all S3 buckets         |
  | 2. create_s3_bucket(bucket_name) |
  |    - Create a new S3 bucket      |
  +----------------------------------+

3. IaaS, PaaS, and SaaS

  +----------------------------------+
  |    IaaS, PaaS, and SaaS          |
  +----------------------------------+
  | 1. deploy_iaas_instance()        |
  |    - Create EC2 instance         |
  | 2. deploy_paas_application()     |
  |    - Create Elastic Beanstalk app|
  | 3. use_saas_service(city)        |
  |    - Get weather data for city   |
  +----------------------------------+

4. Security in Cloud Services

  +----------------------------------+
  | Security in Cloud Services       |
  +----------------------------------+
  | enforce_s3_bucket_policy(bucket) |
  | - Apply security policy to S3    |
  +----------------------------------+

5. Infrastructure as Code (IaC)

  +----------------------------------+
  | Infrastructure as Code (IaC)     |
  +----------------------------------+
  | deploy_with_cloudformation()     |
  | - Deploy stack with CloudFormation |
  +----------------------------------+

6. Main Function

  +----------------------------------+
  |          Main Function           |
  +----------------------------------+
  | run_cloud_services_examples(api_key) |
  | - Call all cloud service examples |
  +----------------------------------+

Python Code

import boto3
import json
import random
import logging
import argparse
from moto import mock_s3, mock_ec2, mock_elasticbeanstalk, mock_cloudformation
from botocore.exceptions import NoCredentialsError, PartialCredentialsError, ClientError

# Sett opp logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# --- GRUNNLEGGENDE SKYTJENESTER ---
@mock_s3
def list_s3_buckets():
    """Lister alle S3-bøtter på en simulert AWS-konto."""
    s3 = boto3.client('s3')
    try:
        response = s3.list_buckets()
        logger.info("S3 Buckets:")
        for bucket in response['Buckets']:
            logger.info(f" - {bucket['Name']}")
    except (NoCredentialsError, PartialCredentialsError) as e:
        logger.error(f"Feil ved autentisering: {e}")
    except ClientError as e:
        logger.error(f"Klientfeil: {e}")

@mock_s3
def create_s3_bucket(bucket_name):
    """Oppretter en ny S3-bøtte på en simulert AWS-konto."""
    s3 = boto3.client('s3')
    try:
        if not bucket_name.islower() or ' ' in bucket_name:
            raise ValueError("Bucket navn må være i små bokstaver og uten mellomrom.")
        response = s3.create_bucket(Bucket=bucket_name)
        logger.info(f"Bøtten {bucket_name} ble opprettet.")
    except (NoCredentialsError, PartialCredentialsError) as e:
        logger.error(f"Feil ved autentisering: {e}")
    except ClientError as e:
        logger.error(f"Klientfeil: {e}")
    except ValueError as e:
        logger.error(f"Valideringsfeil: {e}")

# --- IaaS, PaaS OG SaaS ---
@mock_ec2
def deploy_iaas_instance():
    """Simulerer opprettelsen av en IaaS-instans (EC2) på en simulert AWS-konto."""
    ec2 = boto3.client('ec2')
    try:
        response = ec2.run_instances(
            ImageId='ami-0abcdef1234567890',  # Bruk en gyldig AMI ID for din region
            InstanceType='t2.micro',
            MinCount=1,
            MaxCount=1
        )
        logger.info(f"EC2 Instance created with ID: {response['Instances'][0]['InstanceId']}")
    except (NoCredentialsError, PartialCredentialsError) as e:
        logger.error(f"Feil ved autentisering: {e}")
    except ClientError as e:
        logger.error(f"Klientfeil: {e}")

@mock_elasticbeanstalk
def deploy_paas_application():
    """Simulerer opprettelsen av en PaaS-applikasjon på en simulert AWS Elastic Beanstalk."""
    beanstalk = boto3.client('elasticbeanstalk')
    try:
        response = beanstalk.create_application(
            ApplicationName='MySampleApp',
            Description='My sample application'
        )
        logger.info(f"Elastic Beanstalk Application created: {response['ApplicationName']}")
    except (NoCredentialsError, PartialCredentialsError) as e:
        logger.error(f"Feil ved autentisering: {e}")
    except ClientError as e:
        logger.error(f"Klientfeil: {e}")

def use_saas_service(city='Oslo'):
    """Simulerer bruk av en SaaS-tjeneste ved å generere dummy værdata."""
    weather_conditions = ["Clear sky", "Few clouds", "Scattered clouds", "Broken clouds", "Shower rain", "Rain", "Thunderstorm", "Snow", "Mist"]
    weather = random.choice(weather_conditions)
    logger.info(f"Været i {city}: {weather}")

# --- SIKKERHET I SKYTJENESTER ---
@mock_s3
def enforce_s3_bucket_policy(bucket_name):
    """Implementerer en enkel S3-bøttepolicy for sikkerhet på en simulert AWS-konto."""
    s3 = boto3.client('s3')
    bucket_policy = {
        "Version": "2012-10-17",
        "Statement": [{
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": f"arn:aws:s3:::{bucket_name}/*"
        }]
    }
    bucket_policy = json.dumps(bucket_policy)
    try:
        s3.put_bucket_policy(Bucket=bucket_name, Policy=bucket_policy)
        logger.info(f"Policy applied to bucket: {bucket_name}")
    except (NoCredentialsError, PartialCredentialsError) as e:
        logger.error(f"Feil ved autentisering: {e}")
    except ClientError as e:
        logger.error(f"Klientfeil: {e}")

# --- INFRASTRUCTURE AS CODE (IaC) ---
@mock_cloudformation
def deploy_with_cloudformation():
    """Deploy en stack ved hjelp av AWS CloudFormation på en simulert AWS-konto."""
    cloudformation = boto3.client('cloudformation')
    try:
        template_body = json.dumps({
            "AWSTemplateFormatVersion": "2010-09-09",
            "Resources": {
                "MyEC2Instance": {
                    "Type": "AWS::EC2::Instance",
                    "Properties": {
                        "InstanceType": "t2.micro",
                        "ImageId": "ami-0abcdef1234567890"
                    }
                }
            }
        })
        response = cloudformation.create_stack(
            StackName='MyStack',
            TemplateBody=template_body,
            Parameters=[
                {
                    'ParameterKey': 'InstanceType',
                    'ParameterValue': 't2.micro'
                },
            ]
        )
        logger.info(f"CloudFormation stack created: {response['StackId']}")
    except (NoCredentialsError, PartialCredentialsError) as e:
        logger.error(f"Feil ved autentisering: {e}")
    except ClientError as e:
        logger.error(f"Klientfeil: {e}")

# --- HOVEDFUNKSJON FOR Å KJØRE EKSEMPLENE ---
def run_cloud_services_examples():
    logger.info("Starter eksempler på skytjenester...")
    list_s3_buckets()
    create_s3_bucket('my

-new-bucket')
    deploy_iaas_instance()
    deploy_paas_application()
    use_saas_service()
    enforce_s3_bucket_policy('my-new-bucket')
    deploy_with_cloudformation()
    logger.info("Eksempler på skytjenester fullført.")

if __name__ == "__main__":
    run_cloud_services_examples()

Summary

The script demonstrates cloud services operations using AWS SDK (Boto3) and moto for local simulation, with comprehensive error handling, input validation, and logging for enhanced robustness. This approach provides a solid foundation for understanding and experimenting with cloud services in both educational and professional settings.

It seems there is an issue with the syntax in the Mermaid diagram. Let's simplify the diagram and ensure it's correctly formatted.

Here is a corrected version of the Mermaid diagram with simplified labels and without using special characters in node IDs:

graph TD
    A[Imports and Configuration]
    B[Basic Cloud Services]
    C[IaaS, PaaS, and SaaS]
    D[Security in Cloud Services]
    E[Infrastructure as Code]
    F[Main Function]

    A --> G[Configure LocalStack]
    A --> H[Setup Logging]

    B --> I[list_s3_buckets]
    B --> J[create_s3_bucket]

    C --> K[deploy_iaas_instance]
    C --> L[deploy_paas_application]
    C --> M[use_saas_service]

    D --> N[enforce_s3_bucket_policy]

    E --> O[deploy_with_cloudformation]

    F --> P[Call examples]

    subgraph Basic_Cloud_Services
        I --> Q[List S3 buckets]
        J --> R[Create S3 bucket]
    end

    subgraph IaaS_PaaS_SaaS
        K --> S[Create EC2 instance]
        L --> T[Create Beanstalk app]
        M --> U[Get weather data]
    end

    subgraph Security_in_Cloud_Services
        N --> V[Apply S3 policy]
    end

    subgraph Infrastructure_as_Code
        O --> W[Deploy with CloudFormation]
    end

    subgraph Main_Function
        P --> X[Call list_s3_buckets]
        P --> Y[Call create_s3_bucket]
        P --> Z[Call deploy_iaas_instance]
        P --> AA[Call deploy_paas_application]
        P --> AB[Call use_saas_service]
        P --> AC[Call enforce_s3_bucket_policy]
        P --> AD[Call deploy_with_cloudformation]
    end

Explanation of the Diagram

  1. Imports and Configuration:

    • The script imports necessary libraries and sets up LocalStack for local AWS simulation.
    • Logging is configured to track events and errors.
  2. Basic Cloud Services:

    • list_s3_buckets: Lists all S3 buckets on a simulated AWS account.
    • create_s3_bucket(bucket_name): Creates a new S3 bucket on a simulated AWS account.
  3. IaaS, PaaS, and SaaS:

    • deploy_iaas_instance(): Simulates the creation of an EC2 instance.
    • deploy_paas_application(): Simulates the creation of an Elastic Beanstalk application.
    • use_saas_service(city): Simulates using a SaaS service by generating dummy weather data.
  4. Security in Cloud Services:

    • enforce_s3_bucket_policy(bucket_name): Applies a security policy to an S3 bucket.
  5. Infrastructure as Code (IaC):

    • deploy_with_cloudformation(): Deploys a stack using AWS CloudFormation.
  6. Main Function:

    • run_cloud_services_examples(api_key): Calls all the cloud service examples.

How to Use the Diagram

  • Copy the Mermaid syntax and paste it into a GitHub Wiki page to visualize the script.
  • Each function and its purpose are represented in the diagram, showing the flow and dependencies between different parts of the script.