박유성의 라라벨 블로그

Laravel + CloudWatch 설정 본문

Tip

Laravel + CloudWatch 설정

Matt.park 2020. 9. 18. 09:28

자사에서 운영 중인 관리자 사이트에서 Access log를 관리하기 위해 cloudwatch를 적용했다.

laravel과 cloudwatch를 연동한 경험을 공유하고자 한다.

 

Composer

먼저 필수 패키지를 설치한다.

// CloudWatch Logs 핸들러
// https://github.com/maxbanton/cwh

$ composer require maxbanton/cwh

 

환경설정

cloudwatch 연동을 위한 값들을 위해 .env 및 service.php를 설정한다.

// .env

AWS_ACCESS_KEY_ID={AWS ACCESS KEY ID}
AWS_SECRET_ACCESS_KEY={AWS SECRET ACCESS KEY}
AWS_CWL_GROUP_NAME={그룹 명}
AWS_CWL_STREAM_NAME={스트림 명}
AWS_CWL_TAG_NAME={태그 명}
AWS_CWL_TAG_VALUE={태그 값}
AWS_CWL_RETENTION={로그 만료일자}
// app/config/services.php

<?php

return [

    'cloudwatch' => [
        'group_name' => env('AWS_CWL_GROUP_NAME'),
        'stream_name' => env('AWS_CWL_STREAM_NAME'),
        'tag_name' => env('AWS_CWL_TAG_NAME'),
        'tag_value' => env('AWS_CWL_TAG_VALUE'),
        'retention' => env('AWS_CWL_RETENTION'),
    ],

];

 

Middleware

미들웨어에서는 방문자의 정보를 로그에 쌓는 일을 처리한다.

$ php artisan make:middleware CloudWatchLogger
// app/Http/Middleware/CloudWatchLogger.php

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Log;

class CloudWatchLogger
{
    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request
     * @param \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (auth()->check()) {
            $data = [
                'created_at' => now(),
                'ip' => $request->ip(),
                'id' => auth()->guard()->user()->admin_id,
                'name' => auth()->guard()->user()->name,
                'user-agent' => $request->header('User-Agent'),
                'url' => $request->fullUrl(),
                'body' => $request->all(),
            ];

            Log::info(json_encode($data, JSON_PRETTY_PRINT));
        }
        return $next($request);
    }
}

 

Logging + Aws 설정

클래스 파일(ClountWatch) 생성과 해당 클래스를 실행하도록 로깅 설정을 한다.

// app/Extensions/CloudWatchLogger.php

<?php


namespace App\Extensions;

use Aws\CloudWatchLogs\CloudWatchLogsClient;
use Maxbanton\Cwh\Handler\CloudWatch;
use Monolog\Logger;

/**
 * Class CloudWatchLogger
 * @package App\Extensions
 */
class CloudWatchLogger
{
    /**
     * @param array $config
     * @return \Monolog\Logger
     * @throws \Exception
     */
    public function __invoke(array $config)
    {
        $sdkParams = $config["sdk"];
        $tags = [config('services.cloudwatch.tag_name') => config('services.cloudwatch.tag_value')];

        $client = new CloudWatchLogsClient($sdkParams);
        $groupName = config('services.cloudwatch.group_name') . '-' . config('app.env');
        $streamName = config('services.cloudwatch.stream_name');
        $retentionDays = config('services.cloudwatch.retention');
        $handler = new CloudWatch($client, $groupName, $streamName, $retentionDays, 10000, $tags);
        $logger = new Logger('cloudwatch');
        $logger->pushHandler($handler);
        return $logger;
    }
}

$groupName에는 local환경과 production환경을 구분해주기 위해 접미사를 추가해주었다.

 

// app/config/logging.php

<?php

return [

    'default' => env('LOG_CHANNEL', 'cloudwatch'),
    'channels' => [
        'cloudwatch' => [
            'driver' => 'custom',
            'via' => \App\Extensions\CloudWatchLogger::class,
            'sdk' => [
                'region' => env('AWS_DEFAULT_REGION'),
                'version' => 'latest',
                'credentials' => [
                    'key' => env('AWS_ACCESS_KEY_ID'),
                    'secret' => env('AWS_SECRET_ACCESS_KEY')
                ]
            ],
        ],
        ...
    ],

];

 

설정이 다되었다면, AWS 콘솔로 접속해 CloudWatch > 로그 그룹 > {그룹명} > {스트림명} 으로 접속하면 로그가 정상적으로 나오는 것을 확인할 수 있다.

'Tip' 카테고리의 다른 글

artisan command를 활용한 Service 추가하기  (0) 2020.07.17
Comments