

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Policy di scalabilità basata su Amazon SQS
<a name="as-using-sqs-queue"></a>

**Importante**  
Le seguenti informazioni e passaggi mostrano come calcolare il backlog della coda di Amazon SQS per istanza utilizzando l'attributo `ApproximateNumberOfMessages` queue prima di pubblicarlo come metrica personalizzata su. CloudWatch Tuttavia, ora puoi ridurre i costi e limitare il lavoro necessario per pubblicare il parametro personalizzato utilizzando la matematica dei parametri. Per ulteriori informazioni, consulta [Crea una politica di ridimensionamento del tracciamento degli obiettivi utilizzando la matematica metrica](ec2-auto-scaling-target-tracking-metric-math.md).

Puoi scalare il tuo gruppo Auto Scaling in risposta alle variazioni del carico del sistema in una coda Amazon Simple Queue Service (Amazon SQS). Per ulteriori informazioni su come utilizzare Amazon SQS, consulta [Guida per sviluppatori Amazon Simple Queue](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/).

Vi sono alcuni scenari in cui si potrebbe pensare al dimensionamento in risposta a un'attività in una coda Amazon SQS. Ad esempio, supponi di avere un'app Web che permette agli utenti di caricare immagini e di utilizzarle online. In questo scenario, ogni immagine richiede il ridimensionamento e la codifica, prima di poter essere pubblicata. L'app viene eseguita su istanze EC2 in un gruppo con scalabilità automatica configurato per gestire le tipiche percentuali di caricamento. Le istanze non integre vengono terminate e sostituite per mantenere i livelli di istanze correnti in qualsiasi momento. L'app colloca i dati bitmap grezzi delle immagini in una coda SQS per l'elaborazione. Le elabora e pubblica le immagini elaborate dove possono essere visualizzate dagli utenti. L'architettura per questo scenario funziona bene se il numero di caricamenti di immagini non varia nel tempo. Tuttavia, se il numero di caricamenti cambia nel tempo, per scalare la capacità del gruppo con scalabilità automatica, potresti prendere in considerazione l'utilizzo del dimensionamento dinamico.

**Topics**
+ [Utilizzare il monitoraggio degli obiettivi con il giusto parametro](#scale-sqs-queue-custom-metric)
+ [Limitazioni](#scale-sqs-queue-limitations)
+ [Configurazione del dimensionamento in base ad Amazon SQS](scale-sqs-queue-cli.md)
+ [Amazon SQS e la protezione per la riduzione orizzontale delle istanze](#scale-sqs-queue-scale-in-protection)

## Utilizzare il monitoraggio degli obiettivi con il giusto parametro
<a name="scale-sqs-queue-custom-metric"></a>

Se utilizzi una policy di dimensionamento con monitoraggio degli obiettivi basato su un parametro personalizzato della coda Amazon SQS, il dimensionamento dinamico può adattarsi in modo più efficace alla curva di domanda dell'applicazione. Per ulteriori informazioni sulla scelta dei parametri per il monitoraggio degli obiettivi, consulta [Selezionare i parametri.](as-scaling-target-tracking.md#target-tracking-choose-metrics).

Il problema legato all'utilizzo di una metrica di CloudWatch Amazon SQS come `ApproximateNumberOfMessagesVisible` per il tracciamento delle destinazioni è che il numero di messaggi nella coda potrebbe non cambiare proporzionalmente alla dimensione del gruppo Auto Scaling che elabora i messaggi dalla coda. Ciò accade perché il numero di messaggi nella coda SQS non definisce esclusivamente il numero di istanze necessarie. Il numero di istanze nel gruppo con scalabilità automatica può essere determinato da più fattori, tra cui la quantità di tempo necessaria per elaborare un messaggio e la quantità di latenza (ritardo della coda) accettabile. 

La soluzione è utilizzare un parametro *backlog per instance* (backlog per istanza) dove il valore di destinazione è il *backlog accettabile per istanza* da mantenere. È possibile calcolare questi valori nel modo seguente:
+ **Backlog per instance** (Backlog per istanza): per calcolare il backlog per istanza, occorre partire dall'attributo della coda `ApproximateNumberOfMessages` per determinare la lunghezza della coda SQS (numero di messaggi disponibili per il recupero dalla coda). Per ottenere il backlog per istanza, questo numero va diviso per la capacità in esecuzione del parco istanze, che per un gruppo con scalabilità automatica è il numero di istanze nello stato `InService`.
+ **Acceptable backlog per instance** (Backlog accettabile per istanza): per calcolare il valore di destinazione, prima determina ciò che l'applicazione può accettare in termini di latenza. Quindi dividi il valore di latenza accettabile per il tempo medio che un'istanza EC2 richiede per elaborare un messaggio. 

Ad esempio, supponiamo che al momento si disponga di un gruppo con scalabilità automatica con 10 istanze e il numero di messaggi visibili nella coda (`ApproximateNumberOfMessages`) è 1500. Se il tempo di elaborazione medio è 0,1 secondi per ogni messaggio e la latenza massima accettabile è 10 secondi, il backlog per istanza accettabile è 10/0,1, ovvero 100 messaggi. Questo significa che 100 è il valore di destinazione per la policy con monitoraggio degli obiettivi. Quando il backlog per istanza raggiunge il valore target, si verificherà un evento di aumentazione orizzontale. Poiché il backlog per istanza è già di 150 messaggi (1500 messaggi / 10 istanze), il gruppo si aumenta orizzontalmente e si aumenta orizzontalmente di cinque istanze per mantenere la proporzione con il valore target.

Nelle procedure seguenti viene illustrato come pubblicare il parametro personalizzato e creare una policy di dimensionamento con monitoraggio degli obiettivi che permetta di configurare il gruppo con scalabilità automatica in modo che venga dimensionato in base a questi calcoli.

**Importante**  
Ricorda di utilizzare la matematica dei parametri per ridurre i costi. Per ulteriori informazioni, consulta [Crea una politica di ridimensionamento del tracciamento degli obiettivi utilizzando la matematica metrica](ec2-auto-scaling-target-tracking-metric-math.md).

Sono tre, le parti principali di questa configurazione:
+ Un gruppo con scalabilità automatica per gestire le istanze EC2 per l'elaborazione dei messaggi provenienti dalla coda SQS. 
+ Una metrica personalizzata da inviare ad Amazon CloudWatch che misura il numero di messaggi in coda per istanza EC2 nel gruppo Auto Scaling.
+ Una politica di tracciamento degli obiettivi che configura il gruppo Auto Scaling in modo che venga scalato in base alla metrica personalizzata e a un valore target impostato. CloudWatch gli allarmi richiamano la politica di scalabilità. 

Nel diagramma seguente viene illustrata l'architettura di questa configurazione. 

![\[Dimensionamento automatico Amazon EC2 usando il diagramma architettonico delle code\]](http://docs.aws.amazon.com/it_it/autoscaling/ec2/userguide/images/sqs-as-custom-metric-diagram.png)


## Limitazioni
<a name="scale-sqs-queue-limitations"></a>

È necessario utilizzare AWS CLI o un SDK su cui pubblicare la metrica personalizzata. CloudWatch Puoi quindi monitorare la tua metrica con. Console di gestione AWS

Nelle sezioni seguenti si utilizza il AWS CLI per le attività che è necessario eseguire. Ad esempio, per ottenere dati metrici che riflettano l'uso attuale della coda, si utilizza il comando [get-queue-attributes](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sqs/get-queue-attributes.html)SQS. 

# Configurazione del dimensionamento in base ad Amazon SQS
<a name="scale-sqs-queue-cli"></a>

La procedura seguente descrive come configurare il ridimensionamento automatico basato su Amazon SQS. Imparerai come creare una metrica CloudWatch personalizzata, come impostare una politica di tracciamento degli obiettivi utilizzando e come testare la AWS CLI tua configurazione. 

Prima di iniziare, assicurati di averla AWS CLI [installata](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) e [configurata](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html). Inoltre, è necessario disporre di una coda Amazon SQS da utilizzare. Le seguenti attività presuppongono che tu abbia già una coda (standard o FIFO), un gruppo di Auto Scaling e istanze EC2 che eseguono l'applicazione che utilizza la coda. 

Per ulteriori informazioni su Amazon SQS, consulta la [Guida per gli sviluppatori di Amazon Simple Queue Service)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/).

**Topics**
+ [Fase 1: Creare una metrica personalizzata CloudWatch](#create-sqs-cw-alarms-cli)
+ [Fase 2: creazione una policy di dimensionamento con monitoraggio degli obiettivi](#create-sqs-policies-cli)
+ [Fase 3: test delle policy di dimensionamento](#validate-sqs-scaling-cli)

## Fase 1: Creare una metrica personalizzata CloudWatch
<a name="create-sqs-cw-alarms-cli"></a>

Un parametro personalizzato viene definito utilizzando uno spazio dei nomi e un nome parametro a scelta. Gli spazi dei nomi per i parametri personalizzati non possono iniziare con `AWS/`. Per ulteriori informazioni sulla pubblicazione di metriche personalizzate, consulta l'argomento [Pubblica metriche personalizzate](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/publishingMetrics.html) nella *Amazon CloudWatch User* Guide.

Segui questa procedura per creare la metrica personalizzata leggendo prima le informazioni dal tuo account. AWS Successivamente, calcola il parametro backlog per istanza, come suggerito in una sezione precedente. Infine, pubblica questo numero su con una granularità CloudWatch di 1 minuto. Quando possibile, consigliamo vivamente di dimensionare in base ai parametri con una granularità di 1 minuto, per garantire una risposta più rapida alle modifiche apportate al carico del sistema. 

**Per creare una metrica personalizzata () CloudWatch AWS CLI**

1. Utilizzare il comando SQS [get-queue-attributes](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sqs/get-queue-attributes.html) per ottenere il numero di messaggi in attesa nella coda (`ApproximateNumberOfMessages`). 

   ```
   aws sqs get-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456789/MyQueue \
     --attribute-names ApproximateNumberOfMessages
   ```

1. Utilizza il comando [describe-auto-scaling-groups](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-auto-scaling-groups.html) per ottenere la capacità in esecuzione del gruppo, ovvero il numero di istanze con stato del ciclo di vita `InService`. Questo comando restituisce le istanze di un gruppo con scalabilità automatica insieme allo stato del loro ciclo di vita. 

   ```
   aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names my-asg
   ```

1. Calcola il backlog per istanza dividendo il numero approssimativo di messaggi disponibili per il recupero dalla coda per la capacità operativa del gruppo. 

1. Crea uno script che viene eseguito ogni minuto per recuperare il valore del backlog per istanza e pubblicarlo su una CloudWatch metrica personalizzata. Quando pubblichi una metrica personalizzata, specifichi il nome, lo spazio dei nomi, l'unità, il valore e nessuna o più dimensioni del parametro. Una dimensione è composta da un nome di dimensione e un valore di dimensione.

   Per pubblicare la metrica personalizzata, sostituisci i valori segnaposto *italics* con il nome della metrica preferita, il valore della metrica, uno spazio dei nomi (purché non inizi con "`AWS`«) e le dimensioni (opzionale), quindi esegui il comando seguente. [put-metric-data](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cloudwatch/put-metric-data.html) 

   ```
   aws cloudwatch put-metric-data --metric-name MyBacklogPerInstance --namespace MyNamespace \
     --unit None --value 20 --dimensions MyOptionalMetricDimensionName=MyOptionalMetricDimensionValue
   ```

Quando l'applicazione emette il parametro desiderato, i dati vengono inviati a CloudWatch. La metrica è visibile nella console. CloudWatch Puoi accedervi accedendo Console di gestione AWS e accedendo alla pagina. CloudWatch Puoi visualizzare il parametro passando alla pagina dei parametri oppure cercandolo nella casella di ricerca. Per informazioni sulla visualizzazione dei parametri, consulta [Visualizza i parametri disponibili](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/viewing_metrics_with_cloudwatch.html) nella *Amazon CloudWatch User* Guide.

## Fase 2: creazione una policy di dimensionamento con monitoraggio degli obiettivi
<a name="create-sqs-policies-cli"></a>

Il parametro creato può ora essere aggiunto a una policy di dimensionamento con monitoraggio degli obiettivi.

**Creazione di una policy di dimensionamento con monitoraggio degli obiettivi (AWS CLI)**

1. Utilizza il comando `cat` seguente per archiviare un valore di destinazione per la policy di dimensionamento e una specifica del parametro personalizzato in un file JSON con nome `config.json` nella directory principale. Sostituisci ogni *user input placeholder* con le tue informazioni. Per `TargetValue`, calcola il backlog accettabile per accettabile e inseriscilo qui. Per calcolare questo numero, stabilisci un valore di latenza normale e dividilo per il tempo medio necessario per elaborare un messaggio, come descritto in una precedente sezione. 

   Se non hai specificato alcuna dimensione per il parametro creato nel passaggio 1, non includere alcuna dimensione nel parametro specifico personalizzato.

   ```
   $ cat ~/config.json
   {
      "TargetValue":100,
      "CustomizedMetricSpecification":{
         "MetricName":"MyBacklogPerInstance",
         "Namespace":"MyNamespace",
         "Dimensions":[
            {
               "Name":"MyOptionalMetricDimensionName",
               "Value":"MyOptionalMetricDimensionValue"
            }
         ],
         "Statistic":"Average",
         "Unit":"None"
      }
   }
   ```

1. Utilizzare il comando [put-scaling-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/put-scaling-policy.html) insieme al file `config.json` creato nella fase precedente per creare la policy di dimensionamento.

   ```
   aws autoscaling put-scaling-policy --policy-name sqs100-target-tracking-scaling-policy \
     --auto-scaling-group-name my-asg --policy-type TargetTrackingScaling \
     --target-tracking-configuration file://~/config.json
   ```

   Ciò crea due allarmi: uno per l'aumento e uno per la riduzione orizzontali. Restituisce inoltre l'Amazon Resource Name (ARN) della policy con cui è registrata CloudWatch, che CloudWatch utilizza per richiamare la scalabilità ogni volta che la soglia metrica viene violata. 

## Fase 3: test delle policy di dimensionamento
<a name="validate-sqs-scaling-cli"></a>

Una volta completata la configurazione, verifica che la policy di dimensionamento funzioni. Puoi testarla incrementando il numero di messaggi nella coda SQS e verificando che il gruppo con scalabilità automatica abbia avviato un'istanza EC2 aggiuntiva. Puoi testarla anche diminuendo il numero di messaggi nella coda SQS e verificando che il gruppo con scalabilità automatica abbia terminato un'istanza EC2.

**Per testare la funzione di aumento orizzontale**

1. Segui i passaggi descritti in [Creazione di una coda Amazon SQS standard e invio di un messaggio](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/creating-sqs-standard-queues.html) o [Creazione di una coda Amazon SQS FIFO e invio di un messaggio per aggiungere messaggi alla coda](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/creating-sqs-fifo-queues.html). Verifica di aver aumentato il numero di messaggi nella coda in modo che il parametro backlog per istanza superi il valore di destinazione.

   Possono trascorrere alcuni minuti prima che le modifiche richiamino l'allarme.

1. Utilizzare il comando [describe-auto-scaling-groups](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-auto-scaling-groups.html) per verificare che il gruppo abbia avviato un'istanza.

   ```
   aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg
   ```

**Per testare il funzionamento della bilancia**

1. Segui la procedura descritta in [Ricevere ed eliminare un messaggio (console)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/step-receive-delete-message.html) per eliminare i messaggi dalla coda. Verifica di aver ridotto il numero di messaggi nella coda, in modo che il parametro backlog per istanza sia inferiore al valore di destinazione.

   Possono trascorrere alcuni minuti prima che le modifiche richiamino l'allarme.

1. Utilizzare il comando [describe-auto-scaling-groups](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/describe-auto-scaling-groups.html) per verificare che il gruppo abbia terminato un'istanza.

   ```
   aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg
   ```

## Amazon SQS e la protezione per la riduzione orizzontale delle istanze
<a name="scale-sqs-queue-scale-in-protection"></a>

I messaggi che non sono stati elaborati nel momento in cui un'istanza viene terminata vengono restituiti alla coda SQS dove possono essere elaborati da un altro daemon su un'istanza ancora in esecuzione. Per le applicazioni in cui vengono eseguite attività di lunga durata, è possibile utilizzare facoltativamente la protezione per la riduzione orizzontale dell'istanza per avere il controllo su quali dipendenti della coda vengono terminati quando il gruppo con scalabilità automatica viene ridotto.

Lo pseudocodice seguente mostra un modo per proteggere i processi di lavoro a esecuzione prolungata e basati sulla coda dalla terminazione della riduzione orizzontale.

```
while (true)
{
  SetInstanceProtection(False);
  Work = GetNextWorkUnit();
  SetInstanceProtection(True);
  ProcessWorkUnit(Work);
  SetInstanceProtection(False);
}
```

Per ulteriori informazioni, consulta [Progetta le tue applicazioni per gestire correttamente la chiusura delle istanze](gracefully-handle-instance-termination.md).