일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- relationships
- ncloud
- cloudwatch
- observers
- laravel8
- AWS
- 파이썬머신러닝완벽가이드
- app::singleton
- rules
- ndarray
- ORM
- laravel7
- app:bind
- EloquentORM
- artisan:make service
- laravel
- php
- 머신러닝
- validate
- enV
Archives
- Today
- Total
박유성의 라라벨 블로그
Laravel + CloudWatch 설정 본문
자사에서 운영 중인 관리자 사이트에서 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