Open5

[試す] AWS AS2のチュートリアル

harrythecodeharrythecode

はじめに

AWS AS2というサービスがあります。ざっくり調べたとところ、ファイル転送に良く使われるSFTPのHTTPS版であることがわかります。

AWS公式のドキュメントがあまりにも冗長で読みにくいので動かすところまでをかいつまんでメモを書き残します。

そもそもAS2って何?

AS2はファイル転送なので「受け手」と「送り手」がいます。以下はその概要図です。

AS2メッセージ送信処理

アウトバウンドプロセスは、AWS から外部クライアントまたはサービスに送信されるメッセージまたはファイルとして定義されます。送信メッセージのシーケンスは次のとおりです。

  1. 管理者は、start-file-transferAWS コマンドラインインターフェイス (AWS CLI) コマンドまたはStartFileTransferAPI オペレーションを呼び出します。この操作はconnector構成を参照します。
  2. Transfer Family は新しいファイル要求を検出し、ファイルを見つけます。ファイルは圧縮、署名、暗号化されています。
  3. 転送 HTTP クライアントは、HTTP POST リクエストを実行して、ペイロードをパートナーの AS2 サーバーに送信します。
  4. このプロセスは、署名された MDN 応答 ( 受取通知; Message Disposition Notice )を HTTP 応答とインラインで返します (同期 MDN)。
  5. ファイルが送信のさまざまな段階間を移動すると、プロセスは MDN 応答の受信と処理の詳細を顧客に配信します。
  6. リモート AS2 サーバーは、復号化および検証されたファイルをパートナー管理者が利用できるようにします。

AS2メッセージ受信処理

受信プロセスは、AWS Transfer Family サーバーに転送されるメッセージまたはファイルとして定義されます。受信メッセージのシーケンスは次のとおりです。

  1. 管理プロセスまたは自動プロセスは、パートナーのリモート AS2 サーバー上で AS2 ファイル転送を開始します。
  2. パートナーのリモート AS2 サーバーは、ファイルの内容に署名して暗号化してから、Transfer Family でホストされている AS2 インバウンド エンドポイントに HTTP POST リクエストを送信します。
  3. Transfer Family は、サーバー、パートナー、証明書、契約の構成値を使用して、AS2 ペイロードを復号化して検証します。ファイルの内容は、設定された Amazon S3 ファイル ストアに保存されます。
  4. 署名された MDN 応答は、HTTP 応答とともにインラインで返されるか、別の HTTP POST 要求を通じて非同期的に元のサーバーに返されます。
  5. 交換に関する詳細を含む監査証跡が Amazon CloudWatch に書き込まれます。
  6. 復号化されたファイルは、 という名前のフォルダーにありますinbox/processed。

https://docs.aws.amazon.com/transfer/latest/userguide/send-as2-messages.html

これだけで分かったあなたは天才級です。でも安心してください。これを書いてるボクも意味が分かりません。

harrythecodeharrythecode

そもそもの疑問

  • HTTPSでファイルを送れると言いながらなぜCLIを使うことを前提?
    • -> ドキュメントを読むと通常のSFTPクライアントでも使えるよ、とのこと。単にAWSが説明の省略化してるだけ。
  • パートナーAS2サーバってそもそも何?AWS AS2だけでテストできないの?
    • -> ファイル送受信をきちんとするなら必要。AWS側で何ができるかは後で確認。
  • コネクタとエンドポイントが分かれてる理由は?
    • -> コネクタは認証情報 (e.g., パスワードの設定だったり暗号化方式 )を記録して、エンドポイントはAWS上でのネットワーク情報 (e.g., どのVPC, Public/Internalとかそういうの) で分けてる。
harrythecodeharrythecode

コマンドから理解

AWS AS2を一通り画面ぽちぽちで立ち上げた後に以下の通り「AS2メッセージ送信処理」を行います。

$ aws transfer list-connectors
{
    "Connectors": [
        {
            "Arn": "arn:aws:transfer:xxx:xxx:connector/c-xxx",
            "ConnectorId": "c-xxx",
            "Url": "http://example.com"
        }
    ]
}

$ aws transfer start-file-transfer --connector-id c-xxx --send-file-paths "/<あなたのS3>/<あなたのファイル>"
{
    "TransferId": "xxx"
}

すると該当のS3上では以下のようなフォルダやファイルが生成されてました。

中身を良く見ると、

  • MDN ( 受領通知 )
----=boundary-mdn
Content-Type: text/plain

The message sent on 
from [<あなたのメルアド>] to [<送り先>]
with subject  [<タイトル>] and
message ID of [<UUID>]
has been [failed/Failure: message-deemed-invalid-due-to-unknown-from-and.or-to-parties].
Message was NOT processed : Cannot find originating party using the AS2-FROM ident [あなたのメルアド]

This is not a guarantee that the business message/document has been completely
processed or understood by the receiving translator.

This return message is generated on Thu, 01 Feb 2024 02:18:01 GMT

----=boundary-mdn
Content-Type: message/disposition-notification

Reporting-UA: example.com
Original-Recipient: rfc822;xxx
Final-Recipient: rfc822;xxx
Original-Message-ID: <UUID>
Disposition: automatic-action/MDN-sent-automatically; failed/Failure: message-deemed-invalid-due-to-unknown-from-and.or-to-parties

----=boundary-mdn--
  • json ( AWS公式からコピペ [1] )
{
  "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"
}

これから、MDNは、サーバ間でのメール配信のようなステータスの交換を行い、jsonにはなぜ送れなかったのか、の理由が記載されます。

脚注
  1. https://docs.aws.amazon.com/transfer/latest/userguide/send-as2-messages.html#receive-https ↩︎

harrythecodeharrythecode

じゃあCLIじゃなくてHTTPSで送受信するには?

公式のドキュメントに細かく書いてますが相変わらず分かりにくいのでかいつまんで解説します、

https://docs.aws.amazon.com/transfer/latest/userguide/send-as2-messages.html#as2-https-process

NLBをAS2 Endpointに設定したけど、Emptyしか返って来ませんでした。ネットで探してもどんなHTTPリクエストを投げれば良いかが分からなかったので一旦ここまで。

$ curl -i https://<myDomain>:5080
curl: (52) Empty reply from server
harrythecodeharrythecode

トラブルシューティング

その後いろいろと試すとどうも400 Bad Requestが返ってくるようになりました。よく調べると Local & Partner AS2 Server間でミスマッチがあるとのこと。この辺は相手側とよく確認しながら調査する必要があります。例えば証明書の不一致だったり、AS2 From / To / URL の情報が間違ってたり、などがあります。

https://docs.aws.amazon.com/transfer/latest/userguide/as2-monitoring.html#as2-error-codes

https://repost.aws/questions/QU7VdDpjdLSpq5wb310BB9BA/issue-with-receiving-message-for-aws-transfer-family-as2