2021.11.12
STAFF BLOG
スタッフブログ
TECHNICAL
テクログ
概要
FuelPHP において、 AWS SDK などの外部ライブラリは `fuel/app/vendor` に入れるという内容です
`fuel/app/vendor/` にインストールする
たとえば、`fuel/app/vendor/aws3.199.2` ディレクトリを作成して、そこに `aws_sdk 3.199.2` をインストールします。アプリでは `try catch` を利用して読み込みます。
なにが嬉しいか
- 実践はしていませんが、メンテナンス無しでアップデートが出来ると思います
今後、`AWS SDK 4` にアップデートが必要な場合は、`fuel/app/vendor/aws4` ディレクトリにインストールします。アプリでは、読み込みに成功したらそちらを読み込ませます。
サンプル( AWS SDK )
前提として、`fuel/app/vendor` に AWS SDK の `2.8.31` がすでにインストールされています。
この状態で、 `fuel/app/vendor` に AWS SDK の `3.199.2` を新しくインストールします。
`composer.phar` を利用して特定のディレクトリにインストールする方法
以下の形式でインストール先を指定することができます。
php composer.phar require --working-dir=ディレクトリまでのパス ベンダー名/プロジェクト名
`--working-dir` をつけることでインストール先のディレクトリを指定しています。ディレクトリはすでに作成されている必要があります。
サンプルコードでやること
- 新しく `3.199.2` を読み込みたい
- 失敗したら `2.8.31` を読み込みたい
- 試しに `getObject` メソッドを実行して S3 から画像ダウンロードしたい
注意
サンプルコードでは `Aws\S3\S3Client` のインスタンス生成に続いて `getObject` を実行していますが、実際には分けたほうがいいです。
メソッドに破壊的変更が加えられると対応が辛いので。
ラッパークラスを利用するなどして、外部ライブラリのバージョンアップによる破壊的変更を吸収できるようにコードを設計する必要があります。
サンプルコード
try {
// AWS SDK 3.199.2 を読み込む(新しく読み込みたい)
include APPPATH.'vendor/awssdk3.199.2/vendor/autoload.php';
$aws_s3_client = new Aws\S3\S3Client(
array(
'key' => 'XXXXXXX',
'secret' => 'YYYYYYYYY',
'region' => 'ap-northeast-1',
'bucket' => 'CCCCCCCC',
'version' => 'latest',
'credentials' => false // credentials の値については詳しく調べていません
)
);
} catch (\Throwable $th) {
// AWS SDK 2.8.31 を読み込む(読み込み実績がある前提)
include APPPATH.'vendor/awssdk2.8.31/vendor/autoload.php';
$aws_s3_client = Aws\S3\S3Client::factory(array(
'key' => 'XXXXXXX',
'secret' => 'YYYYYYYYY',
'region' => 'ap-northeast-1',
'bucket' => 'CCCCCCCC'
));
Log::error($th->getMessage());
}
try {
// S3 から画像ダウンロードしてみる
$result = $aws_s3_client->getObject(array(
'Bucket' => 'Bucket',
'Key' => 'sample.jpg',
'SaveAs' => APPPATH.'tmp/sample.jpg',
));
} catch (\Throwable $th) {
// エラー処理
}
サンプルコードで出来たこと
- `getObject` を実行してS3から画像のダウンロードは出来ました
- `3.199.2`, `2.8.31` の両方で実行できました
- `3.199.2` の読み込みを失敗させて、`2.8.31` で実行できました
終わり
以上です。
実際に運用しているわけではないので問題点などは不明です。