LoginSignup
2
0

More than 3 years have passed since last update.

LaravelでSFTPの設定を導入して、本番環境やDEV環境でSFTP通信するまでの手順について

Last updated at Posted at 2020-08-26

はじめに

CSVファイルをSFTPサーバへ連携する案件があったのでその時の導入手順メモになります。
作業の流れを整理する目的で記事を書いています。
処理環境ではPHPのLaravelフレームワークが入っている環境が用意されていたので、SFTP用の処理や設定を追加する流れになります。

なお、導入に際してはこちらの記事サイトを参考にしてます。

環境について

  • Laravel:5.8
  • PHP:7.2

導入手順

1.SFTPモジュールのインストール

Laravelのhomeディレクトリに移動して、composer requireを実行してSFTPモジュールをインストールします。

composer require league/flysystem-sftp

以下のようにインストール結果が「successfully」と出てれば大丈夫です。


Using version ^1.0 for league/flysystem-sftp
./composer.json has been updated
(省略)
Package manifest generated successfully.

また、composer.jsonのrequireにも、sftpのバージョンが追記されます。

{
   "require": {
       "league/flysystem-sftp": "^1.0"
   }
}

他にもvendor/league/flysystem-sftpディレクトリが実行環境に作成されます。この辺りを確認できれば良いと思います。

2.sftpモジュールの用意

参考サイトと同じ流れですが、
接続情報を環境ごとに分けたかったので、.envから参照するようにしています。

2.1 ServiceProviderへの登録

make:providerコマンドで、sftp用のServiceProviderクラスを作成します。

# サービスプロパイダファイルを生成用のコマンド
php artisan make:provider SftpServiceProvider
<?php

namespace App\Providers;

use Storage;
use League\Flysystem\Filesystem;
use Illuminate\Support\ServiceProvider;
use League\Flysystem\Sftp\SftpAdapter;

class SftpServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
      Storage::extend('sftp', function ($app, $config) {
        return new Filesystem(new SftpAdapter([
          'host'        => $config['host'],
          'port'        => $config['port'],
          'username'    => $config['username'],
          'password'    => $config['password'],
          'privateKey'  => $config['privateKey'],
          'root'        => $config['root'],
          'timeout'     => $config['timeout'],
        ]));
      });
    }

}

2.2 FileSystemへの追記

config/filesystem.phpへ、sftp用のディスク設定を追記します。
この際、本番やDEV環境のアクセス設定を.envから参照するようにしています。

未定義の項目があった場合は、env関数の第2引数の値が使用されます。
(設定値は、nullでエラーが起きなければ良い程度で設定しています)

<?php

return [

   'disks' => [

        /*他のディスク設定も入っていると思いますが、省略します*/

        'sftp' => [
            'driver' => 'sftp',
            'host' => env('SFTP_HOST','192.168.10.10'),
            'port' => env('SFTP_PORT',22),
            'username' => env('SFTP_USER','myName'),
            'password' => env('SFTP_PW','myPass'),
            'privateKey' => env('SFTP_PRIVATE_KEY', '/home/myUser/.ssh/sftp_key.rsa'),
            'root' => env('SFTP_ROOT_DIR','/tmp'),
            'timeout' => 10,
          ],
    ],
];

.envには以下のように設定情報を用意しておきます。

SFTP_HOST=[接続先HOSTのドメインまたは、IPアドレス]
SFTP_PORT=[接続先HOSTのアクセス用のポート]
SFTP_USER=[ユーザーアカウント]
SFTP_PW=[ユーザーパスワード]
SFTP_PRIVATE_KEY=[アクセス用キーのパス]
SFTP_ROOT_DIR=[接続先のルートディレクトリ]

3.SFTP通信

3.1 SFTP通信の実装

細かい処理は割愛しますが、設定情報の読み込みとSFTPによるファイルアップロードについて記載します。

//SFTPの設定をloggerに出力
logger()->info(get_class() . ' SFTP HOST is[ ' . Config::get('filesystems.disks.sftp.host') . ' ]' );

//SFTPアップロード用のstorage設定
$storageDir = storage_path() . DIRECTORY_SEPARATOR . 'app' . DIRECTORY_SEPARATOR . 'upload' . DIRECTORY_SEPARATOR ;

//sample.csvを、new_sample.csvとしてアップロード
$contents = file_get_contents($storageDir.'sample.csv');
Storage::disk('sftp')->put('new_sample.csv', $contents);     

3.2 各環境(本番/dev)へのデプロイ

自前で設定した「2.1 ServiceProvider」,「2.2 FileSystem」や「3.1で自作した処理」は、git管理されてると思いますが、vendor以下は各環境でデプロイしました。
私の場合は、git pullしてcomposer.jsonを配置した後で、composer installを実行しました。

composer install

おわりに

長文となりましたが、LaravelでのSFTPの導入や設定についてと、各環境でのデプロイについて記載しました。
個人の作業内容の振り返りとしてまとめた内容について、最後までお読みいただきありがとうございました。

参考サイト

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0