发送和接收AS2消息 - AWS Transfer Family

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

发送和接收AS2消息

本节介绍发送和接收AS2消息的过程。它还提供与AS2消息相关的文件名和位置的详细信息。

发送AS2消息流程

出站进程定义为从 AWS 外部客户端或服务发送的消息或文件。出站消息的顺序如下:

  1. 管理员调用 start-file-transfer AWS Command Line Interface (AWS CLI) 命令或StartFileTransferAPI操作。此操作引用 connector 配置。

  2. Transfer Family 检测到新的文件请求并定位该文件。文件经过压缩、签名和加密。

  3. 传输HTTP客户端执行HTTPPOST请求,将有效负载传输到合作伙伴的AS2服务器。

  4. 该过程返回已签名的MDN响应,与HTTP响应内联(同步MDN)。

  5. 当文件在不同的传输阶段之间移动时,该流程会向客户提供MDN回复收据和处理细节。

  6. 远程AS2服务器将解密并经过验证的文件提供给合作伙伴管理员。

该图显示了出站消息的处理顺序。

AS2处理支持许多 RFC 4130 协议,重点是常见用例以及与现有AS2支持服务器实现的集成。有关支持的配置详细信息,请参阅 AS2支持的配置

接收AS2消息流程

入站流程定义为正在传输到 AWS Transfer Family 服务器的消息或文件。入站消息的顺序如下:

  1. 管理员或自动流程在合作伙伴的远程AS2服务器上启动AS2文件传输。

  2. 合作伙伴的远程AS2服务器对文件内容进行签名和加密,然后向 Transfer Family 上托管的AS2入站端点发送HTTPPOST请求。

  3. Transfer Family 使用服务器、合作伙伴、证书和协议的配置值,解密并验证有效负载。AS2文件内容存储在已配置的 Amazon S3 文件存储中。

  4. 已签名的MDN响应要么与HTTP响应内联返回,要么通过单独的HTTPPOST请求异步返回原始服务器。

  5. 审计记录已写入Amazon, CloudWatch 其中包含有关交易所的详细信息。

  6. 解密后的文件位于名为 inbox/processed 的文件夹中。

该图显示了入站消息的处理顺序。

通过发送和接收AS2消息 HTTPS

本节介绍如何配置使用AS2协议发送和接收消息的 Transfer Family 服务器HTTPS。

通过发送AS2消息 HTTPS

要使用发送AS2消息HTTPS,请使用以下信息创建一个连接器:

  • 对于URL,请指定 HTTPS URL

  • 对于加密算法,请指定 NONE

  • 提供连接器的其余值,如 配置AS2连接器 中所述。

通过接收AS2消息 HTTPS

AWS Transfer Family AS2服务器目前仅通过端口 5080 提供HTTP传输。但是,您可以使用自己选择的端口和证书在 Transfer Family 服务器VPC端点前的负载均衡器TLS上终止。通过这种方法,你可以使用传入的AS2消息HTTPS。

先决条件

  • VPC必须与你的 Transfer Family 服务器 AWS 区域 相同。

  • 您的子网VPC必须位于您要在其中使用服务器的可用区内。

    注意

    每台 Transfer Family 服务器最多可以支持三个可用区。

  • 在与您的服务器相同的区域中最多分配三个弹性 IP 地址。或者,您可以选择自带自己的 IP 地址范围 (BYOIP)。

    注意

    弹性 IP 地址的数量必须与您用于服务器端点的可用区域数量相匹配。

配置网络负载均衡器

在中设置面向互联网的 Network Load Balancer (NLB)。VPC

创建 Network Load Balancer 并将服务器的VPC端点定义为负载均衡器的目标
  1. 打开亚马逊弹性计算云控制台,网址为https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,选择负载均衡器,然后选择创建负载均衡器

  3. 网络负载均衡器下,选择创建

  4. 基本配置部分,输入以下信息:

    • 对于名称,为负载均衡器输入一个描述性名称。

    • 对于 Scheme,选择 Internet-facing

    • 对于 IP address type(IP 地址类型),选择 IPv4

  5. 网络映射部分中,输入以下信息:

    • 对于 VPC,请选择您创建的虚拟私有云 (VPC)。

    • Mapping s 下,选择与公有子网关联的可用区,这些可用区与您用于服务器VPC终端节点的子网相同。

    • 对于每个子网IPv4的地址,选择您分配的弹性 IP 地址之一。

  6. 侦听器和路由部分中,输入以下信息:

    • 对于 Protocol(协议),选择 TLS

    • 对于端口,输入 5080

    • 对于默认操作,选择创建目标组。有关创建新目标组的详细信息,请参阅 创建目标组

    创建目标组后,在默认操作字段中输入其名称。

  7. 安全侦听器设置部分,在默认 SSL /证书区域中选择您的TLS证书

  8. 选择创建负载均衡器来创建您的NLB。

  9. (可选,但推荐)打开网络负载均衡器的访问日志以保持完整的审计跟踪记录,如网络负载均衡器的访问日志中所述。

    我们建议执行此步骤,因为TLS连接终止于NLB。因此,反映在您的 Transfer Family AS2 CloudWatch 日志组中的源 IP 地址是NLB的私有 IP 地址,而不是交易伙伴的外部 IP 地址。

设置负载均衡器后,客户端通过自定义端口侦听器与负载均衡器进行通信。然后,负载均衡器通过端口 5080 与服务器通信。

创建目标组
  1. 在前面的过程中选择创建目标组后,您将进入新目标组的指定组详细信息页面。

  2. 基本配置部分,输入以下信息。

    • 选择目标类型中,选择 IP 地址

    • 对于目标组名称,输入目标组的名称。

    • 对于 Protocol(协议),选择 TCP

    • 对于端口,输入 5080

    • 对于 IP address type(IP 地址类型),选择 IPv4

    • 对于 VPC,请选择您为 Transfer Family AS2 服务器创建的。VPC

  3. 在 “健康检查” 部分,选择 “TCP健康检查” 协议

  4. 选择下一步

  5. 注册目标页面,输入以下信息:

    • 对于网络,请确认已指定您为 Transfer Famil AS2 y 服务器创建的。VPC

    • 对于IPv4地址,请输入 Trans IPv4 fer Family AS2 服务器端点的私有地址。

      如果您的服务器有多个端点,请选择添加IPv4地址以添加另一行用于输入其他IPv4地址。重复此过程,直到输入服务器所有端点的私有 IP 地址。

    • 确保端口设置为 5080

    • 选择包含如下待处理事项,将您的条目添加到审核目标部分。

  6. 查看目标部分,查看您的 IP 目标。

  7. 选择创建目标组,然后返回到之前的创建目标组的过程,NLB并在指示的地方输入新的目标组。

测试从弹性 IP 地址访问服务器

使用弹性 IP 地址或 Network Load Balancer 的DNS名称通过自定义端口连接到服务器。

重要

使用负载均衡器上配置的子网的网络访问控制列表(网络ACLs),管理从客户端 IP 地址对服务器的访问。网络ACL权限是在子网级别设置的,因此这些规则适用于使用该子网的所有资源。您无法使用安全组控制来自客户端 IP 地址的访问,因为负载均衡器的目标类型设置为 IP 地址而不是实例。因此,负载均衡器不保留源 IP 地址。如果网络负载均衡器的运行状况检查失败,则意味着负载均衡器无法连接到服务器端点。要对此问题进行故障排除,请检查以下步骤:

  • 确认服务器端点的关联安全组允许来自负载均衡器上配置的子网的入站连接。负载均衡器必须能够通过端口 5080 连接到服务器端点。

  • 确认服务器的状态联机

使用AS2连接器传输文件

AS2连接器在贸易伙伴之间建立关系,以便将AS2消息从 Transfer Family 服务器传输到合作伙伴拥有的外部目的地。

您可以使用 Transfer Family 通过引用连接器 ID 和文件路径来发送AS2消息,如以下 start-file-transfer AWS Command Line Interface (AWS CLI) 命令所示:

aws transfer start-file-transfer --connector-id c-1234567890abcdef0 \ --send-file-paths "/DOC-EXAMPLE-SOURCE-BUCKET/myfile1.txt" "/DOC-EXAMPLE-SOURCE-BUCKET/myfile2.txt"

要获取连接器详细信息,请运行以下命令:

aws transfer list-connectors

list-connectors命令会返回连接器IDsURLs、以及连接器的 Amazon 资源名称 (ARNs)。

要返回特定连接器的属性,请使用要使用的 ID 运行以下命令:

aws transfer describe-connector --connector-id your-connector-id

describe-connector命令返回连接器的所有属性,包括其角色URL、配置文件、邮件处置通知 (MDNs)、标签和监控指标。

您可以通过查看和文件来确认合作伙伴是否成功接收JSON了MDN文件。这些文件是根据 文件名和位置 中描述的约定命名的。如果您在创建连接器时配置了日志记录角色,则还可以检查 CloudWatch 日志中的AS2消息状态。

要查看AS2连接器详细信息,请参阅查看AS2连接器详细信息。有关创建AS2连接器的更多信息,请参见配置AS2连接器

文件名和位置

本节讨论传输的文件命名惯例。AS2

对于入站文件传输,需要注意以下方面:

  • 您可以在协议中指定基本目录。基本目录是 Amazon S3 存储桶名称和前缀(如果有)的组合。例如,/DOC-EXAMPLE-BUCKET/AS2-folder

  • 如果成功处理了传入的文件,则该文件(以及相应的JSON文件)将保存到该文件/processed夹。例如,/DOC-EXAMPLE-BUCKET/AS2-folder/processed

    该JSON文件包含以下字段:

    • agreement-id

    • as2-from

    • as2-to

    • as2-message-id

    • transfer-id

    • client-ip

    • connector-id

    • failure-message

    • file-path

    • message-subject

    • mdn-message-id

    • mdn-subject

    • requester-file-name

    • requester-content-type

    • server-id

    • status-code

    • failure-code

    • transfer-size

  • 如果无法成功处理传入的文件,则会将该文件(以及相应的JSON文件)保存到该文件/failed夹。例如,/DOC-EXAMPLE-BUCKET/AS2-folder/failed

  • 传输的文件存储在 processed 文件夹中,名为 original_filename.messageId.original_extension。也就是说,传输的消息 ID 会附加到文件名之后,在文件的原始扩展名之前。

  • JSON文件已创建并另存为original_filename.messageId.original_extension.json。除了要添加的消息 ID 外,还会在传输的文件名后面附加该字符串 .json

  • 邮件处置通知 (MDN) 文件已创建并另存为original_filename.messageId.original_extension.mdn。除了要添加的消息 ID 外,还会在传输的文件名后面附加该字符串 .mdn

  • 如果存在名为 ExampleFileInS3Payload.dat 的入站文件,则会创建以下文件:

    • FileExampleFileInS3Payload.c4d6b6c7-23ea-4b8c-9ada-0cb811dc8b35@44313c54b0a46a36.dat

    • JSONExampleFileInS3Payload.c4d6b6c7-23ea-4b8c-9ada-0cb811dc8b35@44313c54b0a46a36.dat.json

    • MDNExampleFileInS3Payload.c4d6b6c7-23ea-4b8c-9ada-0cb811dc8b35@44313c54b0a46a36.dat.mdn

对于出站传输,命名类似,不同之处在于没有传入的消息文件,而且,已传输消息的传输 ID 会添加到文件名中。转移 ID 由StartFileTransferAPI操作返回(或者当其他进程或脚本调用此操作时)。

  • transfer-id 是与文件传输关联的标识符。作为 StartFileTransfer 调用一部分的所有请求共享 transfer-id

  • 基本目录与您用于源文件的路径相同。也就是说,基目录是您在StartFileTransferAPI操作或start-file-transfer AWS CLI 命令中指定的路径。例如:

    aws transfer start-file-transfer --send-file-paths /DOC-EXAMPLE-BUCKET/AS2-folder/file-to-send.txt

    如果您运行此命令,MDN并且JSON文件保存在中/DOC-EXAMPLE-BUCKET/AS2-folder/processed(对于成功传输),或/DOC-EXAMPLE-BUCKET/AS2-folder/failed(对于不成功的传输)。

  • JSON文件已创建并另存为original_filename.transferId.messageId.original_extension.json

  • MDN文件已创建并另存为original_filename.transferId.messageId.original_extension.mdn

  • 如果存在名为 ExampleFileOutTestOutboundSyncMdn.dat 的出站文件,则会创建以下文件:

    • JSONExampleFileOutTestOutboundSyncMdn.dedf4601-4e90-4043-b16b-579af35e0d83.fbe18db8-7361-42ff-8ab6-49ec1e435f34@c9c705f0baaaabaa.dat.json

    • MDNExampleFileOutTestOutboundSyncMdn.dedf4601-4e90-4043-b16b-579af35e0d83.fbe18db8-7361-42ff-8ab6-49ec1e435f34@c9c705f0baaaabaa.dat.mdn

您还可以查看 CloudWatch 日志以查看转账的详细信息,包括任何失败的转账。

状态代码

下表列出了您或您的合作伙伴发送AS2消息时可以记录到 CloudWatch 日志中的所有状态代码。不同的消息处理步骤适用于不同的消息类型,并且仅用于监控。COMPLETED和FAILED状态表示处理的最后一步,并且在JSON文件中可见。

代码 描述 处理完成了吗?
PROCESSING 该消息正在转换为其最终格式。例如,解压缩和解密步骤都具有此状态。
MDN_TRANSMIT 消息处理正在发送MDN响应。
MDN_RECEIVE 消息处理正在收到MDN响应。
COMPLETED 消息处理已成功完成。此状态包括何时MDN为入站邮件或MDN验证出站邮件发送。
FAILED 消息处理失败。有关错误代码的列表,请参阅AS2 错误代码

示例JSON文件

本节列出了入站和出站传输的示例文件,包括成功传输和传输失败的示例文件。JSON

传输成功的示例出站文件:

{ "requester-content-type": "application/octet-stream", "mesage-subject": "File xyzTest from MyCompany_OID to partner YourCompany", "requester-file-name": "TestOutboundSyncMdn-9lmCr79hV.dat", "as2-from": "MyCompany_OID", "connector-id": "c-c21c63ceaaf34d99b", "status-code": "COMPLETED", "disposition": "automatic-action/MDN-sent-automatically; processed", "transfer-size": 3198, "mdn-message-id": "OPENAS2-11072022063009+0000-df865189-1450-435b-9b8d-d8bc0cee97fd@PartnerA_OID_MyCompany_OID", "mdn-subject": "Message be18db8-7361-42ff-8ab6-49ec1e435f34@c9c705f0baaaabaa has been accepted", "as2-to": "PartnerA_OID", "transfer-id": "dedf4601-4e90-4043-b16b-579af35e0d83", "file-path": "/DOC-EXAMPLE-BUCKET/as2testcell0000/openAs2/TestOutboundSyncMdn-9lmCr79hV.dat", "as2-message-id": "fbe18db8-7361-42ff-8ab6-49ec1e435f34@c9c705f0baaaabaa", "timestamp": "2022-07-11T06:30:10.791274Z" }

传输失败的示例出站文件:

{ "failure-code": "HTTP_ERROR_RESPONSE_FROM_PARTNER", "status-code": "FAILED", "requester-content-type": "application/octet-stream", "subject": "Test run from Id da86e74d6e57464aae1a55b8596bad0a to partner 9f8474d7714e476e8a46ce8c93a48c6c", "transfer-size": 3198, "requester-file-name": "openAs2TestOutboundWrongAs2Ids-necco-3VYn5n8wE.dat", "as2-message-id": "9a9cc9ab-7893-4cb6-992a-5ed8b90775ff@718de4cec1374598", "failure-message": "http://Test123456789.us-east-1.elb.amazonaws.com:10080 returned status 500 for message with ID 9a9cc9ab-7893-4cb6-992a-5ed8b90775ff@718de4cec1374598", "transfer-id": "07bd3e07-a652-4cc6-9412-73ffdb97ab92", "connector-id": "c-056e15cc851f4b2e9", "file-path": "/testbucket-4c1tq6ohjt9y/as2IntegCell0002/openAs2/openAs2TestOutboundWrongAs2Ids-necco-3VYn5n8wE.dat", "timestamp": "2022-07-11T21:17:24.802378Z" }

传输成功的示例进站文件:

{ "requester-content-type": "application/EDI-X12", "subject": "File openAs2TestInboundAsyncMdn-necco-5Ab6bTfCO.dat sent from MyCompany to PartnerA", "client-ip": "10.0.109.105", "requester-file-name": "openAs2TestInboundAsyncMdn-necco-5Ab6bTfCO.dat", "as2-from": "MyCompany_OID", "status-code": "COMPLETED", "disposition": "automatic-action/MDN-sent-automatically; processed", "transfer-size": 1050, "mdn-subject": "Message Disposition Notification", "as2-message-id": "OPENAS2-11072022233606+0000-5dab0452-0ca1-4f9b-b622-fba84effff3c@MyCompany_OID_PartnerA_OID", "as2-to": "PartnerA_OID", "agreement-id": "a-f5c5cbea5f7741988", "file-path": "processed/openAs2TestInboundAsyncMdn-necco-5Ab6bTfCO.OPENAS2-11072022233606+0000-5dab0452-0ca1-4f9b-b622-fba84effff3c@MyCompany_OID_PartnerA_OID.dat", "server-id": "s-5f7422b04c2447ef9", "timestamp": "2022-07-11T23:36:36.105030Z" }

传输失败的示例进站文件:

{ "failure-code": "INVALID_REQUEST", "status-code": "FAILED", "subject": "Sending a request from InboundHttpClientTests", "client-ip": "10.0.117.27", "as2-message-id": "testFailedLogs-TestRunConfig-Default-inbound-direct-integ-0c97ee55-af56-4988-b7b4-a3e0576f8f9c@necco", "as2-to": "0beff6af56c548f28b0e78841dce44f9", "failure-message": "Unsupported date format: 2022/123/456T", "agreement-id": "a-0ceec8ca0a3348d6a", "as2-from": "ab91a398aed0422d9dd1362710213880", "file-path": "failed/01187f15-523c-43ac-9fd6-51b5ad2b08f3.testFailedLogs-TestRunConfig-Default-inbound-direct-integ-0c97ee55-af56-4988-b7b4-a3e0576f8f9c@necco", "server-id": "s-0582af12e44540b9b", "timestamp": "2022-07-11T06:30:03.662939Z" }