设置和使用 SFTP 连接器 - Amazon Transfer Family
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

设置和使用 SFTP 连接器

连接器的目的是在您的 Amazon 存储设备和合作伙伴的 SFTP 服务器之间建立关系。您可以将文件从 Amazon S3 发送到合作伙伴拥有的外部目的地。您也可以使用 SFTP 连接器从合作伙伴的 SFTP 服务器检索文件。

本教程说明如何设置 SFTP 连接器,然后在 Amazon S3 存储设备和 SFTP 服务器之间传输文件。

SFTP 连接器从中检索 SFTP 凭据 Amazon Secrets Manager ,以便对远程 SFTP 服务器进行身份验证并建立连接。连接器向远程服务器发送文件或从远程服务器检索文件,并将文件存储在 Amazon S3 中。IAM 角色用于允许访问 Amazon S3 存储桶和存储在 Secrets Manager 中的证书。而且你可以登录到亚马逊 CloudWatch。

SFTP 连接器如何与 Secrets Manager、Amazon S3、 CloudWatch 日志、IAM 角色和远程 SFTP 服务器交互的架构图。

步骤 1:创建必要的支持资源

您可以使用 SFTP 连接器在 Amazon S3 和任何远程 SFTP 服务器之间复制文件。在本教程中,我们使用 Amazon Transfer Family 服务器作为远程 SFTP 服务器。我们需要创建和配置以下资源:

创建 Amazon S3 存储桶

创建 Amazon S3 存储桶
  1. 登录 Amazon Transfer Family 主机,网址为 https://console.aws.amazon.com/s3/

  2. 选择一个地区并输入名称。

    在本教程中,我们的存储桶位于中US East (N. Virginia) us-east-1,名称为sftp-server-storage-east

  3. 接受默认值并选择创建存储桶

有关创建 Amazon S3 存储桶的完整详细信息,请参阅如何创建 S3 存储桶? 在《Amazon 简单存储服务用户指南》中。

创建具有必要权限的 IAM 角色

对于访问角色,创建具有以下权限的策略。

以下示例授予访问亚马逊 S3 中的 DOC-EXAMPLE-BUCK ET 以及存储在 Secrets Manager 中的指定密钥所需的权限。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListingOfUserFolder", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET" ] }, { "Sid": "HomeDirObjectAccess", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject", "s3:DeleteObjectVersion", "s3:GetObjectVersion", "s3:GetObjectACL", "s3:PutObjectACL" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" }, { "Sid": "GetConnectorSecretValue", "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": "arn:aws:secretsmanager:region:account-id:secret:aws/transfer/SecretName-6RandomCharacters" } ] }

按如下方式替换项目:

  • 对于 DOC-EXAMPLE-BUCKET,教程使用。s3-storage-east

  • 对于区域,本教程使用us-east-1

  • 要获取账户 ID,请使用您的 Amazon Web Services 账户 ID。

  • 对于 SecretName-6 RandomCharacters,我们代表using sftp-connector1名字(你将有自己的六个随机字符作为你的秘密)。

您还必须确保此角色包含信任关系,允许连接器在处理用户的转移请求时访问您的资源。有关建立信任关系的详细信息,请参阅 建立信任关系

注意

要查看我们在本教程中使用的角色的详细信息,请参阅用户和访问角色的组合

创建密钥并将其存储在 Amazon Secrets Manager

我们需要在 Secrets Manager 中存储一个密钥来存储你的 SFTP 连接器的用户凭证。您可以使用密码、SSH 私钥或两者兼而有之。在本教程中,我们使用的是私钥。

注意

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

在开始存储密钥的过程之前,请检索并格式化您的私钥。私钥必须与在远程 SFTP 服务器上为用户配置的公钥相对应。在本教程中,私钥必须对应于我们用作远程服务器的 Transfer Family SFTP 服务器上为测试用户存储的公钥。

为此,请运行以下命令:

jq -sR . path-to-private-key-file

例如,如果您的私钥文件位于中~/.ssh/sftp-testuser-privatekey,则命令如下所示。

jq -sR . ~/.ssh/sftp-testuser-privatekey

这会将正确格式的密钥(带有嵌入的换行符)输出到标准输出。将此文本复制到某个地方,因为您需要将其粘贴到以下步骤中(在步骤 6 中)。

若要在 Secrets Manager 中存储 SFTP 连接器的用户凭证
  1. 登录 Amazon Web Services Management Console 并打开 Amazon Secrets Manager 控制台,网址为 https://console.aws.amazon.com/secretsmanager/

  2. 在左侧导航窗格中,选择密钥

  3. 密钥页面,选择存储新密钥

  4. 选择密钥类型页面上,对于密钥类型,选择其他类型密钥

  5. 键/值对部分,选择键/值选项卡。

    • — 输入Username

    • valu e — 输入我们的用户名sftp-testuser

  6. 要输入密钥,我们建议您使用纯文本选项卡

    1. 选择添加行,然后输入PrivateKey

    2. 选择纯文本选项卡。该字段现在包含以下文本:

      {"Username":"sftp-testuser","PrivateKey":""}
    3. 在空双引号 (“”) 之间粘贴私钥文本(之前保存)。

      屏幕应如下所示(关键数据显示为灰色)。

      以纯文本形式显示的密钥,显示用户名和私钥。
  7. 选择下一步

  8. 配置密钥页面上,输入您的密钥的名称。在本教程中,我们命名了秘密aws/transfer/sftp-connector1

  9. 选择下一步,接受配置轮换页面的默认设置。然后选择下一步

  10. 审核页面,选择存储以创建和存储密钥。

步骤 2:创建和测试 SFTP 连接器

在本节中,我们将创建一个使用我们之前创建的所有资源的 SFTP 连接器。有关更多详细信息,请参阅配置 SFTP 连接器

若要创建 SFTP 连接器
  1. 打开 Amazon Transfer Family 控制台,网址为 https://console.aws.amazon.com/transfer/

  2. 在导航窗格中,选择连接,然后选择创建连接器

  3. 选择 SFTP 作为连接器类型,以创建 SFTP 连接器,然后选择“下一步”

    Transfer Family 控制台显示“创建连接器”页面,您可以在其中选择连接器类型。已选择 SFTP。
  4. 连接器配置部分中,提供以下信息:

    • URL 中,输入远程 SFTP 服务器的 URL。在本教程中,我们输入用作远程 SFTP 服务器的 Transfer Family 服务器的 URL。

      sftp://s-1111aaaa2222bbbb3.server.transfer.us-east-1.amazonaws.com

      1111aaaa2222bbb3 替换成你的 Transfer Family 服务器 ID。

    • 对于访问角色,请输入我们之前创建的角色sftp-connector-role

    • 对于 “记录” 角色,选择AWSTransferLoggingAccessV3

      注意

      AWSTransferLoggingAccessV3 是 Amazon 托管策略。中详细介绍了该政策Amazon 托管策略: AWSTransferLoggingAccessV3

    Transfer Family SFTP 连接器控制台,显示连接器配置设置。
  5. SFTP Configuration 面板中提供以下信息:

    • 对于连接器凭据,请选择包含 SFTP 凭据的 Secrets Manager 资源的名称。在本教程中,选择aws/transfer/sftp-connector1

    • 对于受信任的主机密钥,请粘贴主机密钥的公共部分。您可以通过ssh-keyscan为 SFTP 服务器运行来检索此密钥。有关如何格式化和存储可信主机密钥的详细信息,请参阅SftpConnectorConfig数据类型文档。

    Transfer Family SFTP 连接器控制台,显示了 SFTP 配置设置。
  6. 确认所有设置后,选择创建连接器以创建 SFTP 连接器。

创建 SFTP 连接器后,我们建议您在尝试使用新连接器传输任何文件之前对其进行测试。

Test a connector using the console
若要测试 SFTP 连接器
  1. 打开 Amazon Transfer Family 控制台,网址为 https://console.aws.amazon.com/transfer/

  2. 在左侧导航窗格中,选择连接器,然后选择一个连接器。

  3. 操作菜单中选择 测试连接

    Transfer Family 控制台显示了选定的 SFTP 连接器,并突出显示了“测试连接”操作。

系统会返回一条消息,指示测试是通过还是失败。如果测试失败,系统会根据测试失败的原因提供错误消息。

SFTP 连接器测试连接面板,显示测试成功。
SFTP 连接器测试连接面板显示测试失败:错误消息表明连接器的访问角色不正确。
Test a connector using the CLI

要使用测试连接器 Amazon Command Line Interface,请在命令提示符下运行以下命令(将 c onnector-i d 替换为实际的连接器 ID):

aws transfer test-connection --connector-id c-connector-id

如果测试成功,则返回以下几行:

{ "Status": "OK", "StatusMessage": "Connection succeeded" }

如果测试失败,您会收到一条描述性错误消息,例如:

{ "Status": "ERROR", "StatusMessage": "Unable to assume the configured access role" }

步骤 3:使用 SFTP 连接器发送和检索文件

为简单起见,我们假设您的 Amazon S3 存储桶中已经有文件。

注意

本教程使用了 Amazon S3 存储桶作为源存储位置和目标存储位置。如果您的 SFTP 服务器不使用 Amazon S3 存储,那么无论您在以下命令sftp-server-storage-east中看到的任何地方,都可以将路径替换为可从 SFTP 服务器访问的文件位置的路径。

  • 我们将名为 Amazon S3 存储的文件发送SEND-to-SERVER.txt到 SFTP 服务器。

  • 我们将名为的文件RETRIEVE-to-S3.txt从 SFTP 服务器检索到 Amazon S3 存储空间。

注意

在以下命令中,将连接器 ID 替换为您的连接器 ID。

首先,我们将文件从 Amazon S3 存储桶发送到远程 SFTP 服务器。在命令提示符下,运行以下命令:

aws transfer start-file-transfer --connector-id c-connector-id --send-file-paths "/s3-storage-east/SEND-to-SERVER.txt" / --remote-directory-path "/sftp-server-storage-east/incoming"

你的sftp-server-storage-east存储桶现在应该是这样的。

包含新传输文件的 SFTP 服务器存储桶。

如果您没有按预期看到该文件,请检查您的 CloudWatch 日志。

查看您的 CloudWatch 日志
  1. 打开亚马逊 CloudWatch 控制台,网址为 https://console.aws.amazon.com/cloudwatch/

  2. 从左侧导航菜单中选择 “日志组”。

  3. 在搜索栏中输入您的连接器 ID 以查找您的日志。

  4. 选择从搜索中返回的日志流。

  5. 展开最新的日志条目。

如果成功,则日志条目如下所示:

{ "operation": "SEND", "timestamp": "2023-12-18T15:26:57.346283Z", "connector-id": "connector-id", "transfer-id": "transfer-id", "file-transfer-id": "transfer-id/file-transfer-id", "url": "sftp://server-id.server.transfer.us-east-1.amazonaws.com", "file-path": "/s3-storage-east/SEND-to-SERVER.txt", "status-code": "COMPLETED", "start-time": "2023-12-18T15:26:56.915864Z", "end-time": "2023-12-18T15:26:57.298122Z", "account-id": "500655546075", "connector-arn": "arn:aws:transfer:us-east-1:500655546075:connector/connector-id", "remote-directory-path": "/sftp-server-storage-east/incoming" }

如果文件传输失败,则日志条目将包含一条指明问题的错误消息。常见的错误原因是 IAM 权限问题和文件路径不正确。

接下来,我们将文件从 SFTP 服务器检索到 Amazon S3 存储桶中。在命令提示符下,运行以下命令:

aws transfer start-file-transfer --connector-id c-connector-id --retrieve-file-paths "/sftp-server-storage-east/RETRIEVE-to-S3.txt" --local-directory-path "/s3-storage-east/incoming"

如果传输成功,则您的 Amazon S3 存储桶将包含传输的文件,如下所示。

包含新传输文件的 Amazon S3 存储桶。

如果成功,则日志条目如下所示:

{ "operation": "RETRIEVE", "timestamp": "2023-12-18T15:36:40.017800Z", "connector-id": "c-connector-id", "transfer-id": "transfer-id", "file-transfer-id": "transfer-id/file-transfer-id", "url": "sftp://s-server-id.server.transfer.us-east-1.amazonaws.com", "file-path": "/sftp-server-storage-east/RETRIEVE-to-S3.txt", "status-code": "COMPLETED", "start-time": "2023-12-18T15:36:39.727626Z", "end-time": "2023-12-18T15:36:39.895726Z", "account-id": "500655546075", "connector-arn": "arn:aws:transfer:us-east-1:500655546075:connector/c-connector-id", "local-directory-path": "/s3-storage-east/incoming" }

创建用作远程 SFTP 服务器的 Transfer Family 服务器的步骤

接下来,我们将概述创建用作本教程远程 SFTP 服务器的 Transfer Family 服务器的步骤。请注意以下几点:

  • 我们使用 Transfer Family 服务器来表示远程 SFTP 服务器。典型的 SFTP 连接器用户拥有自己的远程 SFTP 服务器。请参阅 创建 Transfer Family SFTP 服务器和一个用户

  • 因为我们使用的是 Transfer Family 服务器,所以我们也使用的是服务管理的 SFTP 用户。而且,为简单起见,我们将该用户访问 Transfer Family 服务器所需的权限与他们使用连接器所需的权限相结合。同样,大多数 SFTP 连接器用例都有单独的 SFTP 用户,该用户与 Transfer Family 服务器无关。请参阅 创建 Transfer Family SFTP 服务器和一个用户

  • 在本教程中,由于我们在远程 SFTP 服务器上使用 Amazon S3 存储,因此我们需要创建第二个存储桶s3-storage-east,以便我们可以将文件从一个存储桶传输到另一个存储桶。

创建 Transfer Family SFTP 服务器和一个用户

大多数用户不需要创建 Transfer Family SFTP 服务器和用户,因为您已经有一台包含用户的 SFTP 服务器,并且您可以使用此服务器来往传输文件。但是,在本教程中,为了简单起见,我们使用了 Transfer Family 服务器来充当远程 SFTP 服务器。

按照中所述创建启用 SFTP 的服务器的步骤创建服务器和步骤 3:添加服务托管用户添加用户。以下是我们在本教程中使用的用户详细信息:

  • 创建您的服务管理用户,sftp-testuser

    • 将主目录设置为 /sftp-server-storage-east/sftp-testuser

    • 创建用户时,即存储公钥。稍后,当你在 Secrets Manager 中创建密钥时,你需要提供相应的私钥。

  • 角色:sftp-connector-role。在本教程中,我们对 SFTP 用户和访问 SFTP 连接器使用相同的 IAM 角色。在为组织创建连接器时,您可能有不同的用户和访问角色。

  • 服务器主机密钥:创建连接器时需要使用服务器主机密钥。您可以通过ssh-keyscan为服务器运行来检索此密钥。例如,如果您的服务器 ID 为s-1111aaaa2222bbbb3,且其终端节点位于中us-east-1,则以下命令将检索服务器主机密钥:

    ssh-keyscan s-1111aaaa2222bbbb3.server.transfer.us-east-1.amazonaws.com

    将此文本复制到某个地方,因为您需要将其粘贴到步骤 2:创建和测试 SFTP 连接器程序中。

用户和访问角色的组合

在本教程中,我们使用的是单一的组合角色。我们既对 SFTP 用户使用此角色,也用于访问连接器。以下示例包含此角色的详细信息,以备您要执行本教程中的任务时使用。

以下示例授予访问我们在 Amazon S3 中的两个存储桶以及存储在 Secrets Manager 中的名为aws/transfer/sftp-connector1的密钥所需的权限。在本教程中,这个角色被命名为sftp-connector-role

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListingOfUserFolder", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::sftp-server-storage-east", "arn:aws:s3:::s3-storage-east" ] }, { "Sid": "HomeDirObjectAccess", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject", "s3:DeleteObjectVersion", "s3:GetObjectVersion", "s3:GetObjectACL", "s3:PutObjectACL" ], "Resource": [ "arn:aws:s3:::sftp-server-storage-east/*", "arn:aws:s3:::s3-storage-east/*" ] }, { "Sid": "GetConnectorSecretValue", "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": "arn:aws:secretsmanager:us-east-1:500655546075:secret:aws/transfer/sftp-connector1-6RandomCharacters" } ] }

有关为 Transfer Family 创建角色的完整详细信息,请按照中的创建用户角色步骤创建角色。