SFTP サーバーへの動的な接続の例 - Mule 4

多くのインテグレーションでは、次のように特定の条件に応じて異なるサーバーへの接続が必要です。

  • 請求書を発行する部署に応じて異なる請求書ストレージサーバーに接続する。

  • マルチテナントのユースケースなど、インテグレーションの対象に応じて異なるサーバーに接続する。

こうしたユースケースに対応するため、SFTP 用 Anypoint Connector (SFTP Connector) グローバル設定要素では、これらの条件を評価して適切なサーバーに接続するパラメーター式がサポートされています。

次の例は、複数のサーバーに動的に接続するための SFTP Connector の設定方法を示しています。

  1. HTTP の ​[Listener (リスナー)]​ ソースでは、HTTP 経由で投稿されるランダムコンテンツを読み取ってフローを開始します。

  2. File Connector の ​Read​ 操作では、​host​、​user​、​port​ などの列で構成されるランダムな SFTP 宛先セットを含む受信者 CSV ファイルを読み込みます。

  3. DataWeave 変換は、コンテンツをマップして、CSV ファイルを分割します。

  4. [For Each]​ コンポーネントと SFTP の ​Write​ 操作では、コンテンツを各 SFTP 宛先に書き込みます。

    [For Each]​ の反復ごとに、SFTP グローバル設定要素で設定された式が異なる値に解決され、サーバーごとに異なる接続が確立されます。

この例をテストするには、Mule アプリケーションを作成して、curl コマンドを使用してアプリケーションを実行およびテストします。

SFTP サーバーへの動的な接続
Figure 1. SFTP サーバーへの動的な接続のフロー

Mule アプリケーションの作成

Mule フローを作成する手順は、次のとおりです。

  1. [Mule Palette (Mule パレット)]​ ビューで、​[HTTP] > [Listener]​ を選択します。

  2. [HTTP] の [Listener (リスナー)]​ を Studio キャンバスにドラッグします。

  3. [HTTP Listener (HTTP リスナー)]​ 設定画面で、必要に応じて ​[Display Name (表示名)]​ 項目の値を変更します。

  4. [Path (パス)]​ 項目を ​/multitenant​ に設定します。

  5. [Connector configuration (コネクタ設定)]​ 項目の横にあるプラス記号 (​+​) をクリックして、アプリケーション内の HTTP の Listener のすべてのインスタンスで使用できるグローバル要素を設定します。

  6. [General (一般)]​ タブで、次の項目を設定します。

    • Host (ホスト)​: All Interfaces [0.0.0.0] (default)

    • Port (ポート)​: 8081

  7. [OK]​ をクリックします。

  8. [Set Variable]​ コンポーネントを ​[HTTP] の [Listener (リスナー)]​ ソースの右にドラッグします。

  9. [Name (名前)]​ 項目を ​content​、​[Value (値)]​ 項目を ​#[payload]​ に設定します。

  10. File Connector の ​[Read]​ 操作を ​[Set Variable]​ コンポーネントの右にドラッグします。

  11. [File Path (ファイルパス)]​ 項目を ​recipients.csv​ に設定します。
    これにより、​host​、​user​、​port​ などの列で構成されるランダムな SFTP 宛先セットを含む CSV ファイルが読み取られます。

  12. [Connector configuration (コネクタ設定)]​ 項目の横にあるプラス記号 (​+​) をクリックして、アプリケーション内の File Connector のすべてのインスタンスで使用できるグローバル要素を設定します。

  13. デフォルト設定を受け入れ、​[OK]​ をクリックします。

  14. Read​ 操作の ​[MIME Type (MIME タイプ)]​ タブの ​[MIME Type (MIME タイプ)]​ 項目で ​application/csv​ を選択します。

追加コンポーネントおよび操作を設定する

コンポーネントおよび操作を追加して、Mule アプリケーションの作成を続けます。

  1. Studio で、​[Transform Message]​ コンポーネントを ​[Read]​ 操作の右にドラッグします。

  2. コンポーネントの ​[Output (出力)]​ セクションで、次の DataWeave コードを追加して、CSV ファイルの列にマップします。

    DataWeave スクリプト:
    %dw 2.0
    output application/java
    ---
    payload map using (row = $) {
       host: row.Host,
       user: row.User,
       password: row.Password}
  3. [For Each]​ コンポーネントを ​[Transform Message]​ コンポーネントの右にドラッグします。

  4. SFTP の ​[Write]​ 操作を ​[For Each]​ コンポーネントにドラッグします。
    For Each の反復ごとに、​Write​ 操作は、コンテンツを各 SFTP 宛先に書き込みます。

  5. [Connector configuration (コネクタ設定)]​ 項目の横にあるプラス記号 (​+​) をクリックして、アプリケーション内の SFTP の Write 操作のすべてのインスタンスで使用できるグローバル要素を設定し、次の項目を設定します。

    • Host (ホスト)​: #[payload.host]

    • Username (ユーザー名)​: #[payload.username]

    • Password (パスワード)​: #[payload.password]

  6. [OK]​ をクリックします。

  7. 設定画面で、​[Path (パス)]​ 項目を ​demo.txt​ に設定します。

  8. [Content (コンテンツ)]​ 項目を ​payload​ に設定します。

  9. [Set Payload]​ コンポーネントを ​[For Each]​ コンポーネントの右にドラッグします。

  10. [Value (値)]​ 項目を ​Multicast Ok​ に設定します。

Mule アプリケーションを実行およびテストする

Mule アプリケーションを作成したら、それを実行してテストします。

  1. Studio で、Mule アプリケーションを保存します。

  2. Package Explorer​ でプロジェクト名をクリックし、​[Run (実行)]​ > ​[Run As (別のユーザーとして実行)]​ > ​[Mule Application (Mule アプリケーション)]​ をクリックします。

  3. ブラウザーを開き、​http://0.0.0.0:8081/multitenant​ と入力します。

Mule 4 の動作に関する注意事項 (Mule 3 ユーザー向け):

  • HTTP Listener ソースを通じて投稿された情報は、各 SFTP サイトに複数回書き込まれます。

    リスナーで​反復可能ストリーム機能​が使用されているため、ストリームを複数回コンシュームすることについて心配は無用です。

  • For Each コンポーネントは CSV ファイルの各行を自動的に処理します。

    Mule 3 では、最初に CSV ファイルを Java 構造体に変換する必要がありましたが、Mule 4 は Java に依存しないため、変換せずに動作するようになりました。

ファイルを読み取る場合やリストする場合に、ファイルのメタデータ (たとえば、ファイル名、フルパス、サイズ、タイムスタンプ) を知りたいと考える場合もあります。コネクタは Mule メッセージ属性を使用してこの情報にアクセスします。

SFTP サーバーに動的に接続するための XML

この例のフローをすばやく Mule アプリケーションに読み込むには、次のコードを Studio XML エディターに貼り付けます。

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:sftp="http://www.mulesoft.org/schema/mule/sftp" xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core"
	xmlns:file="http://www.mulesoft.org/schema/mule/file"
	xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd
http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd
http://www.mulesoft.org/schema/mule/sftp http://www.mulesoft.org/schema/mule/sftp/current/mule-sftp.xsd">
	<http:listener-config name="HTTP_Listener_config" >
		<http:listener-connection host="0.0.0.0" port="8081" />
	</http:listener-config>
	<file:config name="File_Config" doc:name="File Config"  />
	<sftp:config name="SFTP_Config" doc:name="SFTP Config"  >
		<sftp:connection host="#[payload.host]" username="#[payload.user]" password="#[payload.password]" />
	</sftp:config>
	<flow name="SFTPexample" >
		<http:listener doc:name="Listener" config-ref="HTTP_Listener_config" path="/multitenant"/>
		<set-variable value="#[payload]" doc:name="Set Variable" variableName="content"/>
		<file:read doc:name="Read" config-ref="File_Config" path="recipients.csv" outputMimeType="application/csv"/>
		<ee:transform doc:name="Transform Message" >
			<ee:message >
				<ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
payload map using (row = $) {
   host: row.Host,
   user: row.User,
   password: row.Password}]]></ee:set-payload>
			</ee:message>
		</ee:transform>
		<foreach doc:name="For Each" >
			<sftp:write doc:name="Write" config-ref="SFTP_Config" path="demo.txt">
			</sftp:write>
		</foreach>
		<set-payload value="Multicast OK" doc:name="Set Payload" />
	</flow>
</mule>