设置和使用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角色

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

以下示例授予访问所需的权限 DOC-EXAMPLE-BUCKET 在 Amazon S3 中,指定的密钥存储在 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

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

  • 对于 account-id,请使用您的 Amazon Web Services 账户 身份证。

  • 对于 SecretName-6RandomCharacters,我们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 中)。

将SFTP连接器的用户凭据存储在 Secrets Manager 中
  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,请URL输入远程SFTP服务器的。在本教程中,我们输入URL了用作远程服务器的 Transfer Family SFTP 服务器。

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

      Replace(替换) 1111aaaa2222bbbb3 使用你的 Transfer Family 服务器 ID。

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

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

      注意

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

    Transfer SFTP Family 连接器控制台,显示连接器配置设置。
  5. 在 “SFTP配置” 部分中,提供以下信息:

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

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

    Transfer SFTP Family 连接器控制台,显示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,请在命令提示符下运行以下命令(替换 connector-id 使用您的实际连接器 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服务器访问的文件位置的路径。

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

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

注意

在以下命令中,替换 connector-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. 打开 Amazon 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" }

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

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

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

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

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

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

大多数用户不需要创建 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 创建角色的完整详细信息,请按照中的创建用户角色步骤创建角色。