

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

# AWS Transfer Family 托管工作流程
<a name="transfer-workflows"></a>

 AWS Transfer Family 支持文件处理的托管工作流程。借助托管工作流程，您可以在通过 SFTP、FTPS 或 FTP 传输文件后启动工作流程。使用此功能，您可以协调文件处理所需的所有必要步骤，从而安全且经济高效地满足 business-to-business (B2B) 文件交换的合规性要求。此外，您还可以从 end-to-end审计和可见性中受益。

![\[显示托管工作流如何协助文件处理的流程图。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/workflows-diagram.png)


通过协调文件处理任务，托管工作流可帮助您在下游应用程序使用数据之前对其进行预处理。此类文件处理任务可能包括：
+ 将文件移动到用户特定的文件夹。
+ 作为工作流的一部分对文件进行解密。
+ 标记文件
+ 通过创建 AWS Lambda 函数并将其附加到工作流程来执行自定义处理。
+ 文件成功传输后发送通知。（有关详细介绍此用例的博客文章，请参阅[使用 AWS Transfer Family 托管工作流程自定义文件传送通知](https://aws.amazon.com/blogs/storage/customize-file-delivery-notifications-using-aws-transfer-family-managed-workflows/)。）

要快速复制和标准化组织中多个业务部门的常见上传后文件处理任务，您可以使用基础设施即代码 (IaC) 来部署工作流程。您可以指定要在完整上传的文件上启动托管工作流程。对于因会话过早断开连接而仅部分上传的文件，您也可以指定不同的托管工作流程。内置的异常处理功能可帮助您对文件处理结果做出快速反应，同时让您能够控制如何处理故障。此外，每个工作流程步骤都会生成详细的日志，您可以对其进行审核以跟踪数据沿袭。

要开始使用 ，请执行以下任务：

1. 根据您的要求将工作流程设置为包含预处理操作，例如复制、标记和其他步骤。有关详细信息，请参阅 [创建工作流](create-workflow.md)。

1. 配置执行角色，Transfer Family 会使用该角色来运行工作流程。有关详细信息，请参阅 [适用于工作流程的 IAM 策略](workflow-execution-role.md)。

1. 将工作流程映射到服务器，以便在文件到达时，实时评估和启动此工作流程中指定的操作。有关详细信息，请参阅 [配置和运行工作流程](create-workflow.md#configure-workflow)。

**相关信息**
+ 要监控您的工作流程执行情况，请参阅 [使用 T CloudWatch ransfer Family 服务器的指标](metrics.md)。
+ 有关详细的执行日志和故障排除信息，请参阅 [使用 Amazon 解决与工作流程相关的错误 CloudWatch](workflow-issues.md#workflows-cloudwatch-errors)。
+ Transfer Family 提供了一篇博客文章和一个研讨会，引导你完成文件传输解决方案的构建。该解决方案利用托管 SFTP/FTPS 终端节点 AWS Transfer Family ，利用 Amazon Cognito 和 DynamoDB 进行用户管理。

  该博客文章可在[使用 Amazon Cognito 作为身份提供商 AWS Transfer Family 和 Amazon S3 上](https://aws.amazon.com/blogs/storage/using-amazon-cognito-as-an-identity-provider-with-aws-transfer-family-and-amazon-s3/)找到。您可以[在此](https://catalog.workshops.aws/transfer-family-sftp/en-US)处查看研讨会的详细信息。
+ 以下视频简要介绍了 Transfer Family 托管工作流。  
[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/t-iNqCRospw/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/t-iNqCRospw)
+ [以下研讨会提供动手实验来构建全自动和事件驱动的工作流程，包括将文件传输到外部 SFTP 服务器或从外部 SFTP 服务器传输到 Amazon S3，以及这些文件的常见预处理和后处理：事件驱动的 MFT 研讨会。](https://catalog.us-east-1.prod.workshops.aws/workshops/e55c90e0-bbb0-47e1-be83-6bafa3a59a8a/en-US)

  该视频提供了本次研讨会的详细介绍。  
[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/oojopisG4lA/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/oojopisG4lA)

**Topics**
+ [创建工作流](create-workflow.md)
+ [使用预定义的步骤](nominal-steps-workflow.md)
+ [使用自定义文件处理步骤](custom-step-details.md)
+ [适用于工作流程的 IAM 策略](workflow-execution-role.md)
+ [工作流程的异常处理](#exception-workflow)
+ [监控工作流程执行情况](cloudwatch-workflow.md)
+ [通过模板创建工作流](workflow-template.md)
+ [从 Transfer Family 服务器中移除工作流](#remove-workflow-association)
+ [托管工作流限制和局限性](#limitations-workflow)

有关托管工作流程入门的更多帮助，请参阅以下资源：
+ [AWS Transfer Family 托管工作流程](https://www.youtube.com/watch?v=t-iNqCRospw)演示视频
+ [使用 AWS Transfer Family 工作流程构建云原生文件传输平台](https://aws.amazon.com/blogs/architecture/building-a-cloud-native-file-transfer-platform-using-aws-transfer-family-workflows/)博客文章

# 创建工作流
<a name="create-workflow"></a>

您可以使用创建托管工作流程 AWS 管理控制台，如本主题所述。为了使工作流程创建过程尽可能简单，控制台中的大多数部分都提供了上下文帮助面板。

工作流程有两种步骤：
+ **标称步骤** — 标称步骤是要应用于传入文件的文件处理步骤。如果您选择多个标称步骤，每个步骤将按线性序列处理。
+ **异常处理步骤** — 异常处理程序是文件处理步骤，可在任何标称步骤失败或导致验证错误时 AWS Transfer Family 执行。

**创建工作流**

1. 打开 AWS Transfer Family 控制台，网址为[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/)。

1. 在左侧导航窗格中，选择**工作流**。

1. 在 **工作流**页面，选择 **创建工作流**。

1. 在**创建工作流**页面，输入描述。此描述显示在“**工作流程**”页面上。

1. 在**标称步骤**部分中，选择**添加步骤**。添加一个或多个步骤。

   1. 从可用选项中选择步骤类型。有关各种作业状态的更多信息，请参阅 [使用预定义的步骤](nominal-steps-workflow.md)。

   1. 选择“**下一步**”，然后为该步骤配置参数。

   1. 选择“**下一步**”，然后查看该步骤的详细信息。

   1. 选择“**创建步骤**”以添加该步骤并继续。

   1. 根据需要继续添加步骤。工作流中的最大步骤数为 8。

   1. 添加完所有必需的标称步骤后，向下滚动到“**异常处理程序 - *可选***”部分，然后选择“**添加步骤**”。
**注意**  
为便于您实时了解故障，我们建议您设置异常处理程序和步骤，以便在工作流程失败时执行。

1. 要配置异常处理程序，请按照与前面所述相同的方式添加步骤。如果某个文件导致任何步骤引发异常，则会逐一调用您的异常处理程序。

1. （可选）向下滚动到“**标签**”部分，然后为您的工作流程添加标签。

1. 检查配置并选择**创建工作流**。
**重要**  
创建工作流程后，您将无法对其进行编辑，因此请务必仔细查看配置。

## 配置和运行工作流程
<a name="configure-workflow"></a>

在运行工作流程之前，您需要将其与 Transfer Family 服务器相关联。

**将 Transfer Family 配置为对上传的文件运行工作流程**

1. 打开 AWS Transfer Family 控制台，网址为[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/)。

1. 在左侧导航窗格中，选择**服务器**。
   + 要将工作流程添加到现有服务器，请选择要用于工作流程的服务器。
   + 或者，创建一个新服务器并向其添加工作流程。有关更多信息，请参阅 [配置 SFTP、FTPS 或 FTP 服务器端点](tf-server-endpoint.md)。

1. 在服务器的详细信息页面上，向下滚动到**其他详细信息**部分，然后选择**编辑**。
**注意**  
 默认情况下，服务器没有任何关联的工作流程。您可以使用“**其他详细信息**”部分将工作流与所选服务器相关联。

1. 在**编辑其他详细信息**页面的**托管工作流程**部分，选择要在所有上传中运行的工作流程。
**注意**  
如果您还没有工作流，请选择“**创建新的工作流程**”来创建工作流程。

   1. 选择要使用的工作流程 ID。

   1. 选择执行角色。这是 Transfer Family 在执行工作流程步骤时所扮演的角色。有关更多信息，请参阅 [适用于工作流程的 IAM 策略](workflow-execution-role.md)。选择 **Save**。  
![\[托管工作流程屏幕，显示工作流程和执行角色的值。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/workflows-addtoserver.png)

**注意**  
如果您不想再将工作流程与服务器关联，则可以移除关联。有关更多信息，请参阅 [从 Transfer Family 服务器中移除工作流](transfer-workflows.md#remove-workflow-association)。

**要执行工作流程**

要执行工作流程，您需要将文件上传到您配置了关联工作流程的 Transfer Family 服务器。

**注意**  
无论何时从服务器上移除工作流程并用新的工作流程替换它，或者更新服务器配置（这会影响工作流程的执行角色），都必须等待大约 10 分钟才能执行新的工作流程。Transfer Family 服务器会缓存工作流程细节，服务器需要 10 分钟才能刷新其缓存。  
此外，您必须注销所有活动的 SFTP 会话，然后等待 10 分钟重新登录才能看到更改。

**Example**  

```
# Execute a workflow
> sftp bob@s-1234567890abcdef0.server.transfer.us-east-1.amazonaws.com

Connected to s-1234567890abcdef0.server.transfer.us-east-1.amazonaws.com.
sftp> put doc1.pdf
Uploading doc1.pdf to /amzn-s3-demo-bucket/home/users/bob/doc1.pdf
doc1.pdf                                                                    100% 5013KB 601.0KB/s   00:08    
sftp> exit
>
```

文件上传后，会对您的文件执行定义的操作。例如，如果您的工作流程包含复制步骤，则该文件将会被复制到您在该步骤中定义的位置。您可以使用 Amaz CloudWatch on Logs 来跟踪已执行的步骤及其执行状态。

## 查看工作流详细信息
<a name="view-details-workflow"></a>

您可以查看有关先前创建的工作流程或工作流程执行的详细信息。要查看这些详细信息，您可以使用控制台或 AWS Command Line Interface (AWS CLI)。

------
#### [ Console ]

**查看工作流详细信息**

1. 打开 AWS Transfer Family 控制台，网址为[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/)。

1. 在左侧导航窗格中，选择**工作流**。

1. 在“**工作流程**”页面上，选择一个工作流程。

   工作流程详细信息页面随即打开。  
![\[Transfer Family 工作流程的工作流程详细信息屏幕，显示描述、步骤、异常处理程序和动态执行情况。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/workflows-overview.png)

------
#### [ CLI ]

要查看工作流详细信息，请使用 `describe-workflow` CLI 命令，如以下示例所示。将工作流程 ID `w-1234567890abcdef0` 替换为您自己的值。有关更多信息，请参阅 *AWS CLI 命令引用*中的 [ describe-workflow](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/transfer/describe-workflow.html)。

```
# View Workflow details
> aws transfer describe-workflow --workflow-id w-1234567890abcdef0
{
    "Workflow": {
        "Arn": "arn:aws:transfer:us-east-1:111122223333:workflow/w-1234567890abcdef0",
        "WorkflowId": "w-1234567890abcdef0",
        "Name": "Copy file to shared_files",
        "Steps": [
            {
                "Type": "COPY",
                "CopyStepDetails": {
                "Name": "Copy to shared",
                "FileLocation": {
                    "S3FileLocation": {
                        "Bucket": "amzn-s3-demo-bucket",
                        "Key": "home/shared_files/"
                    }
                }
                }
            }
        ],
        "OnException": {}
    }
}
```

------

如果您的工作流程是作为 AWS CloudFormation 堆栈的一部分创建的，则可以使用 CloudFormation 控制台 ([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)) 管理工作流程。

![\[作为 AWS CloudFormation 堆栈一部分的工作流程的 “工作流程详细信息” 屏幕，显示您管理此工作流程的消息 CloudFormation。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/workflows-cloudformation-link.png)


# 使用预定义的步骤
<a name="nominal-steps-workflow"></a>

创建工作流程时，可以选择添加本主题中讨论的以下预定义步骤之一。您还可选择添加自己的自定义文件处理步骤。有关更多信息，请参阅 [使用自定义文件处理步骤](custom-step-details.md)。

**Topics**
+ [复制文件](#copy-step-details)
+ [解密文件](#decrypt-step-details)
+ [标记文件](#tag-step-details)
+ [delete-file](#delete-step-details)
+ [工作流程的命名变量](#workflow-named-variables)
+ [标记和删除工作流程示例](#sourcefile-workflow)

## 复制文件
<a name="copy-step-details"></a>

复制文件步骤会在新的 Amazon S3 位置创建已上传文件的副本。目前，您只能在 Amazon S3 上使用复制文件步骤。

以下复制文件步骤将文件复制到中的`test`文件夹*amzn-s3-demo-destination-bucket*。

如果复制文件步骤不是工作流程的第一步，则可以指定**文件位置**。通过指定文件位置，您可以复制上一步中使用的文件或上传的原始文件。您可以使用此功能制作原始文件的多个副本，同时保持源文件完好无损，便于文件存档和记录保留。有关示例，请参阅[标记和删除工作流程示例](#sourcefile-workflow)。

![\[带有复制上一步创建的文件的工作流程屏幕... 按钮已选中。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/workflows-step-copy.png)


### 提供存储桶和密钥的详细信息
<a name="copy-provide-bucket"></a>

您必须提供存储桶名称和复制文件步骤的目标密钥。密钥可以是路径名或文件名。将密钥视为路径名还是文件名取决于密钥是否以正斜杠 (`/`) 字符结尾。

如果最后一个字符是 `/`，则您的文件将被复制到此文件夹，并且其名称不会更改。如果最后一个字符是字母数字，则您上传的文件将被重命名为键值。在这种情况下，如果已存在具有该名称的文件，则相关行为将取决于“**覆盖现有文件**”字段的设置。
+ 如果选择**“覆盖现有文件**”，则现有文件会被正在处理的文件替换。
+ 如果未选择**“覆盖现有文件**”，则不会发生任何事情，并且工作流将会停止处理。
**提示**  
如果在同一文件路径上执行并发写入，则在覆盖文件时可能会导致意外行为。

例如，如果您的键值是 `test/`，则您上传的文件将被复制到 `test` 文件夹。如果您的密钥值为 `test/today`，（并且选择了**覆盖现有文件**），则您上传的每个文件都将复制到该 `test` 文件夹中名为 `today` 的文件中，并且每个后续文件都会覆盖前一个文件。

**注意**  
Amazon S3 支持存储桶和对象且没有层次结构。但是，您可以在对象键名称中使用前缀和分隔符来暗示层次结构，并以类似于文件夹的方式组织数据。

### 在复制文件步骤中使用命名变量
<a name="named-variable-copy"></a>

在复制文件步骤中，您可以使用变量将文件动态复制到用户特定的文件夹中。目前，您可以使用 `${transfer:UserName}` 或 `${transfer:UploadDate}` 作为变量，将文件复制到正在上传文件的给定用户的目标位置，或者根据当前日期将文件复制到目标位置。

在以下示例中，如果用户 `richard-roe` 上传文件，则该文件将被复制到 `amzn-s3-demo-destination-bucket/richard-roe/processed/` 文件夹。如果用户 `mary-major` 上传文件，则该文件将被复制到 `amzn-s3-demo-destination-bucket/mary-major/processed/` 文件夹。

![\[复制步骤的参数屏幕，显示存储桶和密钥，使用进行参数化。UserName\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/workflows-step-copy-dynamic.png)


同样，您可以使用 `${transfer:UploadDate}` 作为变量，将文件复制到以当前日期命名的目标位置。在以下示例中，如果您将目标设置为 2022 年 2 月 1 日的 `${transfer:UploadDate}/processed`，则上传的文件将复制到 `amzn-s3-demo-destination-bucket/2022-02-01/processed/` 文件夹。

![\[复制步骤的参数屏幕，显示存储桶和密钥，使用进行参数化。UploadDate\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/workflows-step-copy-dynamic-date.png)


您也可以同时使用这两个变量，将它们的功能结合起来。例如，您可以将 Destinat **ion key 前缀**设置为**folder/\$1\$1transfer:UserName\$1/\$1\$1transfer:UploadDate\$1/**，这将创建嵌套文件夹`folder/marymajor/2023-01-05/`。

### 复制步骤的 IAM 权限
<a name="copy-step-iam"></a>

要允许复制步骤成功，请确保您的工作流程的执行角色包含以下权限。

```
{
    "Sid": "ListBucket",
    "Effect": "Allow",
    "Action": "s3:ListBucket",
    "Resource": [
        "arn:aws:s3:::amzn-s3-demo-destination-bucket"
    ]
}, {
    "Sid": "HomeDirObjectAccess",
    "Effect": "Allow",
    "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObjectVersion",
        "s3:DeleteObject",
        "s3:GetObjectVersion"
    ],
    "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
}
```

**注意**  
仅当您未选择“**覆盖现有文件**”时，才需要 `s3:ListBucket` 权限。此权限会检查您的存储桶，以查看是否已存在同名文件。如果您选择了“**覆盖现有文件**”，则工作流程无需检查文件，只需将其写入即可。  
如果您的 Amazon S3 文件有标签，则需要在 IAM 策略中添加一两个权限。  
为未进行版本控制的 Amazon S3 文件添加 `s3:GetObjectTagging`。
为进行版本控制的 Amazon S3 文件添加 `s3:GetObjectVersionTagging`。

## 解密文件
<a name="decrypt-step-details"></a>

 AWS 存储博客上有一篇文章描述了如何使用 Transfer Family Managed 工作流程、使用 PGP [加密和解密文件以及，无需编写任何代码即可简单地解密文件](https://aws.amazon.com/blogs/storage/encrypt-and-decrypt-files-with-pgp-and-aws-transfer-family/)。 AWS Transfer Family

### 支持的对称加密算法
<a name="symmetric-algorithms"></a>

对于 PGP 解密，Transfer Family 支持对称加密算法，这些算法用于加密 PGP 文件中的实际文件数据。
+ 有关支持的对称加密算法的详细信息，请参见[PGP 对称加密算法](key-management.md#pgp-symmetric-algorithms)。
+ 有关与这些对称算法一起使用的 PGP key pair 算法的信息，请参阅。[PGP key pair 算法](key-management.md#pgp-key-algorithms)

### 在工作流程中使用 PGP 解密
<a name="configure-decryption"></a>

Transfer Family 内置了对 Prety Good Privacy (PGP) 解密的支持。您可以对通过 SFTP、FTPS 或 FTP 上传到 Amazon Simple Storage Service (Amazon S3) 或 Amazon Elastic File System (Amazon EFS) 的文件使用 PGP 解密。

要使用 PGP 解密，必须创建并存储用于解密文件的 PGP 私钥。然后，您的用户可以使用相应的 PGP 加密密钥对文件进行加密，然后再将文件上传到您的 Transfer Family 服务器。收到加密文件后，可以在工作流程中解密这些文件。有关详细教程，请参阅 [设置用于解密文件的托管工作流程](workflow-decrypt-tutorial.md)。

有关支持的 PGP 算法和建议的信息，请参阅[PGP 加密和解密算法](key-management.md#pgp-encryption-algorithms)。

**若要在工作流程中使用 PGP 解密**

1. 确定 Transfer Family 服务器来托管您的工作流，或创建新工作流。您需要先获得服务器 ID，然后才能使用正确的密钥名称在 AWS Secrets Manager 中存储 PGP 密钥。

1. 将您的 PGP 密钥存储在所需的密钥名称 AWS Secrets Manager 下。有关更多信息，请参阅 [管理 PGP 密钥](manage-pgp-keys.md)。工作流程可以根据 Secrets Manager 中的密钥名称自动找到用于解密的正确 PGP 密钥。
**注意**  
当你在 Secret AWS 账户 s Manager 中存储密钥时，会产生费用。有关定价的信息，请参阅[AWS Secrets Manager 定价](https://aws.amazon.com/secrets-manager/pricing)。

1. 使用您的 PGP 密钥对加密文件。（有关受支持的事件的列表，请参阅 [支持的 PGP 客户端](pgp-key-clients.md)。） 如果您使用命令行，请使用以下命令。要使用此命令，请将 `username@example.com` 替换为用于创建 PGP 密钥对的电子邮件地址。将 `testfile.txt` 替换为您要加密的文件名称。

   ```
   gpg -e -r username@example.com testfile.txt
   ```
**重要**  
加密用于 AWS Transfer Family 工作流程的文件时，请务必使用参数指定非匿名收件人。`-r`匿名加密（不指定收件人）可能会导致工作流程中的解密失败，因为系统无法识别要使用哪个密钥进行解密。有关此问题的调试信息，请访问[解决匿名收件人加密问题](workflow-issues.md#workflows-decrypt-anonymous)。

1. 将加密文件上传至您的 Transfer Family 服务器。

1. 在工作流程中配置解密步骤。有关更多信息，请参阅 [添加解密步骤](#decrypt-step-procedure)。

### 添加解密步骤
<a name="decrypt-step-procedure"></a>

解密步骤对作为工作流程一部分上传到 Amazon S3 或 Amazon EFS 的加密文件进行解密。有关配置解密的详细信息，请参阅 [在工作流程中使用 PGP 解密](#configure-decryption)。

在为工作流程创建解密步骤时，必须指定解密文件的目的地。如果目标位置已存在文件，则还必须选择是否覆盖现有文件。您可以使用 Ama CloudWatch zon Logs 监控解密工作流程结果并实时获取每个文件的审核日志。

为步骤选择**解密文件**类型后，将出现“**配置参数**”页面。填写“**配置 PGP 解密参数**”部分的值。

可用选项如下：
+ **步骤名称** - 输入步骤的描述性名称。
+ **文件位置** - 通过指定文件位置，您可以解密上一步中使用的文件或上传的原始文件。
**注意**  
如果此步骤是工作流的第一步，则此参数不可用。
+ **解密文件的目标** - 选择 Amazon S3 存储桶或 Amazon EFS 文件系统作为解密文件的目的地。
  + 如果您选择 Amazon S3，则必须提供目标存储桶名称和目标密钥前缀。要按用户名参数化目标密钥前缀，请为“**\$1\$1transfer:UserName\$1****目标密钥**前缀”输入 。同样，要按上传日期参数化目标密钥前缀，请为“**目标密钥**前缀”输入 **\$1\$1Transfer:UploadDate\$1**。
  + 如果您选择 Amazon EFS，则必须提供目标文件系统和路径。
**注意**  
您在此处选择的存储选项必须与与此工作流程关联的 Transfer Family 服务器使用的存储系统相匹配。否则，当您尝试运行此工作流程时会收到错误。
+ **覆盖现有文件** - 如果您上传了一个文件，并且目标位置上已经存在具有相同文件名的文件，则相关行为取决于此参数的设置：
  + 如果选择**“覆盖现有文件**”，则现有文件会被正在处理的文件替换。
  + 如果未选择**“覆盖现有文件**”，则不会发生任何事情，并且工作流将会停止处理。
**提示**  
如果在同一文件路径上执行并发写入，则在覆盖文件时可能会导致意外行为。

以下屏幕截图显示了您可以为解密文件步骤选择的选项示例。

![\[AWS Transfer Family 控制台，显示配置 PGP 解密参数部分和示例值。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/workflows-step-decrypt-details.png)


### 解密步骤的 IAM 权限
<a name="decrypt-step-iam"></a>

若要使解密步骤成功，请确保您的工作流程的执行角色包含以下权限。

```
{
    "Sid": "ListBucket",
    "Effect": "Allow",
    "Action": "s3:ListBucket",
    "Resource": [
        "arn:aws:s3:::amzn-s3-demo-destination-bucket"
    ]
}, {
    "Sid": "HomeDirObjectAccess",
    "Effect": "Allow",
    "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObjectVersion",
        "s3:DeleteObject",
        "s3:GetObjectVersion"
    ],
    "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
}, {
    "Sid": "Decrypt",
    "Effect": "Allow",
    "Action": [
        "secretsmanager:GetSecretValue",
    ],
    "Resource": "arn:aws:secretsmanager:region:account-id:secret:aws/transfer/*"
}
```

**注意**  
仅当您未选择“**覆盖现有文件**”时，才需要 `s3:ListBucket` 权限。此权限会检查您的存储桶，以查看是否已存在同名文件。如果您选择了“**覆盖现有文件**”，则工作流程无需检查文件，只需将其写入即可。  
如果您的 Amazon S3 文件有标签，则需要在 IAM 策略中添加一两个权限。  
为未进行版本控制的 Amazon S3 文件添加 `s3:GetObjectTagging`。
为进行版本控制的 Amazon S3 文件添加 `s3:GetObjectVersionTagging`。

## 标记文件
<a name="tag-step-details"></a>

要标记传入文件以进行进一步的下游处理，请使用标记步骤。输入要分配给传入文件的标签值。当前，只有当您使用 Amazon S3 作为 Transfer Family 服务器存储时，才支持标签操作。

以下示例标签步骤将 `scan_outcome` 和 `clean` 分别指定为标签键和值。

![\[显示标记步骤详细信息的工作流屏幕。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/workflows-step-tag.png)


若要使标记步骤成功，请确保您的工作流程的执行角色包含以下权限。

```
{
            "Sid": "Tag",
            "Effect": "Allow",
            "Action": [
                "s3:PutObjectTagging",
                "s3:PutObjectVersionTagging"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket/*"
            ]
}
```

**注意**  
如果您的工作流程包含在复制或解密步骤之前运行的标签步骤，则需要向 IAM 策略添加一两个权限。  
为未进行版本控制的 Amazon S3 文件添加 `s3:GetObjectTagging`。
为进行版本控制的 Amazon S3 文件添加 `s3:GetObjectVersionTagging`。

## delete-file
<a name="delete-step-details"></a>

要从上一个工作流程步骤中删除已处理的文件或删除最初上传的文件，请使用删除文件步骤。

![\[显示删除步骤详细信息的工作流屏幕。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/workflows-step-delete.png)


若要使删除步骤成功，请确保您的工作流程的执行角色包含以下权限。

```
{
            "Sid": "Delete",
            "Effect": "Allow",
            "Action": [
                "s3:DeleteObjectVersion",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:secretsmanager:region:account-ID:secret:aws/transfer/*"
        }
```

## 工作流程的命名变量
<a name="workflow-named-variables"></a>

对于复制和解密步骤，您可以使用变量来动态执行操作。目前， AWS Transfer Family 支持以下命名变量。
+ 使用 `${transfer:UserName}` 根据上传文件的用户将文件复制或解密到目标位置。
+ 使用 `${transfer:UploadDate}` 根据当前日期将文件复制或解密到目标位置。

## 标记和删除工作流程示例
<a name="sourcefile-workflow"></a>

以下示例说明了一个工作流程，该工作流程用于标记需要由下游应用程序（例如数据分析平台）处理的传入文件。标记传入文件后，工作流程会删除最初上传的文件以节省存储成本。

------
#### [ Console ]

**标记和移动工作流程示例**

1. 打开 AWS Transfer Family 控制台，网址为[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/)。

1. 在左侧导航窗格中，选择**工作流**。

1. 在 **工作流**页面，选择 **创建工作流**。

1. 在**创建工作流**页面，输入描述。此描述显示在“**工作流程**”页面上。

1. 添加第一步（复制）。

   1. 在**标称步骤**部分中，选择**添加步骤**。

   1. 选择**复制文件**，然后选择 **下一步**。

   1. 输入步骤名称，然后选择目标存储桶和密钥前缀。  
![\[工作流屏幕显示了复制步骤的详细信息，显示了目标存储桶和 key prefix。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/workflows-step-copy-first-step.png)

   1. 选择“**下一步**”，然后查看该步骤的详细信息。

   1. 选择“**创建步骤**”以添加该步骤并继续。

1. 添加第二步（标记）。

   1. 在**标称步骤**部分中，选择**添加步骤**。

   1. 选择您的**标签文件**，然后选择 **下一步**。

   1. 输入步骤名称。

   1. 在“**文件位置**”中，选择“**标记上一步创建的文件**”。

   1. 输入**键**和**值**。  
![\[标记工作流程步骤的 “配置” 屏幕，选中 “标记上一步创建的文件” 单选按钮。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/workflows-step-tag.png)

   1. 选择“**下一步**”，然后查看该步骤的详细信息。

   1. 选择“**创建步骤**”以添加该步骤并继续。

1. 添加第三步（删除）。

   1. 在**标称步骤**部分中，选择**添加步骤**。

   1. 选择 **删除文件**，然后选择 **下一步**。  
![\[删除工作流程步骤的 “配置” 屏幕，选中 “删除原始源文件” 单选按钮。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/workflows-step-delete.png)

   1. 输入步骤名称。

   1. 在“**文件位置**”中，选择“**删除原始源文件**”。

   1. 选择“**下一步**”，然后查看该步骤的详细信息。

   1. 选择“**创建步骤**”以添加该步骤并继续。

1. 查看工作流程配置，然后选择**创建工作流程**。

------
#### [ CLI ]

**标记和移动工作流程示例**

1. 将以下代码保存到文件中；例如，`tagAndMoveWorkflow.json`。将每个 `user input placeholder` 替换为您自己的信息。

   ```
   [
      {
          "Type": "COPY",
          "CopyStepDetails": {
             "Name": "CopyStep",
             "DestinationFileLocation": {
                "S3FileLocation": {
                   "Bucket": "amzn-s3-demo-bucket",
                   "Key": "test/"
                }
             }
          }
      },
      {
          "Type": "TAG",
          "TagStepDetails": {
             "Name": "TagStep",
             "Tags": [
                {
                   "Key": "name",
                   "Value": "demo"
                }
             ],
             "SourceFileLocation": "${previous.file}"
          }
      },
      {
         "Type": "DELETE",
         "DeleteStepDetails":{
            "Name":"DeleteStep",
            "SourceFileLocation": "${original.file}"
         }
     }
   ]
   ```

   第一步是将上传的文件复制到新的 Amazon S3 位置。第二步将标签（键值对）添加到复制到新位置的文件 (`previous.file`)。最后，第三步删除原始文件 (`original.file`)。

1. 使用保存的文件创建工作流程。将每个 `user input placeholder` 替换为您自己的信息。

   ```
   aws transfer create-workflow --description "short-description" --steps file://path-to-file --region region-ID
   ```

   例如：

   ```
   aws transfer create-workflow --description "copy-tag-delete workflow" --steps file://tagAndMoveWorkflow.json --region us-east-1
   ```
**注意**  
有关使用文件加载参数的更多详细信息，请参阅[如何从文件加载参数](https://docs.aws.amazon.com//cli/latest/userguide/cli-usage-parameters-file.html)。

1. 更新现有服务器。
**注意**  
此步骤假设您已经有一台 Transfer Family 服务器，并且想要将工作流程与之关联。如果不是，请参阅 [配置 SFTP、FTPS 或 FTP 服务器端点](tf-server-endpoint.md)。将每个 `user input placeholder` 替换为您自己的信息。

   ```
   aws transfer update-server --server-id server-ID --region region-ID 
     --workflow-details '{"OnUpload":[{ "WorkflowId": "workflow-ID","ExecutionRole": "execution-role-ARN"}]}'
   ```

   例如：

   ```
   aws transfer update-server --server-id s-1234567890abcdef0 --region us-east-2 
     --workflow-details '{"OnUpload":[{ "WorkflowId": "w-abcdef01234567890","ExecutionRole": "arn:aws:iam::111111111111:role/nikki-wolf-execution-role"}]}'
   ```

------

# 使用自定义文件处理步骤
<a name="custom-step-details"></a>

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

![\[自定义步骤屏幕，选中 “对根据上一步创建的文件应用自定义处理” 单选按钮，“目标” 字段中显示一个 Lambda 函数。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/workflows-step-custom.png)


**注意**  
有关示例 Lambda 函数，请参阅 [自定义工作流程步骤的 Lambda 函数示例](#example-workflow-lambda)。有关事件示例（包括传递到 Lambda 的文件的位置），请参阅 [文件上传 AWS Lambda 时发送到的事件示例](#example-workflow-lambdas)。

使用自定义工作流程步骤，您必须配置 Lambda 函数以调用 [SendWorkflowStepState](https://docs.aws.amazon.com/transfer/latest/APIReference/API_SendWorkflowStepState.html)API 操作。 `SendWorkflowStepState`通知工作流程执行该步骤已完成，状态为成功或失败。`SendWorkflowStepState` API 操作的状态根据 Lambda 函数的结果调用异常处理程序步骤或线性序列中的标称步骤。

如果 Lambda 函数失败或超时，则该步骤将失败，您将在日志`StepErrored`中看到。 CloudWatch 如果 Lambda 函数是标称步骤的一部分，并且函数响应 `SendWorkflowStepState` 为 `Status="FAILURE"` 或超时，则流程会继续执行异常处理程序步骤。在这种情况下，工作流不会继续执行剩余的（如果有）标称步骤。有关更多详细信息，请参阅[工作流程的异常处理](transfer-workflows.md#exception-workflow)。

在调用 `SendWorkflowStepState` API 操作时，必须发送以下参数：

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

您可以从 Lambda 函数执行时传递的输入事件中提取 `ExecutionId`、`Token` 和 `WorkflowId`（以下各节显示了示例）。该`Status`值可以是 `SUCCESS` 或`FAILURE`。

为了能够从 Lambda 函数调用 `SendWorkflowStepState` API 操作，您必须使用在引入[托管工作流程](doc-history.md#workflows-introduced)之后发布的 AWS SDK 版本。

## 连续使用多个 Lambda 函数
<a name="multiple-lambdas"></a>

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

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

## 在自定义处理后访问文件
<a name="process-uploaded-file"></a>

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

例如，假设您的工作流程中有以下三个步骤。
+ **步骤 1** - 上传名为 `example-file.txt` 的文件。
+ **步骤 2** - 调用以某种方式更改`example-file.txt`的 Lambda 函数。
+ **步骤 3** - 尝试对 `example-file.txt` 的更新版本执行进一步处理。

如果将步骤 3 的 `sourceFileLocation` 配置为 `${original.file}`，则步骤 3 将使用步骤 1 中服务器将文件上传到存储器时的原始文件位置。如果您在步骤 3 使用 `${previous.file}`，则步骤 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 不使用实体标签来识别文件。

## 文件上传 AWS Lambda 时发送到的事件示例
<a name="example-workflow-lambdas"></a>

以下示例显示了文件上传完成 AWS 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": "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"
    }
}
```

------

## 自定义工作流程步骤的 Lambda 函数示例
<a name="example-workflow-lambda"></a>

以下 Lambda 函数提取有关执行状态的信息，然后调用 [SendWorkflowStepState](https://docs.aws.amazon.com/transfer/latest/APIReference/API_SendWorkflowStepState.html)API 操作将该步骤`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)
    }
```

## 自定义步骤的 IAM 权限
<a name="custom-step-iam"></a>

若要使调用 Lambda 的步骤成功，请确保您的工作流程的执行角色包含以下权限。

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

# 适用于工作流程的 IAM 策略
<a name="workflow-execution-role"></a>

向服务器添加工作流程时，必须选择执行角色。服务器在执行工作流程时使用此角色。如果该角色没有适当的权限，则 AWS Transfer Family 无法运行工作流程。

本节介绍一组可能的 AWS Identity and Access Management (IAM) 权限，您可以使用这些权限来执行工作流程。本主题的后续部分中描述了其他示例。

**注意**  
如果您的 Amazon S3 文件有标签，则需要在 IAM 策略中添加一两个权限。  
为未进行版本控制的 Amazon S3 文件添加 `s3:GetObjectTagging`。
为进行版本控制的 Amazon S3 文件添加 `s3:GetObjectVersionTagging`。

**为您的工作流程创建执行角色**

1. 创建新的 IAM 角色，并将 AWS 托管策略`AWSTransferFullAccess`添加到该角色中。有关创建 IAM 角色的更多信息，请参见 [创建 IAM 角色和策略](requirements-roles.md)。

1. 按以下策略创建其他策略，然后将其内联至您的角色。将每个 `user input placeholder` 替换为您自己的信息。  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ConsoleAccess",
               "Effect": "Allow",
               "Action": "s3:GetBucketLocation",
               "Resource": "*"
           },
           {
               "Sid": "ListObjectsInBucket",
               "Effect": "Allow",
               "Action": "s3:ListBucket",
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket"
               ]
           },
           {
               "Sid": "AllObjectActions",
               "Effect": "Allow",
               "Action": "s3:*Object",
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket/*"
               ]
           },
           {
               "Sid": "GetObjectVersion",
               "Effect": "Allow",
               "Action": "s3:GetObjectVersion",
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket/*"
               ]
           },
           {
               "Sid": "Custom",
               "Effect": "Allow",
               "Action": [
                   "lambda:InvokeFunction"
               ],
               "Resource": [
                   "arn:aws:lambda:us-east-1:123456789012:function:function-name"
               ]
           },
           {
               "Sid": "Tag",
               "Effect": "Allow",
               "Action": [
                   "s3:PutObjectTagging",
                   "s3:PutObjectVersionTagging"
               ],
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket/*"
               ]
           }
       ]
   }
   ```

1. 保存此角色并在向服务器添加工作流程时将其指定为执行角色。
**注意**  
在构建 IAM 角色时， AWS 建议您尽可能限制工作流程对资源的访问权限。

## 工作流程信任关系
<a name="workflows-trust"></a>

工作流程执行角色还需要与 `transfer.amazonaws.com` 建立信任关系。若要为 AWS Transfer Family建立信任关系，请参见 [建立信任关系](requirements-roles.md#establish-trust-transfer)。

在建立信任关系的同时，您也可以采取措施避免*混淆代理*问题。有关此问题的描述以及如何避免该问题的示例，请参见 [防止跨服务混淆代理](confused-deputy.md)。

## 执行角色示例：解密、复制和标记
<a name="example-workflow-role-copy-tag"></a>

如果您的工作流程包括标记、复制和解密步骤，则可以使用以下 IAM 策略。将每个 `user input placeholder` 替换为您自己的信息。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "CopyRead",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectTagging",
                "s3:GetObjectVersionTagging"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-source-bucket/*"
        },
        {
            "Sid": "CopyWrite",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectTagging"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
        },
        {
            "Sid": "CopyList",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-source-bucket",
                "arn:aws:s3:::amzn-s3-demo-destination-bucket"
            ]
        },
        {
            "Sid": "Tag",
            "Effect": "Allow",
            "Action": [
                "s3:PutObjectTagging",
                "s3:PutObjectVersionTagging"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/*",
            "Condition": {
                "StringEquals": {
                    "s3:RequestObjectTag/Archive": "yes"
                }
            }
        },
        {
            "Sid": "ListBucket",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-destination-bucket"
            ]
        },
        {
            "Sid": "HomeDirObjectAccess",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObjectVersion",
                "s3:DeleteObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
        },
        {
            "Sid": "Decrypt",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:aws/transfer/*"
        }
    ]
}
```

## 执行角色示例：运行函数并删除
<a name="example-workflow-role-custom-delete"></a>

在此示例中，您有一个 AWS Lambda 调用函数的工作流程。如果工作流程删除了上传的文件，并且有异常处理程序步骤可以对上一步中失败的工作流程执行采取行动，请使用以下 IAM 策略。将每个 `user input placeholder` 替换为您自己的信息。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Delete",
            "Effect": "Allow",
            "Action": [
                "s3:DeleteObject",
                "s3:DeleteObjectVersion"
            ],
            "Resource": "arn:aws:s3:::bucket-name"
        },
        {
            "Sid": "Custom",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "arn:aws:lambda:us-east-1:123456789012:function:function-name"
            ]
        }
    ]
}
```

## 工作流程的异常处理
<a name="exception-workflow"></a>

如果在工作流程执行过程中出现任何错误，则会执行您指定的异常处理步骤。为工作流指定错误处理步骤的方式与为工作流指定标称步骤的方式相同。例如，假设您已按名义步骤配置了自定义处理来验证传入的文件。如果文件验证失败，则异常处理步骤可以向管理员发送电子邮件。

以下示例工作流程包含两个步骤：
+ 检查上传文件是否为 CSV 格式的标称步骤
+ 一个异常处理步骤，用于在上传的文件不是 CSV 格式且标称步骤失败时发送电子邮件

要启动异常处理步骤，名义步骤中的 AWS Lambda 函数必须使用响应。`Status="FAILURE"`有关工作流错误处理的更多信息，请参阅 [使用自定义文件处理步骤](custom-step-details.md)。

![\[\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/workflow-exception-sample.png)


# 监控工作流程执行情况
<a name="cloudwatch-workflow"></a>

Amazon 会实时 CloudWatch 监控您的 AWS 资源和您运行 AWS 云 的应用程序。您可以使用 Amazon CloudWatch 收集和跟踪指标，这些指标是您可以衡量工作流程的变量。您可以使用 Amazon 查看工作流程指标和整合日志 CloudWatch。

## CloudWatch 记录工作流程
<a name="cloudwatch-workflow-logs"></a>

CloudWatch 为工作流程进度和结果提供统一的审计和日志记录。

**查看 Amazon 工作流程 CloudWatch 日志**

1. 打开 Amazon CloudWatch 控制台，网址为[https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)。

1. 在左侧导航窗格中选择**日志**，然后选择**日志组**。

1. 在**日志组**页面的导航栏上，为您的 AWS Transfer Family 服务器选择正确的区域。

1. 选择与您的服务器相对应的日志组。

   例如，如果您的服务器 ID 是 `s-1234567890abcdef0`，则您的日志组是 `/aws/transfer/s-1234567890abcdef0`。

1. 在服务器的日志组详细信息页面上，将显示最新的日志流。您正在探索的用户有两个日志流：
   + 每个 Secure Shell (SSH) 文件传输协议 (SFTP) 会话一个。
   + 一个用于正在为您的服务器执行的工作流程。工作流程的日志流格式为 `username.workflowID.uniqueStreamSuffix`。

   例如，如果您的用户是 `mary-major`，您具有以下日志流：

   ```
   mary-major-east.1234567890abcdef0
   mary.w-abcdef01234567890.021345abcdef6789
   ```
**注意**  
 此示例中列出的 16 位字母数字标识符是虚构的。您在 Amazon 上看到的值 CloudWatch 是不同的。

`mary-major-usa-east.1234567890abcdef0` 的“**日志事件**”页面显示每个用户会话的详细信息，`mary.w-abcdef01234567890.021345abcdef6789` 日志流包含工作流程的详细信息。

 以下是基于包含复制步骤的工作流程 (`w-abcdef01234567890`) 的 `mary.w-abcdef01234567890.021345abcdef6789` 日志流示例。

```
{
    "type": "ExecutionStarted",
    "details": {
        "input": {
            "initialFileLocation": {
                "bucket": "amzn-s3-demo-bucket",
                "key": "mary/workflowSteps2.json",
                "versionId": "version-id",
                "etag": "etag-id"
            }
        }
    },
    "workflowId":"w-abcdef01234567890",
    "executionId":"execution-id",
    "transferDetails": {
        "serverId":"s-server-id",
        "username":"mary",
        "sessionId":"session-id"
    }
},
{
    "type":"StepStarted",
    "details": {
        "input": {
            "fileLocation": {
                "backingStore":"S3",
                "bucket":"amzn-s3-demo-bucket",
                "key":"mary/workflowSteps2.json",
                "versionId":"version-id",
                "etag":"etag-id"
            }
        },
        "stepType":"COPY",
        "stepName":"copyToShared"
    },
    "workflowId":"w-abcdef01234567890",
    "executionId":"execution-id",
    "transferDetails": {
        "serverId":"s-server-id",
        "username":"mary",
        "sessionId":"session-id"
    }
},
{
    "type":"StepCompleted",
    "details":{
        "output":{},
        "stepType":"COPY",
        "stepName":"copyToShared"
    },
    "workflowId":"w-abcdef01234567890",
    "executionId":"execution-id",
    "transferDetails":{
        "serverId":"server-id",
        "username":"mary",
        "sessionId":"session-id"
    }
},
{
    "type":"ExecutionCompleted",
    "details": {},
    "workflowId":"w-abcdef01234567890",
    "executionId":"execution-id",
    "transferDetails":{
        "serverId":"s-server-id",
        "username":"mary",
        "sessionId":"session-id"
    }
}
```

## CloudWatch 工作流程指标
<a name="cloudwatch-workflows-metrics"></a>

AWS Transfer Family 为工作流程提供了多个指标。您可以查看前一分钟有多少工作流程执行启动、成功完成和失败的指标。中描述了 Transfer Family 的所有 CloudWatch 指标[使用 T CloudWatch ransfer Family 服务器的指标](metrics.md)。

# 通过模板创建工作流
<a name="workflow-template"></a>

您可以部署用于创建工作流的 CloudFormation 堆栈和基于模板的服务器。此过程包含一个示例，您可以使用该示例来快速部署工作流程。

**创建用于创建 AWS Transfer Family 工作流程和服务器的 CloudFormation 堆栈**

1. 在 [https://console.aws.amazon.com/cloudformat](https://console.aws.amazon.com/cloudformation/) ion 上打开 CloudFormation 控制台。

1. 将以下代码保存到文件中。

------
#### [ YAML ]

   ```
   AWSTemplateFormatVersion: 2010-09-09
   Resources:
     SFTPServer:
       Type: 'AWS::Transfer::Server'
       Properties:
         WorkflowDetails:
           OnUpload:
             - ExecutionRole: workflow-execution-role-arn
               WorkflowId: !GetAtt
                 - TransferWorkflow
                 - WorkflowId
     TransferWorkflow:
       Type: AWS::Transfer::Workflow
       Properties:
         Description: Transfer Family Workflows Blog
         Steps:
           - Type: COPY
             CopyStepDetails:
               Name: copyToUserKey
               DestinationFileLocation:
                 S3FileLocation:
                   Bucket: archived-records
                   Key: ${transfer:UserName}/
               OverwriteExisting: 'TRUE'
           - Type: TAG
             TagStepDetails:
               Name: tagFileForArchive
               Tags:
                 - Key: Archive
                   Value: yes
           - Type: CUSTOM
             CustomStepDetails:
               Name: transferExtract
               Target: arn:aws:lambda:region:account-id:function:function-name
               TimeoutSeconds: 60
           - Type: DELETE
             DeleteStepDetails:
               Name: DeleteInputFile
               SourceFileLocation: '${original.file}'
         Tags:
           - Key: Name
             Value: TransferFamilyWorkflows
   ```

------
#### [ JSON ]

   ```
   {
       "AWSTemplateFormatVersion": "2010-09-09",
       "Resources": {
           "SFTPServer": {
               "Type": "AWS::Transfer::Server",
               "Properties": {
                   "WorkflowDetails": {
                       "OnUpload": [
                           {
                               "ExecutionRole": "workflow-execution-role-arn",
                               "WorkflowId": {
                                   "Fn::GetAtt": [
                                       "TransferWorkflow",
                                       "WorkflowId"
                                   ]
                               }
                           }
                       ]
                   }
               }
           },
           "TransferWorkflow": {
               "Type": "AWS::Transfer::Workflow",
               "Properties": {
                   "Description": "Transfer Family Workflows Blog",
                   "Steps": [
                       {
                           "Type": "COPY",
                           "CopyStepDetails": {
                               "Name": "copyToUserKey",
                               "DestinationFileLocation": {
                                   "S3FileLocation": {
                                       "Bucket": "archived-records",
                                       "Key": "${transfer:UserName}/"
                                   }
                               },
                               "OverwriteExisting": "TRUE"
                           }
                       },
                       {
                           "Type": "TAG",
                           "TagStepDetails": {
                               "Name": "tagFileForArchive",
                               "Tags": [
                                   {
                                       "Key": "Archive",
                                       "Value": "yes"
                                   }
                               ]
                           }
                       },
                       {
                           "Type": "CUSTOM",
                           "CustomStepDetails": {
                               "Name": "transferExtract",
                               "Target": "arn:aws:lambda:region:account-id:function:function-name",
                               "TimeoutSeconds": 60
                           }
                       },
                       {
                           "Type": "DELETE",
                           "DeleteStepDetails": {
                               "Name": "DeleteInputFile",
                               "SourceFileLocation": "${original.file}"
                           }
                       }
                   ],
                   "Tags": [
                       {
                           "Key": "Name",
                           "Value": "TransferFamilyWorkflows"
                       }
                   ]
               }
           }
       }
   }
   ```

------

1. 将以下值替换为您的实际值。
   + 将 *`workflow-execution-role-arn`* 替换为实际工作流执行角色的 ARN。例如，`arn:aws:transfer:us-east-2:111122223333:workflow/w-1234567890abcdef0`
   + 将 `arn:aws:lambda:region:account-id:function:function-name` 替换为 Lambda 函数的 ARN。例如 `arn:aws:lambda:us-east-2:123456789012:function:example-lambda-idp`。

1. 按照*AWS CloudFormation 用户指南*中的[选择 CloudFormation 堆栈模板中的使用现有模板部署堆栈](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-using-console-create-stack-template.html)的说明进行操作。

部署堆栈后，您可以在 CloudFormation 控制台的 Outputs 选项卡中**查看**有关堆栈的详细信息。该模板创建了一个使用服务管理用户的新 AWS Transfer Family SFTP 服务器和一个新的工作流程，并将该工作流与新服务器关联起来。

## 从 Transfer Family 服务器中移除工作流
<a name="remove-workflow-association"></a>

如果您已将工作流程与 Transfer Family 服务器关联，而现在想要移除该关联，则可以使用控制台或以编程方式执行此操作。

------
#### [ Console ]

**若要从 Transfer Family 服务器中移除工作流**

1. 打开 AWS Transfer Family 控制台，网址为[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/)。

1. 在左侧导航窗格中选择**服务器**。

1. 在“**服务器 ID**”列中选择服务器的标识符。

1. 在服务器的详细信息页面上，向下滚动到**其他详细信息**部分，然后选择**编辑**。

1. 在**编辑其他详细信息**页面中的**托管工作流程**部分，清除所有设置的信息：
   + 从**用于完整文件上载的工作流**的工作流列表中选择短划线 (-)。
   + 如果尚未清除，从**用于部分文件上载的工作流**的工作流列表中选择短划线 (-)。
   +  从**托管工作流程执行角色**的角色列表中选择短划线 (-)。

   如果看不到破折号，请向上滚动直到看到它，因为它是每个菜单中的第一个值。

   该部分应该类似以下内容。  
![\[托管工作流程窗格，显示所有已清除的参数。\]](http://docs.aws.amazon.com/zh_cn/transfer/latest/userguide/images/workflows-remove-from-server.png)

1. 要保存更改，请向下滚动并选择**保存**。

------
#### [ CLI ]

您可以使用 `update-server`（或 `UpdateServer` for API）调用，并为 `OnUpload` 和 `OnPartialUpload` 参数提供空参数。

从中 AWS CLI，运行以下命令：

```
aws transfer update-server --server-id your-server-id --workflow-details '{"OnPartialUpload":[],"OnUpload":[]}'
```

将 `your-server-id` 替换为服务器的 ID。例如，如果您的服务器 ID 是 `s-01234567890abcdef`，则命令如下所示：

```
aws transfer update-server --server-id s-01234567890abcdef --workflow-details '{"OnPartialUpload":[],"OnUpload":[]}'
```

------

## 托管工作流限制和局限性
<a name="limitations-workflow"></a>

**限制**

以下限制目前适用于 AWS Transfer Family的上传后处理工作流程。
+ 不支持跨账户和跨区域 AWS Lambda 功能。但是，您可以跨账户复制，前提是您的 AWS Identity and Access Management (IAM) 策略配置正确。
+ 对于所有工作流程步骤，工作流程访问的任何 Amazon S3 存储桶都必须与工作流程本身位于同一区域。
+ 对于解密步骤，解密目标必须与区域和后备存储的来源相匹配（例如，如果要解密的文件存储在 Amazon S3 中，则指定的目标也必须在 Amazon S3 中）。
+ 仅支持异步自定义步骤。
+ 自定义步骤超时值是近似值。也就是说，超时所需的时间可能比指定时间稍长。此外，工作流程依赖于 Lambda 函数。因此，如果函数在执行过程中出现延迟，则工作流程不会意识到延迟。
+ 如果您超过了限制限制，Transfer Family 不会将工作流程操作添加到队列中。
+ 不会为大小为 0 的文件启动工作流程。大小大于 0 的文件会启动关联的工作流程。
+ 您可以将文件处理工作流程附加到使用该 AS2 协议的 Transfer Family 服务器：但是， AS2 消息不会执行附加到服务器的工作流程。

**限制**

 此外，以下功能限制适用于 Transfer Family 的工作流程：
+ 每个区域、每个账户的工作流程数量限制为 10。
+ 自定义步骤的最大超时时间为 30 分钟。
+ 工作流中的最大步骤数为 8。
+ 每个工作组的最大标签数是 50。
+ 每个工作流程中包含解密步骤的最大并发执行数为 250 个。
+ 在每台 Transfer Family 服务器上，每位用户最多可存储 3 个 PGP 私钥。
+ 数据文件的最大大小为 10 GB。
+ 我们使用容量暴增为 100、再填充率为 1 的[令牌桶](https://en.wikipedia.org/wiki/Token_bucket)系统来限制新的执行率。
+ 无论何时从服务器上移除工作流程并用新的工作流程替换它，或者更新服务器配置（这会影响工作流程的执行角色），都必须等待大约 10 分钟才能执行新的工作流程。Transfer Family 服务器会缓存工作流程细节，服务器需要 10 分钟才能刷新其缓存。

  此外，您必须注销所有活动的 SFTP 会话，然后等待 10 分钟重新登录才能看到更改。