AWS S3 大きいファイルをWEBからダウンロードする
S3にログファイルなどを保存して開発者ツールを作ったときのメモ
S3に保存してAWSマネジメントコンソールにログインしてダウンロードするのはIAMでアカウントやら権限やら居なくなった人のアカウント管理やら面倒で・・・
そんなことが面倒なので会社からしかアクセスできない開発者ツールでダウンロードできるようにした。
しかし、ファイル自体が1G弱あるものもありAWS-SDK(ちなみにfor PHPです)のS3ClientでgetObjctしたものをechoするような手順だとメモリ使うんでタイムアウトやら負荷になるやらいいことがなく。。
ストリーミングダウンロードにしようかとしたけどうまくいかず・・・
そんなとき調べていたらいい方法がありました!
AWSで期限付きのダウンロードURLを発行できるということ
なのでその時のことを記録に残します。
※ところどころ端折って書いたり自作クラスは日本語で書いています。
こんなツールになりました。
プロジェクトや環境、ログの種類を選択すると対象ログ種別の一覧を取得
$s3 = new 【自前S3クライアント生成クラス】();
$response = $s3->listObjects(
$bucket,
$s3->【自前プレフィックス生成メソッド】($service, $env)
);
$num = count($response['Contents']);
$ret = array();
for($i=1; $i< $num; $i++) {
$split = explode("/", $response['Contents'][$i]['Key']);
$ret[] = end($split);
}
こんな感じでファイル名を取得しテンプレートで一覧を表示
ファイルA
ファイルB
ファイル名をクリックするとダウンロードURLを発行するアクションへ
$s3 = new 【自前S3クライアント生成クラス】();
$target = $s3->【自前プレフィックス生成メソッド】($service, $env) . '/' . $file_name;
$cmd = $s3->getCommand('GetObject', $bucket, $target);
$result = $s3->createPresignedRequest($cmd, '+30 seconds');
$uri = (string)$result->getUri();
getCommand は後でHTTPリクエストを転送するために使用されるパラメータとハンドラをカプセル化するものらしいです。
getObjectするとファイルの取得が始まってしますので後で実行できる形式にしてからcreatePresignedRequestで期限付きのURLを発行するみたいですね。
※期限の最長は無限ではありません
このURLをテンプレートにリンクを生成して期限あるから気をつけてねって表示したらユーザーにクリックしてもらい出来上がりです。
URLを生成したほうがこちらのサーバに負担がかからずにできるのでいいですね
コメント
コメントを投稿