

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

# 使用预定义的步骤
<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"}]}'
   ```

------