既存の処理をLambda上のLaravelにまとめるためにいろいろやってきましたが
今回はS3イベントからLambda上のLaravelを起動します。
前提
Laravel 並びに brefphp を導入済であること。brefphp の導入については brefphpを使って簡単にLaravelをサーバレス環境で動かす - Qiita がお勧めです。
Laravel についてはこちらのドキュメントを参照してください。
serverless.yml
バケットは「対象のバケット名」で作成済みで、s3://対象のバケット名/text/*.txt が新規作成された時に起動する設定です。
service: test-app
provider:
name: aws
region: ap-northeast-1
runtime: provided
iamRoleStatements:
- Effect: Allow
Action:
- s3:*
Resource: "arn:aws:s3:::対象のバケット名/*"
plugins:
- ./vendor/bref/bref
functions:
s3Created:
handler: s3Event.php
layers:
- ${bref:layer.php-73}
events:
- s3:
bucket: "対象のバケット名"
events:
- "s3:ObjectCreated:*"
rules:
- prefix: text/
- suffix: .txt
existing: true # 既存のバケットを利用する場合のみ記述
s3Event.php
<?php
/**
* S3との連携動作
*/
declare(strict_types=1);
require __DIR__.'/vendor/autoload.php';
return function (array $event) {
$app = require __DIR__ . '/bootstrap/app.php';
$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
$kernel->bootstrap();
$controller = new App\Http\Controllers\S3Controller;
foreach($event['Records'] as $record) {
return $controller->s3created($record);
}
return true;
};
app/Http/Controllers/S3Controller.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Aws\Exception\AwsException;
class S3Controller extends Controller
{
/**
* 作成されたTextファイルを取得
*/
public function s3created($body)
{
// $body['s3']['object']['key'] が新規に作成されたTextファイルのkey。
// 例) text/hogehoge.txt
// ファイルへのアクセスについては config/filesystems.php で設定し
// Storage::disk('s3')->get($body['s3']['object']['key'])
// のように取得するのが良いと思います
}
}