使用预定义的步骤 - AWS Transfer Family

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

使用预定义的步骤

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

复制文件

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

以下复制文件步骤将文件复制到 file-test 目标存储桶中的 test 文件夹。

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

提供存储桶和密钥的详细信息

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

如果最后一个字符是 /,则您的文件将被复制到此文件夹,并且其名称不会更改。如果最后一个字符是字母数字,则您上传的文件将被重命名为键值。在这种情况下,如果已存在具有该名称的文件,则相关行为将取决于“覆盖现有文件”字段的设置。

  • 如果选择“覆盖现有文件”,则现有文件会被正在处理的文件替换。

  • 如果未选择“覆盖现有文件”,则不会发生任何事情,并且工作流将会停止处理。

    提示

    如果在同一文件路径上执行并发写入,则在覆盖文件时可能会导致意外行为。

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

注意

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

在复制文件步骤中使用命名变量

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

在以下示例中,如果用户 richard-roe 上传文件,则该文件将被复制到 file-test2/richard-roe/processed/ 文件夹。如果用户 mary-major 上传文件,则该文件将被复制到 file-test2/mary-major/processed/ 文件夹。

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

您也可以同时使用这两个变量,将它们的功能结合起来。例如:

  • 例如,您可以将目标键前缀设置为 folder/${transfer:UserName}/${transfer:UploadDate}/,这样可以创建嵌套文件夹,例如 folder/marymajor/2023-01-05/

  • 例如,您可以将目标键前缀设置为 folder/${transfer:UserName}-${transfer:UploadDate}/,以连接两个变量,例如 folder/marymajor-2023-01-05/

IAM复制步骤的权限

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

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

仅当您未选择“覆盖现有文件”时,才需要 s3:ListBucket 权限。此权限会检查您的存储桶,以查看是否已存在同名文件。如果您选择了“覆盖现有文件”,则工作流程无需检查文件,只需将其写入即可。

如果您的 Amazon S3 文件有标签,则需要在IAM策略中添加一两个权限。

  • 为未进行版本控制的 Amazon S3 文件添加 s3:GetObjectTagging

  • 为进行版本控制的 Amazon S3 文件添加 s3:GetObjectVersionTagging

解密文件

AWS 存储博客上有一篇文章描述了如何加密和解密文件,使用和加密和解密文件。PGP AWS Transfer Family

在工作流程中使用PGP解密

Transfer Family 内置支持 Pretty Good Privacy (PGP) 解密。您可以对通过SFTP、FTPS或上传到亚马逊简单存储服务 (Amazon S3) 或FTP亚马逊弹性文件系统 (亚马逊) 的文件使用PGP解密。EFS

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

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

  2. 将您的PGP密钥存储在所需的密钥名称 AWS Secrets Manager 下。有关详细信息,请参阅管理PGP密钥。工作流程可以根据 Secrets Manager 中的密PGP钥名称自动找到用于解密的正确密钥。

    注意

    当你在 Secret AWS 账户 s Manager 中存储密钥时,会产生费用。有关定价的信息,请参阅 AWS Secrets Manager 定价

  3. 使用密PGP钥 pair 加密文件。(有关受支持的事件的列表,请参阅 支持的PGP客户端。) 如果您使用命令行,请使用以下命令。要使用此命令,请username@example.com替换为用于创建 PGP key pair 的电子邮件地址。将 testfile.txt 替换为您要加密的文件名称。

    gpg -e -r username@example.com testfile.txt
  4. 将加密文件上传至您的 Transfer Family 服务器。

  5. 在工作流程中配置解密步骤。有关更多信息,请参阅 添加解密步骤

添加解密步骤

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

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

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

可用选项如下:

  • 步骤名称 - 输入步骤的描述性名称。

  • 文件位置 - 通过指定文件位置,您可以解密上一步中使用的文件或上传的原始文件。

    注意

    如果此步骤是工作流的第一步,则此参数不可用。

  • 解密文件的目标-选择 Amazon S3 存储桶或亚马逊EFS文件系统作为解密文件的目的地。

    • 如果您选择 Amazon S3,则必须提供目标存储桶名称和目标密钥前缀。要按用户名参数化目标密钥前缀,请为“${transfer:UserName}目标密钥前缀”输入 。同样,要按上传日期参数化目标密钥前缀,请为“目标密钥前缀”输入 ${Transfer:UploadDate}

    • 如果您选择 AmazonEFS,则必须提供目标文件系统和路径。

    注意

    您在此处选择的存储选项必须与与此工作流程关联的 Transfer Family 服务器使用的存储系统相匹配。否则,当您尝试运行此工作流程时会收到错误。

  • 覆盖现有文件 - 如果您上传了一个文件,并且目标位置上已经存在具有相同文件名的文件,则相关行为取决于此参数的设置:

    • 如果选择“覆盖现有文件”,则现有文件会被正在处理的文件替换。

    • 如果未选择“覆盖现有文件”,则不会发生任何事情,并且工作流将会停止处理。

      提示

      如果在同一文件路径上执行并发写入,则在覆盖文件时可能会导致意外行为。

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

AWS Transfer Family 控制台,显示配置PGP解密参数部分以及示例值。

IAM解密步骤的权限

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

{ "Sid": "ListBucket", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": [ "arn:aws:s3:::destination-bucket-name" ] }, { "Sid": "HomeDirObjectAccess", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObjectVersion", "s3:DeleteObject", "s3:GetObjectVersion" ], "Resource": "arn:aws:s3:::destination-bucket-name/*" }, { "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

标记文件

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

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

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

{ "Sid": "Tag", "Effect": "Allow", "Action": [ "s3:PutObjectTagging", "s3:PutObjectVersionTagging" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ] }
注意

如果您的工作流程包含在复制或解密步骤之前运行的标记步骤,则需要向策略添加一两个权限。IAM

  • 为未进行版本控制的 Amazon S3 文件添加 s3:GetObjectTagging

  • 为进行版本控制的 Amazon S3 文件添加 s3:GetObjectVersionTagging

delete-file

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

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

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

工作流程的命名变量

对于复制和解密步骤,您可以使用变量来动态执行操作。目前, AWS Transfer Family 支持以下命名变量。

  • 使用 ${transfer:UserName} 根据上传文件的用户将文件复制或解密到目标位置。

  • 使用 ${transfer:UploadDate} 根据当前日期将文件复制或解密到目标位置。

标记和删除工作流程示例

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

Console
标记和移动工作流程示例
  1. 打开 AWS Transfer Family 控制台,网址为https://console.aws.amazon.com/transfer/

  2. 在左侧导航窗格中,选择工作流

  3. 工作流页面,选择 创建工作流

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

  5. 添加第一步(复制)。

    1. 标称步骤部分中,选择添加步骤

    2. 选择复制文件,然后选择 下一步

    3. 输入步骤名称,然后选择目标存储桶和密钥前缀。

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

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

  6. 添加第二步(标记)。

    1. 标称步骤部分中,选择添加步骤

    2. 选择您的标签文件,然后选择 下一步

    3. 输入步骤名称。

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

    5. 输入

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

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

  7. 添加第三步(删除)。

    1. 标称步骤部分中,选择添加步骤

    2. 选择 删除文件,然后选择 下一步

    3. 输入步骤名称。

    4. 在“文件位置”中,选择“删除原始源文件”。

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

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

  8. 查看工作流程配置,然后选择创建工作流程

CLI
标记和移动工作流程示例
  1. 将以下代码保存到文件中;例如,tagAndMoveWorkflow.json。将每个 user input placeholder 替换为您自己的信息。

    [ { "Type": "COPY", "CopyStepDetails": { "Name": "CopyStep", "DestinationFileLocation": { "S3FileLocation": { "Bucket": "DOC-EXAMPLE-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)。

  2. 使用保存的文件创建工作流程。将每个 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
    注意

    有关使用文件加载参数的更多详细信息,请参阅如何从文件加载参数

  3. 更新现有服务器。

    注意

    此步骤假设您已经有一台 Transfer Family 服务器,并且想要将工作流程与之关联。如果不是,请参阅 配置SFTPFTPS、或FTP服务器端点。将每个 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"}]}'