使用自定义文件处理步骤 - Amazon Transfer Family
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用自定义文件处理步骤

通过使用自定义文件处理步骤,您可以使用自带文件处理逻辑Amazon Lambda。文件到达后,Transfer Family 服务器调用包含自定义文件处理逻辑的 Lambda 函数,例如加密文件、扫描恶意软件或检查文件类型不正确。在以下示例中,目标Amazon Lambda函数用于处理上一步的输出文件。

注意

有关示例 Lambda 函数,请参阅 自定义工作流程步骤的 Lambda 函数示例

使用自定义工作流程步骤,您必须配置 Lambda 函数才能调用 SendWorkflowStepStateAPI 操作。 SendWorkflowStepState通知工作流程执行人员该步骤已完成,状态为成功或失败。根据 Lambda 函数的结果,SendWorkflowStepStateAPI 操作的状态调用异常处理程序步骤或线性序列中的标称步骤。

如果 Lambda 函数失败或超时,该步骤将失败,您将在 CloudWatch 日志StepErrored中看到。如果 Lambda 函数是标称步骤的一部分,并且该函数响应SendWorkflowStepStateStatus="FAILURE"或超时,则流程将继续执行异常处理程序步骤。在这种情况下,工作流不会继续执行剩余的(如果有)标称步骤。有关更多信息,请参阅 工作流程的异常处理

调用SendWorkflowStepState API 操作时,必须发送以下参数:

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

您可以WorkflowId从 Lambda 函数执行时传递的输入事件中提取Token、和(以下各节显示示例)。ExecutionIdStatus值可以是SUCCESSFAILURE

要能够从您的 Lambda 函数调用SendWorkflowStepState API 操作,您必须使用最新版本的Amazon SDK。

连续使用多个 Lambda 函数

当您依次使用多个自定义步骤时,“文件位置” 选项的工作方式与仅使用单个自定义步骤不同。Transfer Family 不支持将 Lambda 处理过的文件传回以用作下一步的输入。因此,如果您将多个自定义步骤全部配置为使用该previous.file选项,则它们都使用相同的文件位置(第一个自定义步骤的输入文件位置)。

注意

如果在自定义步骤之后有预定义的步骤(标记、复制、解密或删除),则该previous.file设置的工作方式也会有所不同。如果将预定义步骤配置为使用该previous.file设置,则预定义步骤将使用与自定义步骤相同的输入文件。来自自定义步骤的已处理文件不会传递到预定义步骤。

自定义处理后访问文件

如果您使用 Amazon S3 作为存储,并且您的工作流程包含对最初上传的文件执行操作的自定义步骤,则后续步骤将无法访问该处理过的文件。也就是说,自定义步骤之后的任何步骤都不能引用自定义步骤输出中的更新文件。

例如,假设您的工作流中有以下三个步骤。

  • 步骤 1-上传名为的文件example-file.txt

  • 步骤 2-调用以某种方式发生变化example-file.txt的 Lambda 函数。

  • 步骤 3-尝试对更新版本的进行进一步处理example-file.txt

如果将sourceFileLocation步骤 3 配置为${original.file},则步骤 3 将使用服务器在步骤 1 中将文件上传到存储时的原始文件位置。如果您使用${previous.file}步骤 3,则步骤 3 会重复使用步骤 2 用作输入的文件位置。

因此,步骤 3 会导致错误。例如,如果步骤 3 尝试复制更新的example-file.txt,您将收到以下错误:

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

之所以出现此错误,是因为自定义步骤修改了的实体标签 (ETag),example-file.txt使其与原始文件不匹配。

注意

如果您使用的是 Amazon EFS,则不会发生这种行为,因为 Amazon EFS 不使用实体标签来识别文件。

文件上传Amazon Lambda时发送到的示例事件

以下示例显示了文件上传完成Amazon Lambda后发送到的事件。一个示例使用Transfer Family 服务器,其中使用 Amazon S3 配置域名。另一个示例使用Transfer Family 服务器,其中域名使用 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": "DOC-EXAMPLE-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" } }

自定义工作流程步骤的 Lambda 函数示例

以下 Lambda 函数提取有关执行状态的信息,然后调用 SendWorkflowStepStateAPI 操作将状态返回到该步骤的工作流程(SUCCESS或者)FAILURE。在您的函数调用SendWorkflowStepState API 操作之前,您可以将 Lambda 配置为根据您的工作流程逻辑执行操作。

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