

Amazon non CodeCatalyst è più aperta a nuovi clienti. I clienti esistenti possono continuare a utilizzare il servizio normalmente. Per ulteriori informazioni, consulta [Come migrare da CodeCatalyst](migration.md).

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à.

# Tutorial: Implementazione di un'applicazione serverless
<a name="deploy-tut-lambda"></a>

In questo tutorial, imparerai come creare, testare e distribuire un'applicazione serverless come stack utilizzando un flusso di lavoro. CloudFormation 

L'applicazione in questo tutorial è una semplice applicazione web che emette un messaggio «Hello World». È costituito da una AWS Lambda funzione e da un Amazon API Gateway e lo si crea utilizzando [AWS Serverless Application Model (AWS SAM)](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html), che è un'estensione di [CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html).

**Topics**
+ [

## Prerequisiti
](#deploy-tut-lambda-cfn-prereqs)
+ [

## Fase 1: Creare un archivio di sorgenti
](#deploy-tut-lambda-cfn-source)
+ [

## Fase 2: Creare ruoli AWS
](#deploy-tut-lambda-cfn-roles)
+ [

## Fase 3: Aggiungere ruoli a AWS CodeCatalyst
](#deploy-tut-lambda-cfn-roles-add)
+ [

## Fase 4: creare un bucket Amazon S3
](#deploy-tut-lambda-cfn-s3)
+ [

## Passaggio 5: Aggiungere i file sorgente
](#deploy-tut-lambda-cfn-files)
+ [

## Passaggio 6: creare ed eseguire un flusso di lavoro
](#deploy-tut-lambda-cfn-workflow)
+ [

## Fase 7: Apportare una modifica
](#deploy-tut-lambda-cfn-change)
+ [

## Eliminazione
](#deploy-tut-lambda-cfn-clean-up)

## Prerequisiti
<a name="deploy-tut-lambda-cfn-prereqs"></a>

Prima di iniziare:
+ È necessario uno CodeCatalyst **spazio** con un AWS account connesso. Per ulteriori informazioni, consulta [Creazione di uno spazio](spaces-create.md).
+ Nel tuo spazio, hai bisogno di un progetto vuoto chiamato:

  ```
  codecatalyst-cfn-project
  ```

  Usa l'opzione **Inizia da zero** per creare questo progetto.

  Per ulteriori informazioni, consulta [Creare un progetto vuoto in Amazon CodeCatalyst](projects-create.md#projects-create-empty).
+ Nel tuo progetto, hai bisogno di un CodeCatalyst **ambiente** chiamato:

  ```
  codecatalyst-cfn-environment
  ```

  Configura questo ambiente come segue:
  + Scegli qualsiasi tipo, ad esempio **Non di produzione**.
  + Connect il tuo AWS account.
  + Per il **ruolo IAM predefinito**, scegli un ruolo qualsiasi. Specificherai un ruolo diverso in seguito.

  Per ulteriori informazioni, consulta [Implementazione in e Account AWS VPCs](deploy-environments.md).

## Fase 1: Creare un archivio di sorgenti
<a name="deploy-tut-lambda-cfn-source"></a>

In questo passaggio, creerai un repository di origine in. CodeCatalyst Questo repository viene utilizzato per archiviare i file sorgente del tutorial, come il file della funzione Lambda. 

Per ulteriori informazioni sui repository dei sorgenti, consulta. [Creazione di un repository di sorgenti](source-repositories-create.md)

**Per creare un archivio di sorgenti**

1. Nel CodeCatalyst riquadro di navigazione, scegli **Codice**, quindi scegli Archivi di **origine.** 

1. Scegli **Aggiungi repository**, quindi scegli **Crea** repository.

1. Nel **nome del repository, inserisci:**

   ```
   codecatalyst-cfn-source-repository
   ```

1. Scegli **Create** (Crea).

Ora hai creato un repository chiamato. `codecatalyst-cfn-source-repository`

## Fase 2: Creare ruoli AWS
<a name="deploy-tut-lambda-cfn-roles"></a>

In questo passaggio, crei i seguenti ruoli AWS IAM:
+ **Ruolo Deploy**: concede all'azione CodeCatalyst **Deploy CloudFormation stack** l'autorizzazione ad accedere al tuo AWS account e al CloudFormation servizio su cui distribuirai la tua applicazione serverless. L'azione **Deploy CloudFormation stack** fa parte del tuo flusso di lavoro.
+ **Ruolo di compilazione**: concede all'azione di CodeCatalyst compilazione l'autorizzazione ad accedere al tuo AWS account e scrivere su Amazon S3 dove verrà archiviato il pacchetto di applicazioni serverless. L'azione di compilazione fa parte del tuo flusso di lavoro.
+ **Ruolo Stack**: concede CloudFormation l'autorizzazione a leggere e modificare le risorse specificate nel AWS SAM modello che fornirai in seguito. Concede inoltre l'autorizzazione a. CloudWatch

Per ulteriori informazioni sui ruoli IAM, consulta i [ruoli IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) nella *Guida per l'AWS Identity and Access Management utente*.

**Nota**  
Per risparmiare tempo, puoi creare un singolo ruolo, chiamato `CodeCatalystWorkflowDevelopmentRole-spaceName` ruolo, anziché i tre ruoli elencati in precedenza. Per ulteriori informazioni, consulta [Creazione del **CodeCatalystWorkflowDevelopmentRole-*spaceName***ruolo per il tuo account e il tuo spazio](ipa-iam-roles.md#ipa-iam-roles-service-create). Tieni presente che il `CodeCatalystWorkflowDevelopmentRole-spaceName` ruolo ha autorizzazioni molto ampie che possono rappresentare un rischio per la sicurezza. Ti consigliamo di utilizzare questo ruolo solo in tutorial e scenari in cui la sicurezza è meno preoccupante. Questo tutorial presuppone che stiate creando i tre ruoli elencati in precedenza.

**Nota**  
È richiesto anche un [ruolo di esecuzione Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html), ma non è necessario crearlo ora perché il `sam-template.yml` file lo crea automaticamente quando si esegue il flusso di lavoro nel passaggio 5.



**Per creare un ruolo di distribuzione**

1. Crea una politica per il ruolo, come segue:

   1. Accedi a AWS.

   1. Aprire la console IAM all'indirizzo [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

   1. Nel riquadro di navigazione, scegli **Policy**.

   1. Scegli **Create Policy** (Crea policy).

   1. Scegliere la scheda **JSON**.

   1. Eliminare il codice esistente.

   1. Incolla il codice seguente:
**Nota**  
La prima volta che il ruolo viene utilizzato per eseguire azioni del flusso di lavoro, utilizza il carattere jolly nell'informativa sulla politica delle risorse, quindi definisci la politica inserendo il nome della risorsa dopo che è disponibile.  

      ```
      "Resource": "*"
      ```

   1. Scegliere **Next: Tags (Successivo: Tag)**.

   1. Scegliere **Next:Review (Successivo: Rivedi)**.

   1. In **Nome**, inserisci:

      ```
      codecatalyst-deploy-policy
      ```

   1. Scegli **Crea policy**.

      Ora hai creato una politica di autorizzazioni.

1. Crea il ruolo di distribuzione, come segue:

   1. Nel pannello di navigazione, scegli **Ruoli** e quindi **Crea ruolo**.

   1. Scegli una **politica di fiducia personalizzata**.

   1. Elimina la politica di fiducia personalizzata esistente.

   1. Aggiungi la seguente politica di fiducia personalizzata:

   1. Scegli **Next (Successivo)**.

   1. Nelle **politiche di autorizzazione**, cerca `codecatalyst-deploy-policy` e seleziona la relativa casella di controllo.

   1. Scegli **Next (Successivo)**.

   1. Per il **nome del ruolo**, inserisci:

      ```
      codecatalyst-deploy-role
      ```

   1. Per la **descrizione del ruolo**, inserisci:

      ```
      CodeCatalyst deploy role
      ```

   1. Scegli **Crea ruolo**.

   Ora hai creato un ruolo di distribuzione con una politica di fiducia e una politica di autorizzazioni.

1. Ottenere l'ARN del ruolo di distribuzione, come segue:

   1. Nel riquadro di navigazione, seleziona **Ruoli**.

   1. Nella casella di ricerca, inserisci il nome del ruolo che hai appena creato ()`codecatalyst-deploy-role`.

   1. Scegli il ruolo dall'elenco.

      Viene visualizzata la pagina di **riepilogo** del ruolo.

   1. In alto, copia il valore **ARN.**

   Ora hai creato il ruolo di distribuzione con le autorizzazioni appropriate e ottenuto il relativo ARN.

**Per creare un ruolo di costruzione**

1. Crea una politica per il ruolo, come segue:

   1. Accedi a AWS.

   1. Aprire la console IAM all'indirizzo [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

   1. Nel riquadro di navigazione, scegli **Policy**.

   1. Scegli **Create Policy** (Crea policy).

   1. Scegliere la scheda **JSON**.

   1. Eliminare il codice esistente.

   1. Incolla il codice seguente:
**Nota**  
La prima volta che il ruolo viene utilizzato per eseguire azioni del flusso di lavoro, utilizza il carattere jolly nell'informativa sulla politica delle risorse, quindi definisci la politica inserendo il nome della risorsa dopo che è disponibile.  

      ```
      "Resource": "*"
      ```

   1. Scegliere **Next: Tags (Successivo: Tag)**.

   1. Scegliere **Next:Review (Successivo: Rivedi)**.

   1. In **Nome**, inserisci:

      ```
      codecatalyst-build-policy
      ```

   1. Scegli **Crea policy**.

      Ora hai creato una politica di autorizzazioni.

1. Crea il ruolo di costruzione, come segue:

   1. Nel pannello di navigazione, scegli **Ruoli** e quindi **Crea ruolo**.

   1. Scegli una **politica di fiducia personalizzata**.

   1. Elimina la politica di fiducia personalizzata esistente.

   1. Aggiungi la seguente politica di fiducia personalizzata:

   1. Scegli **Next (Successivo)**.

   1. Nelle **politiche di autorizzazione**, cerca `codecatalyst-build-policy` e seleziona la relativa casella di controllo.

   1. Scegli **Next (Successivo)**.

   1. Per il **nome del ruolo**, inserisci:

      ```
      codecatalyst-build-role
      ```

   1. Per la **descrizione del ruolo**, inserisci:

      ```
      CodeCatalyst build role
      ```

   1. Scegli **Crea ruolo**.

   Ora hai creato un ruolo di sviluppo con una politica di fiducia e una politica di autorizzazioni.

1. Ottieni l'ARN del ruolo di costruzione, come segue:

   1. Nel riquadro di navigazione, seleziona **Ruoli**.

   1. Nella casella di ricerca, inserisci il nome del ruolo che hai appena creato (`codecatalyst-build-role`).

   1. Scegli il ruolo dall'elenco.

      Viene visualizzata la pagina di **riepilogo** del ruolo.

   1. In alto, copia il valore **ARN.**

   Ora hai creato il ruolo di costruzione con le autorizzazioni appropriate e ottenuto il relativo ARN.<a name="deploy-tut-lambda-cfn-roles-stack"></a>

**Per creare un ruolo stack**

1. Accedi AWS utilizzando l'account in cui desideri distribuire lo stack.

1. Aprire la console IAM all'indirizzo [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Crea il ruolo dello stack come segue:

   1. Nel pannello di navigazione, seleziona **Roles** (Ruoli).

   1. Selezionare **Create role (Crea ruolo)**.

   1. Scegli un servizio in **Servizio AWS **.

   1. Nella sezione **Caso d'uso**, scegli **CloudFormation**dall'elenco a discesa.

   1. Seleziona il pulsante **CloudFormation**radio.

   1. In basso, scegli **Avanti**.

   1. Utilizzando la casella di ricerca, trova le seguenti politiche di autorizzazione, quindi seleziona le rispettive caselle di controllo.
**Nota**  
Se cerchi una politica e questa non viene visualizzata, assicurati di scegliere **Cancella filtri** e riprova.
      + **CloudWatchFullAccess**
      + **AWS CloudFormationFullAccess**
      + **IAMFullAccesso**
      + **AWS Lambda\$1 FullAccess**
      + **APIGatewayAmministratore Amazon**
      + **Amazon S3 FullAccess**
      + **AmazonEC2ContainerRegistryFullAccess**

      La prima policy consente l'accesso per CloudWatch abilitare i rollback dello stack quando si verifica un allarme.

      Le politiche rimanenti consentono di accedere AWS SAM ai servizi e alle risorse dello stack che verrà distribuito in questo tutorial. *Per ulteriori informazioni, consulta [Autorizzazioni nella Guida](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-permissions.html) per gli AWS Serverless Application Model sviluppatori.*

   1. Scegli **Next (Successivo)**.

   1. Per il **nome del ruolo**, inserisci:

      ```
      codecatalyst-stack-role
      ```

   1. Scegli **Crea ruolo**.

1. Ottieni l'ARN del ruolo stack, come segue:

   1. Nel riquadro di navigazione, seleziona **Ruoli**.

   1. Nella casella di ricerca, inserisci il nome del ruolo che hai appena creato ()`codecatalyst-stack-role`.

   1. Scegli il ruolo dall'elenco.

   1. Nella sezione **Riepilogo**, copia il valore **ARN.** perché sarà necessaria in seguito.

   Ora hai creato il ruolo stack con le autorizzazioni appropriate e ne hai ottenuto l'ARN.

## Fase 3: Aggiungere ruoli a AWS CodeCatalyst
<a name="deploy-tut-lambda-cfn-roles-add"></a>

In questo passaggio, aggiungi build role (`codecatalyst-build-role`) e deploy role (`codecatalyst-deploy-role`) alla connessione dell' CodeCatalyst account nel tuo spazio.

**Nota**  
Non è necessario aggiungere lo stack role (`codecatalyst-stack-role`) alla connessione. Questo perché il ruolo stack viene utilizzato da *CloudFormation*(non CodeCatalyst), *dopo* che è già stata stabilita una connessione tra CodeCatalyst e AWS utilizzando il ruolo deploy. Poiché il ruolo stack non viene utilizzato per accedere CodeCatalyst a AWS, non è necessario che sia associato a una connessione all'account.

**Per aggiungere ruoli, build e deploy alla connessione del tuo account**

1. Nel CodeCatalyst, accedi al tuo spazio.

1. Seleziona **AWS accounts (Account)**. Viene visualizzato un elenco di connessioni all'account.

1. Scegli la connessione all'account che rappresenta l' AWS account in cui hai creato i ruoli di compilazione e distribuzione.

1. Scegli **Gestisci ruoli dalla console AWS di gestione**.

   Viene visualizzata la pagina **Aggiungi ruolo IAM CodeCatalyst allo spazio Amazon**. Potrebbe essere necessario effettuare il login per accedere alla pagina.

1. Seleziona **Aggiungi un ruolo esistente che hai creato in IAM**.

   Viene visualizzato un elenco a discesa. L'elenco mostra tutti i ruoli IAM con una policy di fiducia che include i principali `codecatalyst-runner.amazonaws.com` di `codecatalyst.amazonaws.com` servizio.

1. **Nell'elenco a discesa`codecatalyst-build-role`, scegli e scegli Aggiungi ruolo.**

1. Scegli **Aggiungi ruolo IAM**, scegli **Aggiungi un ruolo esistente che hai creato in IAM** e, nell'elenco a discesa, scegli. `codecatalyst-deploy-role` Scegliere **Add role (Aggiungi ruolo)**.

   Ora hai aggiunto i ruoli di creazione e distribuzione al tuo spazio.

1. Copia il valore del **nome CodeCatalyst visualizzato di Amazon**. Questo valore ti servirà in seguito, durante la creazione del tuo flusso di lavoro.

## Fase 4: creare un bucket Amazon S3
<a name="deploy-tut-lambda-cfn-s3"></a>

In questa fase, crei un bucket Amazon S3 in cui archiviare il file.zip del pacchetto di distribuzione dell'applicazione serverless.

**Come creare un bucket Amazon S3.**

1. Apri la console Amazon S3 all'indirizzo. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)

1. Nel riquadro principale, scegli **Crea bucket**.

1. Per il **nome del bucket, inserisci**:

   ```
   codecatalyst-cfn-s3-bucket
   ```

1. In **AWS Region (Regione)**, scegliere una Regione. Questo tutorial presuppone che tu abbia scelto **US West (Oregon) us-west-2**. Per informazioni sulle regioni supportate da Amazon S3, consulta gli [endpoint e le quote di Amazon Simple Storage Service](https://docs.aws.amazon.com/general/latest/gr/s3.html) nel. *Riferimenti generali di AWS*

1. **Nella parte inferiore della pagina, scegli Crea bucket.**

Ora hai creato un bucket chiamato **codecatalyst-cfn-s3-bucket** nella regione us-west-2 degli Stati Uniti occidentali (Oregon).

## Passaggio 5: Aggiungere i file sorgente
<a name="deploy-tut-lambda-cfn-files"></a>

In questo passaggio, aggiungi diversi file sorgente dell'applicazione al tuo repository CodeCatalyst di origine. La `hello-world` cartella contiene i file dell'applicazione che distribuirete. La `tests` cartella contiene i test unitari. La struttura delle cartelle è la seguente:

```
.
|— hello-world
|  |— tests
|     |— unit
|        |— test-handler.js
|  |— app.js
|— .npmignore
|— package.json
|— sam-template.yml
|— setup-sam.sh
```

### file.npmignore
<a name="deploy-tut-lambda-cfn-files-npmignore"></a>

Il `.npmignore` file indica quali file e cartelle npm deve escludere dal pacchetto dell'applicazione. In questo tutorial, npm esclude la `tests` cartella perché non fa parte dell'applicazione.

**Per aggiungere il file.npmignore**

1. [Apri la console all'indirizzo https://codecatalyst.aws/ CodeCatalyst .](https://codecatalyst.aws/)

1. Scegli il tuo progetto, `codecatalyst-cfn-project`

1. Nel riquadro di navigazione, scegli **Codice**, quindi scegli **Archivi di origine.**

1. Dall'elenco dei repository di origine, scegli il tuo repository,. `codecatalyst-cfn-source-repository` 

1. In **File**, scegli **Crea** file.

1. Per **Nome file**, inserisci:

   ```
   .npmignore
   ```

1. Nella casella di testo, inserisci il seguente codice:

   ```
   tests/*
   ```

1. Scegliete **Commit**, quindi scegliete nuovamente **Commit**.

   Ora hai creato un file chiamato `.npmignore` nella radice del tuo repository.

### file package.json
<a name="deploy-tut-lambda-cfn-files-package-json"></a>

Il `package.json` file contiene importanti metadati sul progetto Node, come il nome del progetto, il numero di versione, la descrizione, le dipendenze e altri dettagli che descrivono come interagire ed eseguire l'applicazione.

`package.json`In questo tutorial sono inclusi un elenco di dipendenze e uno script. `test` Lo script di test esegue le seguenti operazioni:
+ Utilizzando [mocha](https://mochajs.org/), lo script di test esegue i test unitari specificati in `hello-world/tests/unit/` e scrive i risultati in un `junit.xml` file utilizzando il reporter [xunit]().
+ [Utilizzando [Istanbul (nyc)](https://istanbul.js.org/), lo script di test genera un rapporto sulla copertura del codice (`clover.xml`) utilizzando il clover reporter.](https://openclover.org/doc/manual/4.2.0/general--about-openclover.html) Per ulteriori informazioni, consulta [Usare reporter alternativi](https://istanbul.js.org/docs/advanced/alternative-reporters/#clover) nella documentazione di Istanbul.

**Per aggiungere il file package.json**

1. **Nel tuo repository, in **File, scegli Crea file**.**

1. Per **Nome file**, inserisci:

   ```
   package.json
   ```

1. Nella casella di testo, inserisci il seguente codice:

   ```
   {
     "name": "hello_world",
     "version": "1.0.0",
     "description": "hello world sample for NodeJS",
     "main": "app.js",
     "repository": "https://github.com/awslabs/aws-sam-cli/tree/develop/samcli/local/init/templates/cookiecutter-aws-sam-hello-nodejs",
     "author": "SAM CLI",
     "license": "MIT",
     "dependencies": {
       "axios": "^0.21.1",
       "nyc": "^15.1.0"
     },
     "scripts": {
       "test": "nyc --reporter=clover mocha hello-world/tests/unit/ --reporter xunit --reporter-option output=junit.xml"
     },
     "devDependencies": {
       "aws-sdk": "^2.815.0",
       "chai": "^4.2.0",
       "mocha": "^8.2.1"
     }
   }
   ```

1. Scegliete **Commit**, quindi scegliete nuovamente **Commit**.

   Ora hai aggiunto un file chiamato `package.json` alla radice del repository.

### file sam-template.yml
<a name="deploy-tut-lambda-cfn-files-sam-template-yml"></a>

Il `sam-template.yml` file contiene le istruzioni per implementare la funzione Lambda e API Gateway e configurarli insieme. Segue la specifica del [AWS Serverless Application Model modello, che estende la specifica](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-specification.html) del CloudFormation modello.

In questo tutorial utilizzi un AWS SAM modello invece di un CloudFormation modello normale perché AWS SAM offre un utile tipo di risorsa [AWS: :Serverless: :Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html). Questo tipo esegue molte behind-the-scenes configurazioni che normalmente è necessario scrivere per utilizzare la sintassi di base. CloudFormation Ad esempio, `AWS::Serverless::Function` crea una funzione Lambda, un ruolo di esecuzione Lambda e mappature delle sorgenti degli eventi che avviano la funzione. Devi codificare tutto questo se vuoi scriverlo usando basic. CloudFormation

Sebbene questo tutorial utilizzi un modello già scritto, puoi generarne uno come parte del tuo flusso di lavoro utilizzando un'azione di compilazione. Per ulteriori informazioni, consulta [Implementazione di uno stack CloudFormation](deploy-action-cfn.md).

**Per aggiungere il file sam-template.yml**

1. ****Nel tuo repository, in File, scegli Crea file.****

1. Per **Nome file**, inserisci:

   ```
   sam-template.yml
   ```

1. Nella casella di testo, inserisci il seguente codice:

   ```
   AWSTemplateFormatVersion: '2010-09-09'
   Transform: AWS::Serverless-2016-10-31
   Description: >
     serverless-api
   
     Sample SAM Template for serverless-api
     
   # More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
   Globals:
     Function:
       Timeout: 3
   
   Resources:
     HelloWorldFunction:
       Type: AWS::Serverless::Function # For details on this resource type, see https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
       Properties:
         CodeUri: hello-world/
         Handler: app.lambdaHandler
         Runtime: nodejs12.x
         Events:
           HelloWorld:
             Type: Api # For details on this event source type, see https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
             Properties:
               Path: /hello
               Method: get
   
   Outputs:
     # ServerlessRestApi is an implicit API created out of the events key under Serverless::Function
     # Find out about other implicit resources you can reference within AWS SAM at
     # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api
     HelloWorldApi:
       Description: "API Gateway endpoint URL for the Hello World function"
       Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
     HelloWorldFunction:
       Description: "Hello World Lambda function ARN"
       Value: !GetAtt HelloWorldFunction.Arn
     HelloWorldFunctionIamRole:
       Description: "Implicit Lambda execution role created for the Hello World function"
       Value: !GetAtt HelloWorldFunctionRole.Arn
   ```

1. Scegliete **Commit**, quindi scegliete nuovamente **Commit**.

   Ora hai aggiunto un file chiamato `sam-template.yml` nella cartella principale del tuo repository.

### file setup-sam.sh
<a name="deploy-tut-lambda-cfn-files-setup-sam"></a>

Il `setup-sam.sh` file contiene le istruzioni per scaricare e installare l'utilità AWS SAM CLI. Il flusso di lavoro utilizza questa utilità per impacchettare il `hello-world` codice sorgente.

**Per aggiungere il file setup-sam.sh**

1. Nel tuo repository, in **File**, scegli **Crea file**.

1. Per **Nome file**, inserisci:

   ```
   setup-sam.sh
   ```

1. Nella casella di testo, inserisci il seguente codice:

   ```
   #!/usr/bin/env bash
   echo "Setting up sam"
   
   yum install unzip -y
   
   curl -LO https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip
   unzip -qq aws-sam-cli-linux-x86_64.zip -d sam-installation-directory
   
   ./sam-installation-directory/install; export AWS_DEFAULT_REGION=us-west-2
   ```

   Nel codice precedente, sostituiscilo *us-west-2* con la tua AWS regione.

1. Scegli **Commit**, quindi scegli nuovamente **Commit**.

   Ora hai aggiunto un file chiamato `setup-sam.sh` alla radice del repository.

### file app.js
<a name="deploy-tut-lambda-cfn-files-app-js"></a>

`app.js`Contiene il codice della funzione Lambda. In questo tutorial, il codice restituisce il testo`hello world`.

**Per aggiungere il file app.js**

1. Nel tuo repository, in **File**, scegli **Crea file**.

1. Per **Nome file**, inserisci:

   ```
   hello-world/app.js
   ```

1. Nella casella di testo, inserisci il seguente codice:

   ```
   // const axios = require('axios')
   // const url = 'http://checkip.amazonaws.com/';
   let response;
   
   /**
    *
    * Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format
    * @param {Object} event - API Gateway Lambda Proxy Input Format
    *
    * Context doc: https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html 
    * @param {Object} context
    *
    * Return doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html
    * @returns {Object} object - API Gateway Lambda Proxy Output Format
    * 
    */
   exports.lambdaHandler = async (event, context) => {
       try {
           // const ret = await axios(url);
           response = {
               'statusCode': 200,
               'body': JSON.stringify({
                   message: 'hello world',
                   // location: ret.data.trim()
               })
           }
       } catch (err) {
           console.log(err);
           return err;
       }
   
       return response
   };
   ```

1. Scegliete **Commit**, quindi scegliete nuovamente **Commit**.

   Ora hai creato una cartella chiamata `hello-world` e un file chiamato`app.js`.

### file test-handler.js
<a name="deploy-tut-lambda-cfn-files-test-handler-js"></a>

Il `test-handler.js` file contiene test unitari per la funzione Lambda.

**Per aggiungere il file test-handler.js**

1. Nel tuo repository, in **File**, scegli **Crea file**.

1. Per **Nome file**, inserisci:

   ```
   hello-world/tests/unit/test-handler.js
   ```

1. Nella casella di testo, inserisci il seguente codice:

   ```
   'use strict';
   
   const app = require('../../app.js');
   const chai = require('chai');
   const expect = chai.expect;
   var event, context;
   
   describe('Tests index', function () {
       it('verifies successful response', async () => {
           const result = await app.lambdaHandler(event, context)
   
           expect(result).to.be.an('object');
           expect(result.statusCode).to.equal(200);
           expect(result.body).to.be.an('string');
   
           let response = JSON.parse(result.body);
   
           expect(response).to.be.an('object');
           expect(response.message).to.be.equal("hello world");
           // expect(response.location).to.be.an("string");
       });
   });
   ```

1. Scegliete **Commit**, quindi scegliete nuovamente **Commit**.

   Ora hai aggiunto un file chiamato `test-handler.js` sotto la `hello-world/tests/unit` cartella.

Ora hai aggiunto tutti i tuoi file sorgente.

Prenditi un momento per ricontrollare il tuo lavoro e assicurati di aver inserito tutti i file nelle cartelle corrette. La struttura delle cartelle è la seguente:

```
.
|— hello-world
|  |— tests
|     |— unit
|        |— test-handler.js
|  |— app.js
|— .npmignore
|— README.md
|— package.json
|— sam-template.yml
|— setup-sam.sh
```

## Passaggio 6: creare ed eseguire un flusso di lavoro
<a name="deploy-tut-lambda-cfn-workflow"></a>

In questo passaggio, crei un flusso di lavoro che impacchetta il codice sorgente Lambda e lo distribuisce. Il flusso di lavoro è costituito dai seguenti elementi costitutivi eseguiti in sequenza:
+ Un trigger: questo trigger avvia l'esecuzione automatica del flusso di lavoro quando invii una modifica al tuo repository di origine. Per ulteriori informazioni sui trigger, consulta [L'avvio di un flusso di lavoro viene eseguito automaticamente utilizzando i trigger](workflows-add-trigger.md).
+ Un'azione di test (`Test`): al momento del trigger, questa azione installa il [gestore di pacchetti Node (npm)](https://www.npmjs.com/), quindi esegue il comando. `npm run test` Questo comando dice a npm di eseguire lo `test` script definito nel file. `package.json` Lo `test` script, a sua volta, esegue gli unit test e genera due report: un test report (`junit.xml`) e un rapporto sulla copertura del codice (`clover.xml`). Per ulteriori informazioni, consulta [file package.json](#deploy-tut-lambda-cfn-files-package-json).

  Successivamente, l'azione di test trasforma i report XML in CodeCatalyst report e li visualizza nella CodeCatalyst console, nella scheda **Report** dell'azione di test.

  Per ulteriori informazioni sull'azione di test, vedere[Test con flussi di lavoroTest con flussi di lavoro](test-workflow-actions.md).
+ Un'azione di compilazione (`BuildBackend`): al termine dell'azione di test, l'azione di compilazione scarica e installa la AWS SAM CLI, impacchetta `hello-world` il codice sorgente e copia il pacchetto nel bucket Amazon S3, dove il servizio Lambda prevede che si trovi. L'azione genera anche un nuovo file AWS SAM modello chiamato `sam-template-packaged.yml` e lo inserisce in un elemento di output chiamato. `buildArtifact`

  Per ulteriori informazioni sull'azione di compilazione, consulta. [Creazione con flussi di lavoro](build-workflow-actions.md)
+ A deploy action (`DeployCloudFormationStack`): al termine dell'azione di compilazione, l'azione deploy cerca l'artefatto di output generato dall'azione di compilazione (`buildArtifact`), trova il AWS SAM modello al suo interno e quindi esegue il modello. Il AWS SAM modello crea uno stack che distribuisce l'applicazione serverless.

**Come creare un flusso di lavoro**

1. **Nel riquadro di navigazione, scegli **CI/CD, quindi** scegli Flussi di lavoro.**

1. **Scegli Crea flusso di lavoro.**

1. Per **Source repository**, scegli`codecatalyst-cfn-source-repository`.

1. Per **Branch**, scegli`main`.

1. Scegli **Create** (Crea).

1. Eliminate il codice di esempio YAML.

1. Aggiungi il seguente codice YAML:
**Nota**  
Nel codice YAML che segue, puoi omettere le sezioni se lo `Connections:` desideri. Se ometti queste sezioni, devi assicurarti che il ruolo specificato nel campo **Default IAM role** nel tuo ambiente includa le autorizzazioni e le policy di fiducia di entrambi i ruoli descritte in. [Fase 2: Creare ruoli AWS](#deploy-tut-lambda-cfn-roles) Per ulteriori informazioni sulla configurazione di un ambiente con un ruolo IAM predefinito, consulta. [Creazione di un ambiente](deploy-environments-creating-environment.md)

   ```
   Name: codecatalyst-cfn-workflow
   SchemaVersion: 1.0
   
   Triggers:
     - Type: PUSH
       Branches:
         - main   
   Actions:
     Test:
       Identifier: aws/managed-test@v1
       Inputs:
         Sources:
           - WorkflowSource
       Outputs:
         Reports:
           CoverageReport:
             Format: CLOVERXML
             IncludePaths:
               - "coverage/*"
           TestReport:
             Format: JUNITXML
             IncludePaths:
               - junit.xml
       Configuration:
         Steps:
           - Run: npm install
           - Run: npm run test  
     BuildBackend:
       Identifier: aws/build@v1
       DependsOn:
         - Test
       Environment:
         Name: codecatalyst-cfn-environment
         Connections:
           - Name: codecatalyst-account-connection
             Role: codecatalyst-build-role
       Inputs:
         Sources:
           - WorkflowSource
       Configuration: 
         Steps:
           - Run: . ./setup-sam.sh
           - Run: sam package --template-file sam-template.yml --s3-bucket codecatalyst-cfn-s3-bucket --output-template-file sam-template-packaged.yml --region us-west-2
       Outputs:
         Artifacts:
           - Name: buildArtifact
             Files:
               - "**/*"
     DeployCloudFormationStack:
       Identifier: aws/cfn-deploy@v1
       DependsOn: 
         - BuildBackend
       Environment:
         Name: codecatalyst-cfn-environment
         Connections:
           - Name: codecatalyst-account-connection
             Role: codecatalyst-deploy-role
       Inputs:
         Artifacts:
           - buildArtifact
         Sources: []
       Configuration:
         name: codecatalyst-cfn-stack
         region: us-west-2
         role-arn: arn:aws:iam::111122223333:role/StackRole
         template: ./sam-template-packaged.yml
         capabilities: CAPABILITY_IAM,CAPABILITY_AUTO_EXPAND
   ```

   Nel codice precedente, sostituisci:
   + Entrambe le istanze *codecatalyst-cfn-environment* con il nome dell'ambiente.
   + Entrambe le istanze *codecatalyst-account-connection* con il nome visualizzato della connessione all'account. Il nome visualizzato potrebbe essere un numero. Per ulteriori informazioni, consulta [Fase 3: Aggiungere ruoli a AWS CodeCatalyst](#deploy-tut-lambda-cfn-roles-add).
   + *codecatalyst-build-role*con il nome del ruolo di build in cui hai creato[Fase 2: Creare ruoli AWS](#deploy-tut-lambda-cfn-roles).
   + *codecatalyst-cfn-s3-bucket*con il nome del bucket Amazon S3 in cui hai creato. [Fase 4: creare un bucket Amazon S3](#deploy-tut-lambda-cfn-s3)
   + Entrambe le istanze sono nella regione in cui risiede il bucket Amazon S3 (prima istanza) e in cui verrà distribuito lo stack (seconda istanza). *us-west-2* Queste regioni possono essere diverse. Questo tutorial presuppone che entrambe le regioni siano impostate su. `us-west-2` Per informazioni dettagliate sulle regioni supportate da Amazon S3 e CloudFormation, consulta [Endpoint e quote del servizio](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html) nel. *Riferimenti generali di AWS*
   + *codecatalyst-deploy-role*con il nome del ruolo di distribuzione in cui hai creato. [Fase 2: Creare ruoli AWS](#deploy-tut-lambda-cfn-roles)
   + *codecatalyst-cfn-environment*con il nome dell'ambiente in [Prerequisiti](#deploy-tut-lambda-cfn-prereqs) cui hai creato.
   + *arn:aws:iam::111122223333:role/StackRole*con l'Amazon Resource Name (ARN) del ruolo stack in cui hai creato. [Fase 2: Creare ruoli AWS](#deploy-tut-lambda-cfn-roles)
**Nota**  
Se avete deciso di non creare ruoli di compilazione, distribuzione e impilamento *codecatalyst-build-role**codecatalyst-deploy-role*, sostituiteli e *arn:aws:iam::111122223333:role/StackRole* inserite il nome o l'ARN del ruolo. `CodeCatalystWorkflowDevelopmentRole-spaceName` Per ulteriori informazioni su questo ruolo, consulta [Fase 2: Creare ruoli AWS](#deploy-tut-lambda-cfn-roles).

   Per informazioni sulle proprietà del codice mostrato in precedenza, consulta la. [Azione 'Implementa CloudFormation stack' YAML](deploy-action-ref-cfn.md)

1. (Facoltativo) Scegliete **Convalida** per assicurarvi che il codice YAML sia valido prima di eseguire il commit.

1. Scegli **Applica**.

1. Nella finestra di dialogo **Conferma flusso di lavoro**, inserisci quanto segue:

   1. Per il **nome del file Workflow**, mantenete il valore predefinito,`codecatalyst-cfn-workflow`.

   1. Per il **messaggio** di conferma, inserisci:

      ```
      add initial workflow file
      ```

   1. Per **Repository**, scegli **codecatalyst-cfn-source-repository**.

   1. Per il **nome del ramo**, scegli **principale**.

   1. Scegli **Applica**.

   Ora hai creato un flusso di lavoro. L'esecuzione di un flusso di lavoro viene avviata automaticamente a causa del trigger definito nella parte superiore del flusso di lavoro. In particolare, quando hai eseguito il commit (e inviato) del `codecatalyst-cfn-workflow.yaml` file nell'archivio di origine, il trigger ha avviato l'esecuzione del flusso di lavoro.

**Per visualizzare il flusso di lavoro in corso**

1. **Nel riquadro di navigazione, scegli **CI/CD**, quindi scegli Flussi di lavoro.**

1. Scegli il flusso di lavoro che hai appena creato:. `codecatalyst-cfn-workflow`

1. Scegli la scheda **Esecuzioni**.

1. Nella colonna **Run ID**, scegli l'ID di esecuzione.

1. Scegli **Test** per vedere l'avanzamento dei test.

1. Scegli **BuildBackend**di vedere lo stato di avanzamento della costruzione.

1. Scegli **DeployCloudFormationStack**di vedere lo stato di avanzamento della distribuzione.

   Per ulteriori informazioni sulla visualizzazione dei dettagli dell'esecuzione, consulta[Visualizzazione dello stato e dei dettagli dell'esecuzione del flusso di lavoro](workflows-view-run.md).

1. Al termine dell'**DeployCloudFormationStack**azione, procedi come segue:
   + Se l'esecuzione del flusso di lavoro è riuscita, passate alla procedura successiva.
   + Se l'esecuzione del flusso di lavoro non è riuscita durante il **test** o **BuildBackend**l'azione, scegli **Registri** per risolvere il problema.
   + **Se l'esecuzione del flusso di lavoro non è riuscita nell'**DeployCloudFormationStack**azione, scegli l'azione di distribuzione, quindi scegli la scheda Riepilogo.** Scorri fino alla sezione **CloudFormation degli eventi** per visualizzare il messaggio di errore dettagliato. Se si è verificato un rollback, elimina lo `codecatalyst-cfn-stack` stack tramite la CloudFormation console AWS prima di eseguire nuovamente il flusso di lavoro.

**Per verificare la distribuzione**

1. Dopo una distribuzione riuscita, scegli **Variabili (7)** dalla barra dei menu orizzontale in alto. (Non scegliete **Variabili** nel riquadro a destra).

1. Successivamente **HelloWorldApi**, incolla l'`https://`URL in un browser.

   Viene visualizzato un messaggio JSON **hello world** dalla funzione Lambda, che indica che il flusso di lavoro ha distribuito e configurato correttamente la funzione Lambda e l'API Gateway.
**Suggerimento**  
È possibile CodeCatalyst visualizzare questo URL nel diagramma del flusso di lavoro con alcune piccole configurazioni. Per ulteriori informazioni, consulta [Visualizzazione dell'URL dell'app nel diagramma del flusso di lavoro](deploy-app-url.md).

**Per verificare i risultati dei test unitari e la copertura del codice**

1. Nel diagramma del flusso di lavoro, scegli **Test**, quindi scegli **Report**.

1. Scegliete di **TestReport**visualizzare i risultati del test unitario o scegliete di **CoverageReport**visualizzare i dettagli della copertura del codice dei file da testare, in questo caso, `app.js` e`test-handler.js`.

**Per verificare le risorse distribuite**

1. Accedi Console di gestione AWS e apri la console API Gateway all'indirizzo [https://console.aws.amazon.com/apigateway/](https://console.aws.amazon.com/apigateway/). 

1. Osserva l'**codecatalyst-cfn-stack**API creata dal AWS SAM modello. Il nome dell'API deriva dal `Configuration/name` valore nel file di definizione del flusso di lavoro (`codecatalyst-cfn-workflow.yaml`).

1. Apri la AWS Lambda console all'indirizzo [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

1. Nel riquadro di navigazione, seleziona **Funzioni**.

1. Scegli la tua funzione Lambda,. `codecatalyst-cfn-stack-HelloWorldFunction-string`

1. Puoi vedere come l'API Gateway funge da trigger per la funzione. Questa integrazione è stata configurata automaticamente in base al tipo di AWS SAM `AWS::Serverless::Function` risorsa.

## Fase 7: Apportare una modifica
<a name="deploy-tut-lambda-cfn-change"></a>

In questo passaggio, apporti una modifica al codice sorgente Lambda e la esegui il commit. Questo commit avvia l'esecuzione di un nuovo flusso di lavoro. Questa esecuzione implementa la nuova funzione Lambda in uno schema blu-verde che utilizza la configurazione di spostamento del traffico predefinita specificata nella console Lambda.

**Per apportare una modifica alla sorgente Lambda**

1. In CodeCatalyst, accedi al tuo progetto.

1. Nel riquadro di navigazione, scegli **Codice**, quindi scegli **Archivi di origine.**

1. Scegli il tuo repository `codecatalyst-cfn-source-repository` di origine.

1. Cambia il file dell'applicazione:

   1. Scegliere la cartella `hello-world`.

   1. Scegli il `app.js` file.

   1. Scegli **Modifica**.

   1. Sulla riga 23, cambia `hello world` in**Tutorial complete\$1**.

   1. Scegli **Commetti**, quindi scegli di nuovo **Commetti**.

      Il commit avvia l'esecuzione di un flusso di lavoro. Questa esecuzione avrà esito negativo perché non hai aggiornato gli unit test per riflettere la modifica del nome.

1. Aggiorna gli unit test:

   1. Scegli `hello-world\tests\unit\test-handler.js`.

   1. Scegli **Modifica**.

   1. Sulla riga 19, passare `hello world` a**Tutorial complete\$1**.

   1. Scegli **Commetti**, quindi scegli di nuovo **Commetti**.

      Il commit provoca l'avvio di un altro workflow. L'esecuzione avrà esito positivo.

1. **Nel riquadro di navigazione, scegli **CI/CD**, quindi scegli Flussi di lavoro.**

1. **Scegli`codecatalyst-cfn-workflow`, quindi scegli Esecuzioni.**

1. Scegli l'ID di esecuzione dell'ultima esecuzione. Dovrebbe essere ancora in corso.

1. Scegli **Test **BuildBackend****, e **DeployCloudFormationStack**per vedere l'avanzamento del flusso di lavoro viene eseguito.

1. Al termine del flusso di lavoro, scegli **Variabili (7)** nella parte superiore.

1. Successivamente **HelloWorldApi**, incolla l'`https://`URL in un browser.

   Nel browser viene visualizzato un `Tutorial complete!` messaggio che indica che la nuova applicazione è stata distribuita correttamente.

## Eliminazione
<a name="deploy-tut-lambda-cfn-clean-up"></a>

Pulisci i file e i servizi utilizzati in questo tutorial per evitare che ti vengano addebitati dei costi.

**Per pulire la CodeCatalyst console**

1. Apri la CodeCatalyst console all'[indirizzo https://codecatalyst.aws/](https://codecatalyst.aws/).

1. Elimina`codecatalyst-cfn-workflow`.

1. Eliminare`codecatalyst-cfn-environment`.

1. Eliminare`codecatalyst-cfn-source-repository`.

1. Eliminare`codecatalyst-cfn-project`.

**Per pulire in Console di gestione AWS**

1. Effettuare CloudFormation la pulizia nel modo seguente:

   1. Apri la CloudFormation console in [https://console.aws.amazon.com/cloudformation.](https://console.aws.amazon.com/cloudformation/)

   1. Eliminare il `codecatalyst-cfn-stack`.

      L'eliminazione dello stack rimuove tutte le risorse del tutorial dai servizi API Gateway e Lambda.

1. Esegui la pulizia in Amazon S3, come segue:

   1. Apri la console Amazon S3 all'indirizzo. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)

   1. Seleziona `codecatalyst-cfn-s3-bucket`.

   1. Elimina il contenuto del bucket.

   1. Elimina il bucket.

1. Esegui la pulizia in IAM, come segue:

   1. Aprire la console IAM all'indirizzo [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

   1. Eliminare il `codecatalyst-deploy-policy`.

   1. Eliminare il `codecatalyst-build-policy`.

   1. Eliminare il `codecatalyst-stack-policy`.

   1. Eliminare il `codecatalyst-deploy-role`.

   1. Eliminare il `codecatalyst-build-role`.

   1. Eliminare il `codecatalyst-stack-role`.

In questo tutorial, hai imparato a distribuire un'applicazione serverless come CloudFormation stack utilizzando un CodeCatalyst flusso di lavoro e un'azione ** CloudFormation Deploy** stack.