AWS - La Guida Completa: Dalla Teoria alla Pratica
Amazon Web Services (AWS) è la piattaforma cloud più utilizzata al mondo, offrendo oltre 200 servizi completamente gestiti per ogni tipo di applicazione. Questa guida completa ti accompagnerà dai concetti fondamentali fino alle pratiche avanzate, fornendoti tutte le competenze necessarie per lavorare efficacemente con AWS.
A chi è rivolta questa guida
Questa guida è pensata per:
Sviluppatori che vogliono migrare al cloud
Sistemisti che desiderano specializzarsi in infrastrutture cloud
Studenti che si preparano alle certificazioni AWS
Decision maker che valutano AWS per la propria azienda
Aws consente di creare applicazioni sofisticate e scalabili.
È applicabile a diversi tipi di industrie (es. McDonald, 21 Century Fox, Activision, Netflix).
Casi d’uso includono:
Enterprice IT, Backup & Storage, Big Data analytics
Website hosting, Mobile & Social Apps
Gaming
AWS Global Infrastructure
AWS Regions
AWS ha regions in tutto il mondo. Le regiono possono essere intese come le aree in cui sono presenti i server di AWS.
Le region hanno nomi, ad esempio ue-east-1, eu-west-3 …
Una regiono è un cluster di data centers
Molti servizi di AWS sono “region-scoped”(localizati). Questo significa che usando un serivizio su una region, se apro lo stesso servizio su un’altra region sarà come se lo sto aprendo per la prima volta.
Domanda d'esame
“How do you choose an AWS Regin?”
La risposta è dipende. Ci sono diversi fattori che influenzano la scelta:
Compliance dei dati e requisiti legali. In AWS i dati non lasciano mai la region dove si trovano senza un tuo esplicito permesso. Ad esempio se crei un applicazione in Spagna potrebbero esserci dei vincoli legali per avere i dati nello stesso paese.
Proximity rispetto ai clienti per ridurre la latenza. Ad esempio se ho un’applicazione e la maggior parte degli utenti sono americani, ha senso mettere l’applicazione in America per ridurre i lag.
Available services in una specifica Region. I nuovi servizi e le nuove funzionalità non sono disponibili in tutte le Region. Il concetto che non tutte le Region hanno tutti i servizi è importante.
Pricing: i prezzi variano da regiorne a region e si possono vedere dall’apposita pagina dei prezzi.
AWS Availability Zones
Ogni Region si divide in Availability Zones (AZ), possiamo intenerle come sottogruppi della region.
Ogni Region ha più Availability Zones: normalmente ogni Region ha 3 availability zones, il minimo è 2 e il massimo è 6. Ad esempio:
Ogni availability zone (AZ) è uno (o più) data ceters di grandi dimensioni, con alimentazione ridondata, rete e connessione.
Ogni availability zone (AZ) è separate fisicamente dalle altre, così da essere isolata dai disastri e garantire continuità di servizio.
Ogni availability zone (AZ) è connessa con connessione molto performante e rete a bassissima latenza.
AWS Point of Presence (Edge Locations)
Amazon ha 216 punti di presenza (al momento della guida) divisi in 205 Edge Locations e 11 Cache regionali, suddivisi in 84 città in 42 stati diversi.
I contenusi sono serviti agli utenti finali con un bassa latenza
Region-selector: qui è possibile cambiare la Region in cui si sta lavorando.
Sevices: qui si possono vedere tutti i servizi disponibili in ordine alfabetico
Barra di ricerca, si possono cecare servizi, funzionalità e documentazione.
IAM: Identity and Access Managemet
AIM è la console di gestione degli utenti e dei gruppi che possono accedere a aws e ai servizi.
Gli utenti sono intesi come persone dell’organizzazione che possono accedere a aws.
Gli utenti possono essere organizzati in gruppi.
I gruppi possono contenere solo utenti e non altri gruppi.
Gli utenti possono appartenere a più gruppi.
È possibile avere un utente senza gruppi ma non è una best practice.
AIM Best practice
Utente Root: Quando si accede per la prima volta a AWS viene creato il “Root Accoun”. Questo account non dovrebbe mai essere usato, fatto salvo la prima volta per creare un primo utente amministratore.
Gestione Utenti AIM: di norma ogni utente dovrebbe appartanere almeno a un gruppo che lo identifica e ne assegna i permessi. È buona norma applicare questa regola anche agli amministratori.
Agli utenti o ai gruppi è possibile assegnare permessi.
I permessi sono dei documenti JSON chiamati policy
Esempio di una policy JSON:
TODO mettere una policy JSON
Non è richiesto conoscere i JSON, le policy vengono gestite direttamente dalla console AWS.
AIM Best practice
In AWS bisognerebbe semple applicare “The least privilege principle”, ovvero assegnare agli utenti (o gruppo) solo i permessi di cui hanno bisogno. Ad esempio se un utente ha bisogno di accedere solo a tre servizi, allora di daremo i permessi solo per quei servizi.
Per maggiorni informazioni vedi la sezione Credential Report
IAM: Crearezione di utenti
TODO Mettere immagine AIM
Per creare un utente accedere alla console AIM.
Nel menù di sinistra, sotto Access management selezionare Users.
Nella nuova schermata scrivere lo Username e selezionare il Credential Type (Se impostato come password, creare la nuova password).
Impostare i permessi dell’utente (se necessario creare un nuovo gruppo).
Aggiungere eventuali Tags, i tag sono semplicemente informazioni aggiuntive per identificare meglio gli utenti, ad esempio possiamo dichiarare un tag che ne identifichi il reparto “Key: Department” “Value: Engineering”.
Rivedere i dati inseriti e procedere alla creazione dell’utente.
Dopo il messaggio di avvenuta creazione è possibile scaricare il csv con le credenziali o inviare tutto tramite e-mail.
Andando nel menu User, sotto Access management selezionare Users, è possibile vedere l’elenco degli utenti. Apreno un utente è possibile vedere tutti i gruppi di cui fa parte e i permessi associati.
IAM: Creazione di un gruppo
I gruppi possono essere creati in due modi:
Durante la creazione di un utente, quando si arriva alla sezione per l’assegnazione dei permessi, è possibile creare un nuovo gruppo di cui farà parte l’utente.
Dal menù di sinistra, sotto Access management selezionare User groups.
Selezionare Create group
In entrabi i casi si arriverà alla schermata di creazione del gruppo. Qui occorre specificare il nome del gruppo, gli utenti che ne fanno parte (se sono in fase di creazione di un utente, quest’ultimo sarà aggiunto autonomamente) e le policy da agganciare al gruppo.
AIM Best practice
Si consiglia di creare sempre il gruppo Admin che conterrà gli utenti amministratori al posto di assegnare i permessi direttamente agli utenti. In futuro questa scelta tornerà utile se si deve modificare i pemessi di un utente o eliminarlo. Inoltre offre il vantaggio di avere subito una chiara visione di chi sono gli amministratori dell’organizzazione.
Nel menu User groups, sotto Access management selezionare User groups, è possibile vedere l’elenco dei gruppi creati, i relativi membri e le policy associate al gruppo. Si può associare più policy a un gruppo ma si sconsiglia (salvo alcune eccezzioni) di farlo. Associare più policy può facilmente far perdere la percezione dei permessi assegnati agli utenti.
IAM: Account Alias
Nella dashboard di IAM è possibile configurare un alias per il login. Impostare un alias al posto del codice numerico consentirà di creare un link personalizzato e più semplice da ricordare. Modificando l’alias non funzionerà più il link vecchio e tutti gli utenti dovranno usare il link nuovo.
IAM Policyes
Le policy in AWS sono dei file JSON che contengono le impostazioni dei permessi.
Le pocicy sono sempre costituite dai seguenti paramentri:
Version: la versione della policy, include sempre “2012-10-17”.
Id: l’identificativo della policy (opzionale).
Statement: una o più dichiarazioni, sono i permessi contenuti nella policy. Lo statement è composta da:
Sid: un identificatore le lo statement (opzionale).
Effect: l’effetto della policy, ovvero se consente o nega un accesso. (può solo essere Allow o Deny).
Principal: account/user/role a cui la policy è applicata.
Action: lista delle azioni che la policy attiva o disattiva.
Resource list: lista delle risorse a cui la policy viene applicata.
Condition: condizione in cui la policy viene applicata (opzionale)
IAM: Aggiungere un gruppo a un utente
Per aggiungere un gruppo a un utente ci sono due modi:
Aggiungere il gruppo partendo dai gruppi: andare su Users Group, selezionare il gruppo corretto e cliccare su Add users.
Aggiungere l’utente partendo dall'utente: andare su Users, selezionare l’utente. Quando si apre la scheda dell’utente andare su Groups e cliccare su Add users to groups.
IAM: Role for Services
Alcuni servizi hanno la necessità di compiere azioni su al di fuori del loro ambito. Per faro occore assegnazione ai servizi i permessi per accedere ad altri servizi di AWS.
Alcuni esempio sono:
EC2 Instance Roles
Lamda Function Roles
Role for CloudFormation
Per accedere alla configurazioni dei ruoli andare sulla console di IAM, nel menù Access Management selezionare Roles e Create role.
Esempio di un role per EC2
Esempio di un ruolo per una istanza EC2
Creo un nuovo ruolo
Seleziono il tipo di entity: “AWS Service”
Selezioni il use case: “EC2” e click su next.
Seleziono la policy da assegnare: “IAMReadOnlyAccess” e click su next
Asseno il nome al Role : “DemoRoleForEC2” e click su Create Role
IAM: Credential Report
Da IAM è possibile generare un report che indica dati di generali e di sicurezza relativi agli utenti. Per generare il report andare su IAM, nel menù di sinistra e selezionare Credential Report.
Per avere informazioni più dettagliate degli utenti è possibile andare nel menù di sinistra, nella sezione Access Management, selezionare Users, selezionare l’utente di cui si vogliono avere maggiori dettagli. Nella scheda dell’utente andare su Access Advisor per visualizzare gli accessi eseguiti dall’utente ai vari servizi. Viene salvato uno storico di 365 giorni.
AIM Best practice
Per applicare il princio “The least privilege principle” può essere molto utile andare periodicamente nella sezione “Access Advisor” e verificare quali serivizi non sono utilizzati dagli utenti e rimuoverne i permessi.
IAM Best Practice
Raccolta delle principali best practice di IAM
Non usare l’account root fatto salvo per il setup iniziale.
Un utente fisico = un utente di AWS. Non convididere mai gli account tra più persone.
Assegna gli utenti ai gruppi e assegna i permessi ai gruppi. È meglio non assegnare mai i permessi direttamente agli utenti.
Creare una password policy forte per garantire che tutti gli utenti abbiano password sufficientemente effici.
Se possibile implementa la Multi Factor Authentication (MFA).
Crea e usa i Ruoli per dare i permessi ai servizi di AWS.
Usa le chiavi di accesso per gli accessi tramite CLI/SKD e matienile il più segrete possibile.
Controllare i permessi degli utenti con Credential report e IAM Access Analyzer.
Non condividere mai l’accounbt IAM e le chiavi di accesso.
CLI: Command Line Interface
Con l’infrastruttura di AWS è possibile interagire tramite console installando la AWS CLI version 2.
Per utitlizzare la CLI occore generare una security credential dall’interfaccia di AWS.
Security credential
Non generare mai security credetial con l’account root, farlo creerebbe un potenziale rischio.
Nella CloudShell si possono eseguire tutti i comandi della CLI. La AWS CLI v2 è già preinstallata.
I file creati sono persinstenti, anche riavviando la console non vengono cancellati. È inoltre possibile fare il download/upload dei file direttamente nella console.
AWS Budget Setup
Il controllo dei costi è fondamentale quando si lavora con AWS. Il servizio AWS Budgets permette di monitorare e controllare la spesa in tempo reale.
Creare un Budget
Accedere al servizio Budget:
Dalla console AWS, cercare “Budget” o andare su “Billing and Cost Management”
AWS Training and Certification: Corsi ufficiali gratuiti e a pagamento
AWS Hands-on Labs: Laboratori pratici guidati
AWS Well-Architected Labs: Best practices implementabili
Community e Eventi
AWS User Groups: Meetup locali con altri utenti AWS
AWS re:Invent: Conferenza annuale con migliaia di sessioni
AWS Summits: Eventi regionali gratuiti
Conclusioni e Prossimi Passi
AWS rappresenta una piattaforma completa per ogni tipo di workload, dalla semplice pagina web statica alle applicazioni enterprise più complesse. Questa guida ti ha fornito le basi teoriche e pratiche per iniziare il tuo percorso con AWS.
Prossimi Passi Consigliati
Hands-on Practice:
Crea il tuo account AWS e sperimenta con il Free Tier
Segui i tutorials AWS per implementare architetture comuni
Approfondimenti:
Studia servizi specifici per il tuo use case (machine learning, analytics, IoT)
Impara Infrastructure as Code con CloudFormation o CDK
Certificazioni:
Inizia con AWS Cloud Practitioner
Prosegui con certificazioni role-based (Solutions Architect, Developer, SysOps)
# SAM template per API Gateway + LambdaAWSTemplateFormatVersion:'2010-09-09'Transform:AWS::Serverless-2016-10-31Resources:MyApi:Type:AWS::Serverless::ApiProperties:StageName:prodCors:AllowMethods:"'GET,POST,PUT,DELETE'"AllowHeaders:"'Content-Type,X-Amz-Date,Authorization'"AllowOrigin:"'*'"GetUserFunction:Type:AWS::Serverless::FunctionProperties:CodeUri:src/Handler:users.get_userRuntime:python3.9Events:GetUser:Type:ApiProperties:RestApiId:!Ref MyApiPath:/users/{id}Method:getCreateUserFunction:Type:AWS::Serverless::FunctionProperties:CodeUri:src/Handler:users.create_userRuntime:python3.9Events:CreateUser:Type:ApiProperties:RestApiId:!Ref MyApiPath:/usersMethod:post
fromaws_cdkimport(aws_ec2asec2,aws_ecsasecs,aws_ecs_patternsasecs_patterns,aws_rdsasrds,core)classWebAppStack(core.Stack):def__init__(self,scope:core.Construct,construct_id:str,**kwargs)->None:super().__init__(scope,construct_id,**kwargs)# VPCvpc=ec2.Vpc(self,"WebAppVPC",max_azs=2,nat_gateways=1)# ECS Clustercluster=ecs.Cluster(self,"WebAppCluster",vpc=vpc)# Fargate Service with ALBfargate_service=ecs_patterns.ApplicationLoadBalancedFargateService(self,"WebAppService",cluster=cluster,memory_limit_mib=512,cpu=256,task_image_options=ecs_patterns.ApplicationLoadBalancedTaskImageOptions(image=ecs.ContainerImage.from_registry("nginx:latest"),container_port=80),desired_count=2,public_load_balancer=True)# RDS Databasedatabase=rds.DatabaseInstance(self,"WebAppDB",engine=rds.DatabaseInstanceEngine.mysql(version=rds.MysqlEngineVersion.VER_8_0_28),instance_type=ec2.InstanceType.of(ec2.InstanceClass.T3,ec2.InstanceSize.MICRO),vpc=vpc,multi_az=False,allocated_storage=20,deletion_protection=False)# Allow connections from Fargate to RDSdatabase.connections.allow_from(fargate_service.service,ec2.Port.tcp(3306))# Output the load balancer URLcore.CfnOutput(self,"LoadBalancerDNS",value=fargate_service.load_balancer.load_balancer_dns_name)app=core.App()WebAppStack(app,"WebAppStack")app.synth()
DevOps Tools
AWS CodePipeline
Servizio di continuous integration e continuous delivery (CI/CD).
# Enable GuardDuty via AWS SDKimportboto3guardduty=boto3.client('guardduty')# Create detectordetector_response=guardduty.create_detector(Enable=True,FindingPublishingFrequency='FIFTEEN_MINUTES')detector_id=detector_response['DetectorId']# Configure threat intelligence feedsguardduty.create_threat_intel_set(DetectorId=detector_id,Name='CustomThreatIntel',Format='TXT',Location='s3://my-threat-intel-bucket/threats.txt',Activate=True)# Setup SNS notification for findingsguardduty.create_filter(DetectorId=detector_id,Name='HighSeverityFindings',Action='ARCHIVE',Description='Filter for high severity findings',FindingCriteria={'Criterion':{'severity':{'Gte':7.0}}})
AWS Config
Servizio per audit e compliance della configurazione delle risorse.
1
2
3
4
5
6
7
8
9
10
11
12
13
{"ConfigRuleName":"ec2-security-group-attached-to-eni","Description":"Checks if Amazon Elastic Compute Cloud (Amazon EC2) security groups are attached to Amazon Elastic Network Interfaces (ENIs).","Source":{"Owner":"AWS","SourceIdentifier":"EC2_SECURITY_GROUP_ATTACHED_TO_ENI"},"Scope":{"ComplianceResourceTypes":["AWS::EC2::SecurityGroup"]}}
AWS Systems Manager
Gestione centralizzata delle istanze EC2 e on-premises.
importboto3fromdatetimeimportdatetime,timedeltace=boto3.client('ce')# Get cost and usage dataend_date=datetime.now().strftime('%Y-%m-%d')start_date=(datetime.now()-timedelta(days=30)).strftime('%Y-%m-%d')response=ce.get_cost_and_usage(TimePeriod={'Start':start_date,'End':end_date},Granularity='DAILY',Metrics=['BlendedCost'],GroupBy=[{'Type':'DIMENSION','Key':'SERVICE'}])# Analyze top services by costservices_cost={}forresultinresponse['ResultsByTime']:forgroupinresult['Groups']:service=group['Keys'][0]cost=float(group['Metrics']['BlendedCost']['Amount'])services_cost[service]=services_cost.get(service,0)+cost# Print top 10 services by costsorted_services=sorted(services_cost.items(),key=lambdax:x[1],reverse=True)print("Top 10 Services by Cost:")forservice,costinsorted_services[:10]:print(f"{service}: ${cost:.2f}")
# Get Trusted Advisor recommendationsimportboto3support=boto3.client('support',region_name='us-east-1')# List checkschecks=support.describe_trusted_advisor_checks(language='en')# Get specific check results (Cost Optimization)cost_checks=[checkforcheckinchecks['checks']if'cost'incheck['name'].lower()]forcheckincost_checks:result=support.describe_trusted_advisor_check_result(checkId=check['id'],language='en')ifresult['result']['status']in['warning','error']:print(f"Check: {check['name']}")print(f"Status: {result['result']['status']}")print(f"Resources flagged: {len(result['result']['flaggedResources'])}")
Progetti Pratici
Progetto 1: E-commerce Serverless
Architettura completa per un e-commerce serverless.
Il cloud computing e AWS in particolare continuano ad evolversi rapidamente. La chiave del successo è mantenere un approccio di apprendimento continuo, sperimentare regolarmente con nuovi servizi e rimanere aggiornati sulle best practices della community.