

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

# Utilizza passaggi di elaborazione dei file personalizzati
<a name="custom-step-details"></a>

Utilizzando una fase di elaborazione dei file personalizzata, è possibile utilizzare la logica di elaborazione dei file Bring Your Own. AWS Lambda All'arrivo dei file, un server Transfer Family richiama una funzione Lambda che contiene una logica di elaborazione dei file personalizzata, come la crittografia dei file, la scansione alla ricerca di malware o il controllo dei tipi di file errati. Nell'esempio seguente, la AWS Lambda funzione target viene utilizzata per elaborare il file di output del passaggio precedente.

![\[La schermata del passaggio personalizzato, con il pulsante di opzione Applica elaborazione personalizzata al file creato dal passaggio precedente selezionato e una funzione Lambda visualizzata nel campo Target.\]](http://docs.aws.amazon.com/it_it/transfer/latest/userguide/images/workflows-step-custom.png)


**Nota**  
Per un esempio di funzione Lambda, consulta [Esempio di funzione Lambda per una fase del flusso di lavoro personalizzata](#example-workflow-lambda). Ad esempio eventi (inclusa la posizione dei file passati in Lambda), vedi. [Eventi di esempio inviati al AWS Lambda momento del caricamento del file](#example-workflow-lambdas)

Con una fase del flusso di lavoro personalizzata, è necessario configurare la funzione Lambda per richiamare l'operazione [SendWorkflowStepState](https://docs.aws.amazon.com/transfer/latest/APIReference/API_SendWorkflowStepState.html)API. `SendWorkflowStepState`notifica all'esecuzione del flusso di lavoro che il passaggio è stato completato con uno stato di successo o di errore. Lo stato dell'operazione `SendWorkflowStepState` API richiama un passaggio del gestore delle eccezioni o un passaggio nominale nella sequenza lineare, in base al risultato della funzione Lambda. 

Se la funzione Lambda fallisce o scade, il passaggio ha esito negativo e lo vedi `StepErrored` nei log. CloudWatch Se la funzione Lambda fa parte del passaggio nominale e la funzione risponde `SendWorkflowStepState` con `Status="FAILURE"` o scade, il flusso continua con i passaggi del gestore delle eccezioni. In questo caso, il flusso di lavoro non continua a eseguire i passaggi nominali rimanenti (se presenti). Per ulteriori dettagli, consultare [Gestione delle eccezioni per un flusso di lavoro](transfer-workflows.md#exception-workflow).

Quando si chiama l'operazione `SendWorkflowStepState` API, è necessario inviare i seguenti parametri:

```
{
    "ExecutionId": "string",
    "Status": "string",
    "Token": "string",
    "WorkflowId": "string"
}
```

È possibile estrarre il `ExecutionId``Token`, e `WorkflowId` dall'evento di input che viene passato quando viene eseguita la funzione Lambda (gli esempi sono mostrati nelle sezioni seguenti). Il `Status` valore può essere o. `SUCCESS` `FAILURE` 

Per poter richiamare l'operazione `SendWorkflowStepState` API dalla funzione Lambda, è necessario utilizzare una versione dell' AWS SDK pubblicata dopo l'introduzione dei flussi di [lavoro gestiti](doc-history.md#workflows-introduced).

## Utilizzo consecutivo di più funzioni Lambda
<a name="multiple-lambdas"></a>

Quando si utilizzano più passaggi personalizzati uno dopo l'altro, l'opzione **Posizione del file** funziona in modo diverso rispetto all'utilizzo di un solo passaggio personalizzato. Transfer Family non supporta il trasferimento del file elaborato da Lambda per utilizzarlo come input del passaggio successivo. Quindi, se avete più passaggi personalizzati tutti configurati per utilizzare l'`previous.file`opzione, tutti utilizzano la stessa posizione del file (la posizione del file di input per il primo passaggio personalizzato).

**Nota**  
L'`previous.file`impostazione funziona in modo diverso anche se si dispone di un passaggio predefinito (etichettare, copiare, decrittografare o eliminare) dopo un passaggio personalizzato. Se il passaggio predefinito è configurato per utilizzare l'`previous.file`impostazione, il passaggio predefinito utilizza lo stesso file di input utilizzato dal passaggio personalizzato. Il file elaborato dal passaggio personalizzato non viene passato al passaggio predefinito. 

## Accesso a un file dopo l'elaborazione personalizzata
<a name="process-uploaded-file"></a>

Se utilizzi Amazon S3 come storage e se il tuo flusso di lavoro include un passaggio personalizzato che esegue azioni sul file originariamente caricato, i passaggi successivi non possono accedere al file elaborato. In altre parole, nessun passaggio successivo al passaggio personalizzato non può fare riferimento al file aggiornato dall'output del passaggio personalizzato. 

Ad esempio, supponiamo di avere i seguenti tre passaggi nel flusso di lavoro. 
+ **Passaggio 1**: carica un file denominato`example-file.txt`.
+ **Passaggio 2**: richiama una funzione Lambda che `example-file.txt` cambia in qualche modo.
+ **Fase 3** — Tentativo di eseguire ulteriori elaborazioni sulla versione aggiornata di. `example-file.txt`

Se si configura `sourceFileLocation` la Fase 3 in modo che sia la Fase 3`${original.file}`, la Fase 3 utilizza la posizione originale del file da quando il server ha caricato il file nell'archivio nella Fase 1. Se lo utilizzi `${previous.file}` per lo Step 3, lo Step 3 riutilizza la posizione del file utilizzata dallo Step 2 come input.

Pertanto, lo Step 3 causa un errore. Ad esempio, se nel passaggio 3 si tenta di copiare l'aggiornamento`example-file.txt`, viene visualizzato il seguente errore:

```
{
    "type": "StepErrored",
    "details": {
        "errorType": "NOT_FOUND",
        "errorMessage": "ETag constraint not met (Service: null; Status Code: 412; Error Code: null; Request ID: null; S3 Extended Request ID: null; Proxy: null)",
        "stepType": "COPY",
        "stepName": "CopyFile"
    },
```

Questo errore si verifica perché il passaggio personalizzato modifica il tag di entità (ETag) `example-file.txt` in modo che non corrisponda al file originale.

**Nota**  
Questo comportamento non si verifica se utilizzi Amazon EFS perché Amazon EFS non utilizza tag di entità per identificare i file.

## Eventi di esempio inviati al AWS Lambda momento del caricamento del file
<a name="example-workflow-lambdas"></a>

Gli esempi seguenti mostrano gli eventi a cui vengono inviati AWS Lambda quando il caricamento di un file è completo. Un esempio utilizza un server Transfer Family in cui il dominio è configurato con Amazon S3. L'altro esempio utilizza un server Transfer Family in cui il dominio utilizza Amazon EFS. 

------
#### [ Custom step that uses an Amazon S3 domain ]

```
{
    "token": "MzI0Nzc4ZDktMGRmMi00MjFhLTgxMjUtYWZmZmRmODNkYjc0",
    "serviceMetadata": {
        "executionDetails": {
            "workflowId": "w-1234567890example",
            "executionId": "abcd1234-aa11-bb22-cc33-abcdef123456"
        },
        "transferDetails": {
            "sessionId": "36688ff5d2deda8c",
            "userName": "myuser",
            "serverId": "s-example1234567890"
        }
    },
    "fileLocation": {
        "domain": "S3",
        "bucket": "amzn-s3-demo-bucket",
        "key": "path/to/mykey",
        "eTag": "d8e8fca2dc0f896fd7cb4cb0031ba249",
        "versionId": null
    }
}
```

------
#### [ Custom step that uses an Amazon EFS domain ]

```
{
    "token": "MTg0N2Y3N2UtNWI5Ny00ZmZlLTk5YTgtZTU3YzViYjllNmZm",
    "serviceMetadata": {
        "executionDetails": {
            "workflowId": "w-1234567890example",
            "executionId": "abcd1234-aa11-bb22-cc33-abcdef123456"
        },
        "transferDetails": {
            "sessionId": "36688ff5d2deda8c",
            "userName": "myuser",
            "serverId": "s-example1234567890"
        }
    },
    "fileLocation": {
        "domain": "EFS",
        "fileSystemId": "fs-1234567",
        "path": "/path/to/myfile"
    }
}
```

------

## Esempio di funzione Lambda per una fase del flusso di lavoro personalizzata
<a name="example-workflow-lambda"></a>

La seguente funzione Lambda estrae le informazioni relative allo stato di esecuzione, quindi chiama l'operazione [SendWorkflowStepState](https://docs.aws.amazon.com/transfer/latest/APIReference/API_SendWorkflowStepState.html)API per restituire lo stato al flusso di lavoro per la fase, ovvero. `SUCCESS` `FAILURE` Prima che la funzione richiami l'operazione `SendWorkflowStepState` API, puoi configurare Lambda per eseguire un'azione basata sulla logica del tuo flusso di lavoro. 

```
import json
import boto3

transfer = boto3.client('transfer')

def lambda_handler(event, context):
    print(json.dumps(event))

    # call the SendWorkflowStepState API to notify the workflow about the step's SUCCESS or FAILURE status
    response = transfer.send_workflow_step_state(
        WorkflowId=event['serviceMetadata']['executionDetails']['workflowId'],
        ExecutionId=event['serviceMetadata']['executionDetails']['executionId'],
        Token=event['token'],
        Status='SUCCESS|FAILURE'
    )

    print(json.dumps(response))

    return {
      'statusCode': 200,
      'body': json.dumps(response)
    }
```

## Autorizzazioni IAM per un passaggio personalizzato
<a name="custom-step-iam"></a>

Per consentire il completamento di un passaggio che richiama una Lambda, assicurati che il ruolo di esecuzione per il tuo flusso di lavoro contenga le seguenti autorizzazioni.

```
{
    "Sid": "Custom",
    "Effect": "Allow",
    "Action": [
        "lambda:InvokeFunction"
    ],
    "Resource": [
        "arn:aws:lambda:region:account-id:function:function-name"
    ]
}
```