

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Gunakan langkah-langkah pemrosesan file khusus
<a name="custom-step-details"></a>

Dengan menggunakan langkah pemrosesan file kustom, Anda dapat menggunakan logika pemrosesan file Anda Sendiri. AWS Lambda Setelah kedatangan file, server Transfer Family memanggil fungsi Lambda yang berisi logika pemrosesan file khusus, seperti mengenkripsi file, memindai malware, atau memeriksa jenis file yang salah. Dalam contoh berikut, AWS Lambda fungsi target digunakan untuk memproses file output dari langkah sebelumnya.

![Layar langkah khusus, dengan Terapkan pemrosesan kustom ke file yang dibuat dari radio langkah sebelumnya tombol dipilih, dan fungsi Lambda ditampilkan di bidang Target.](http://docs.aws.amazon.com/id_id/transfer/latest/userguide/images/workflows-step-custom.png)


**catatan**  
Untuk contoh fungsi Lambda, lihat. [Contoh fungsi Lambda untuk langkah alur kerja khusus](#example-workflow-lambda) Misalnya peristiwa (termasuk lokasi untuk file yang diteruskan ke Lambda), lihat. [Contoh peristiwa dikirim ke AWS Lambda saat file upload](#example-workflow-lambdas)

Dengan langkah alur kerja khusus, Anda harus mengonfigurasi fungsi Lambda untuk memanggil operasi API [SendWorkflowStepState](https://docs.aws.amazon.com/transfer/latest/APIReference/API_SendWorkflowStepState.html). `SendWorkflowStepState`memberitahukan eksekusi alur kerja bahwa langkah telah selesai dengan status sukses atau kegagalan. Status operasi `SendWorkflowStepState` API memanggil langkah penangan pengecualian atau langkah nominal dalam urutan linier, berdasarkan hasil fungsi Lambda. 

Jika fungsi Lambda gagal atau habis waktu, langkahnya gagal, dan Anda lihat `StepErrored` di log Anda CloudWatch . Jika fungsi Lambda adalah bagian dari langkah nominal dan fungsi merespons `SendWorkflowStepState` dengan `Status="FAILURE"` atau waktu habis, aliran berlanjut dengan langkah-langkah penangan pengecualian. Dalam hal ini, alur kerja tidak terus mengeksekusi langkah-langkah nominal yang tersisa (jika ada). Untuk detail selengkapnya, lihat [Penanganan pengecualian untuk alur kerja](transfer-workflows.md#exception-workflow).

Ketika Anda memanggil operasi `SendWorkflowStepState` API, Anda harus mengirim parameter berikut:

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

Anda dapat mengekstrak`ExecutionId`,`Token`, dan `WorkflowId` dari peristiwa masukan yang diteruskan ketika fungsi Lambda dijalankan (contoh ditampilkan di bagian berikut). `Status`Nilainya bisa berupa `SUCCESS` atau`FAILURE`. 

Untuk dapat memanggil operasi `SendWorkflowStepState` API dari fungsi Lambda, Anda harus menggunakan versi AWS SDK yang diterbitkan setelah [Alur Kerja Terkelola diperkenalkan](doc-history.md#workflows-introduced).

## Menggunakan beberapa fungsi Lambda secara berurutan
<a name="multiple-lambdas"></a>

Bila Anda menggunakan beberapa langkah kustom satu demi satu, opsi **lokasi File** bekerja secara berbeda daripada jika Anda hanya menggunakan satu langkah kustom. Transfer Family tidak mendukung Lambda-processed penerusan file kembali untuk digunakan sebagai input langkah berikutnya. Jadi, jika Anda memiliki beberapa langkah khusus yang semuanya dikonfigurasi untuk menggunakan `previous.file` opsi, semuanya menggunakan lokasi file yang sama (lokasi file input untuk langkah kustom pertama).

**catatan**  
`previous.file`Pengaturan juga bekerja secara berbeda jika Anda memiliki langkah yang telah ditentukan (tag, salin, dekripsi, atau hapus) setelah langkah khusus. Jika langkah yang telah ditentukan dikonfigurasi untuk menggunakan `previous.file` pengaturan, langkah yang telah ditentukan menggunakan file input yang sama yang digunakan oleh langkah kustom. File yang diproses dari langkah kustom tidak diteruskan ke langkah yang telah ditentukan. 

## Mengakses file setelah pemrosesan kustom
<a name="process-uploaded-file"></a>

Jika Anda menggunakan Amazon S3 sebagai penyimpanan, dan jika alur kerja menyertakan langkah khusus yang melakukan tindakan pada file yang diunggah semula, langkah selanjutnya tidak dapat mengakses file yang diproses tersebut. Artinya, langkah apa pun setelah langkah khusus tidak dapat mereferensikan file yang diperbarui dari output langkah khusus. 

Misalnya, Anda memiliki tiga langkah berikut dalam alur kerja Anda. 
+ **Langkah 1** - Unggah file bernama`example-file.txt`.
+ **Langkah 2** — Memanggil fungsi Lambda yang `example-file.txt` berubah dalam beberapa cara.
+ **Langkah 3** — Mencoba untuk melakukan pemrosesan lebih lanjut pada versi terbaru dari`example-file.txt`.

Jika Anda mengonfigurasi `sourceFileLocation` untuk Langkah 3`${original.file}`, Langkah 3 menggunakan lokasi file asli dari saat server mengunggah file ke penyimpanan di Langkah 1. Jika Anda menggunakan `${previous.file}` untuk Langkah 3, Langkah 3 menggunakan kembali lokasi file yang Langkah 2 digunakan sebagai input.

Oleh karena itu, Langkah 3 menyebabkan kesalahan. Misalnya, jika langkah 3 mencoba menyalin yang diperbarui`example-file.txt`, Anda menerima kesalahan berikut:

```
{
    "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"
    },
```

Kesalahan ini terjadi karena langkah kustom memodifikasi tag entitas (ETag) `example-file.txt` agar tidak cocok dengan file asli.

**catatan**  
Perilaku ini tidak terjadi jika Anda menggunakan Amazon EFS karena Amazon EFS tidak menggunakan tag entitas untuk mengidentifikasi file.

## Contoh peristiwa dikirim ke AWS Lambda saat file upload
<a name="example-workflow-lambdas"></a>

Contoh berikut menunjukkan peristiwa yang dikirim ke AWS Lambda ketika file upload selesai. Salah satu contoh menggunakan server Transfer Family tempat domain dikonfigurasi dengan Amazon S3. Contoh lainnya menggunakan server Transfer Family di mana domain menggunakan 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"
    }
}
```

------

## Contoh fungsi Lambda untuk langkah alur kerja khusus
<a name="example-workflow-lambda"></a>

Fungsi Lambda berikut mengekstrak informasi mengenai status eksekusi, dan kemudian memanggil operasi [SendWorkflowStepState](https://docs.aws.amazon.com/transfer/latest/APIReference/API_SendWorkflowStepState.html)API untuk mengembalikan status ke alur kerja untuk langkah tersebut—baik atau. `SUCCESS` `FAILURE` Sebelum fungsi Anda memanggil operasi `SendWorkflowStepState` API, Anda dapat mengonfigurasi Lambda untuk mengambil tindakan berdasarkan logika alur kerja Anda. 

```
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)
    }
```

## Izin IAM untuk langkah khusus
<a name="custom-step-iam"></a>

Agar langkah yang memanggil Lambda berhasil, pastikan peran eksekusi untuk alur kerja Anda berisi izin berikut.

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