设置和使用SFTP连接器 - AWS Transfer Family

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

设置和使用SFTP连接器

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

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

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

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

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

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

创建 Amazon S3 存储桶

创建 Amazon S3 存储桶
  1. 登录 AWS 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,请使用您的 AWS 账户 身份证。

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

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

注意

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

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

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

注意

当你在 Secret AWS 账户 s Manager 中存储密钥时,会产生费用。有关定价的信息,请参阅 AWS 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. 登录 AWS Management Console 并打开 AWS 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. 打开 AWS 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

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

      注意

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

    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. 打开 AWS Transfer Family 控制台,网址为https://console.aws.amazon.com/transfer/

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

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

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

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

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

要使用测试连接器 AWS 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 创建角色的完整详细信息,请按照中的创建用户角色步骤创建角色。