NETSUITE / SFTP

SFTP連携、
コードだけ見ても分からなかった。

NetSuiteから外部のSFTPサーバーへ接続して、 ファイルを取得したり、 逆にファイルを置いたりする処理を触りました。

最初に困ったのは、 そもそもNetSuiteとSFTPサーバーが うまくつながらなかったことです。

hostKeyは合っているように見える。 接続先も合っている。 それでもつながらない。

コードだけでは分からなかったので、 WinSCPで接続先を見たり、 Windowsのコマンドプロンプトから SFTPへ直接接続したりしながら、 一つずつ切り分けていきました。

FIRST QUESTION

SFTPサーバーとNetSuiteが、
つながらない。なぜ?

最初に見ていたのは、 NetSuite側の接続処理でした。

SuiteScriptでは、 N/sftp を使って SFTPサーバーへ接続します。

CODE N/sftp
var connection =
    sftp.createConnection({
        username: username,
        url: host,
        directory: directory,
        hostKey: hostKey
    });

接続先も入っている。

ユーザーも入っている。

hostKeyも、 見た限りでは合っている。

それでも、 NetSuiteからはつながらない。

最初はhostKeyを疑っていましたが、 外部接続では 一か所だけを見ても 原因が分からないことがありました。

POSSIBLE CAUSES

原因候補は、
一つじゃなかった。

実際に外部接続を追っていると、 問題になりそうな場所はいくつもありました。

  • NetSuite側の設定や制限
  • 対向先でのアクセス許可
  • 認証情報やhostKey
  • コード上のスペルミス
  • 接続処理を呼ぶ位置や順番
  • 接続後のファイル処理

対向先が NetSuiteからのアクセスを 許可していないこともある。

逆に、 NetSuite側の設定や制限で 接続できないこともある。

認証でもhostKeyでもなく、 単純な記述ミスだったこともありました。

接続処理自体ではなく、 処理を書く場所や 呼び出す順番が原因になることもありました。

原因候補を一つに決めつけず、
接続元・接続先・コードを横に並べて見る。

外部接続では、 その見方が必要でした。

CONNECT / TROUBLESHOOTING

「何が悪い?」より、
「どこまでは正常?」を見る。

NetSuite側だけを見ていても 原因が分からなかったので、 SFTPサーバーへ外から直接接続して 状態を確認しました。

WinSCPでは、 接続先のディレクトリや ファイルを画面から確認しました。

Windowsのコマンドプロンプトから SFTPへ直接接続して、 接続時の状態やエラーを見ることもありました。

特に面倒だったのは、 WinSCPやコマンドからは接続できるのに、 NetSuiteからだけ つながらないケースでした。

SFTPサーバーそのものには 到達できている。

そうなると、 NetSuite側の設定や制限、 対向先から見たNetSuiteの接続状態などへ 確認範囲を移していきます。

接続を追っていく中では、 hostKeyだけではなく、 RSA系の鍵や ホストキー方式まで 確認する場面もありました。

さらに、 鍵ファイルの形式によっては PEM形式へ変換して 確認することもありました。

このあたりまで来ると、 SuiteScriptだけではなく、 SSHや認証側の話にも入ってきます。

すべてを最初から 理解していたわけではありません。

エラーや接続状態を見ながら、 必要になったところを調べて 一つずつ切り分けていきました。

PPK・PEM・PuTTYgenなど、 SFTPの鍵まわりでハマった話 →

  • WinSCPから接続できるか
  • コマンドから直接接続できるか
  • 接続時にどんなエラーが出るか
  • 接続先や認証情報は正しいか
  • hostKeyは正しいか
  • 対向先でNetSuiteからのアクセスが許可されているか
  • NetSuite側で接続が制限されていないか
  • コードや処理順に問題がないか

一個確認する。

修正して、 もう一度試す。

エラーやログを見る。

また次を確認する。

そうやって整理していくことで、 最終的には NetSuiteからSFTPへ 接続できるようになりました。

一発で原因を当てるより、
「どこまでは正常か」を確認して 範囲を狭めていく。

PUT / GET

接続できたら、
今度はファイルを実際に動かす。

SFTPサーバーへ接続できても、 ファイル連携として 正常に動くとは限りません。

そこで、 実際にファイルを置いたり、 取得したりしながら 後続処理を確認しました。

ファイルを置いたあと、 NetSuite側の処理が動くのか。

ファイルがそのまま残るのか。

別のディレクトリへ移動するのか。

エラーになったら どこで止まるのか。

また、 ファイルが存在していても、 中身が想定と違えば 後続処理は正常に動きません。

ファイル名や拡張子、 CSVの項目、 区切り文字、 文字コードまで 実際のファイルを見て確認しました。

「接続できる」と 「ファイル連携が動く」は別。

接続の次は、 実際に流れるデータを見る必要がありました。

Shift_JISのCSV連携でハマったこと →

APPLICATION / INFRASTRUCTURE

コードの問題だと思っていたら、
もっと外側を見ることになった。

NetSuiteの開発なので、 最初はSuiteScriptのコードを 追えばいいと思っていました。

でも、 外部連携が動かなければ その外側まで見る必要があります。

SFTPサーバーやSSH接続。

hostKeyや認証。

必要になれば、 鍵ファイルの形式まで確認する。

対向先の許可や NetSuite側の制限。

さらに、 接続後のファイル配置や 後続処理まで見る。

アプリケーションのコードだけで 原因が分からないなら、
通信・認証・接続先まで見る。

必要に迫られて追っていった結果、 アプリとインフラの境界まで 見るようになっていました。

SUMMARY

外部接続は、
片側だけ見ても解けなかった。

SFTP連携では、 hostKeyやコードだけを見ても 解決しないことがありました。

WinSCPで見る。

コマンドから直接接続する。

エラーやログを見る。

必要なら、 鍵や認証側まで確認する。

実際のファイルを見る。

「何が悪い?」と決めつけるより、
「どこまでは正常?」から切り分ける。

一個ずつ整理していくことで、 接続元・接続先・ファイルのどこを見るべきかが 少しずつ分かるようになりました。

SFTP連携で覚えたのは、 接続方法そのものより、 コードの外まで含めて 問題を見ること だった気がします。