Good Day

AWS-SDK-PHP-Laravel을 활용한 Laravel 5 + DynamoDB Session 구성 본문

개발/Laravel

AWS-SDK-PHP-Laravel을 활용한 Laravel 5 + DynamoDB Session 구성

영악 2015. 12. 8. 18:05





FROM.Techigniter (원문Link)




어째 Laravel과 DynamoDB는 둘다 유명한데 이걸 같이 쓰는 사람들이 별로 없나보다.

문서 찾는데 정말 고생했다.(영어로 찾았으면 금방나왔겠지만)


사실 Laravel은 새로운 프로젝트에 처음부터 쓸 생각이 아니었으나,

레퍼런스 문서만 보고 일단 써보자 싶어서 이리저리 알아보고 있었다.


겸사겸사해서 DB도 열렬하게 검토하던 중 RDBMS 쓰지 말고 그냥 미친척 NoSQL만 써보자! 라는 생각이 들어 DynamoDB로 낙점.


문제는 두개 다 처음하는거라 완전 무개념 상태였다. 어찌저찌 aws-sdk-php-laravel을 찾아서 세팅하고 DynamoDB Session 세팅하려는데 이게 제대로 안되서 엄청 고생하다가 결국 이 문서를 찾았다.


대부분 그냥 이해되는대로 의역 했고, 실제로 작동하도록 몇가지 내용을 추가했으니 원문만 보고 싶으시면 원문링크(우측상단)을 눌러서 봐주세요.



이 튜토리얼 통해 여러분은 쉽게 DynamoDB Session드라이버를 Laravel 5버전에서 사용하는 방법을 익힐 수 있습니다.





1. Aws Service Provider for Laravel 설치하기


먼저 Aws Service Provider를 당신의 프로젝트에 설치해야 합니다.


1) 아래 정보를 composer.json 파일에 추가해주세요.


※ 아마 대부분 이미 require가 추가되어 있을 텐데 그러면 그냥 끝에 이어서 내용을 넣어주세요.

{

    "require": {

        "aws/aws-sdk-php-laravel": "~3.0"

    }

}


2) composer를 써서 업데이트 실행해주면 자동으로 aws sdk도 설치됩니다.


※ 저는 composer를 path에 추가했으므로 아래있는 composer update로 업데이트 했습니다.

php composer.phar update

or 

composer update


3) config/app.php파일에서 provider key를 찾아 끝에 AWS Service Provider를 추가해줍니다.


'providers' => [


        /*

         * Laravel Framework Service Providers...

         */

        Illuminate\Foundation\Providers\ArtisanServiceProvider::class,

        ...


        /*

        AWS Service Provider

        */

        Aws\Laravel\AwsServiceProvider::class,

    ],


4) config/app.php파일에서 aliases key를 찾아 끝에 AWS facade alias를 추가해줍니다.


'aliases' => [


        'App'       => Illuminate\Support\Facades\App::class,

        'Artisan'   => Illuminate\Support\Facades\Artisan::class,

        ...


        /*

        AWS facade alias

        */

        'AWS' => Aws\Laravel\AwsFacade::class,


    ],


5) artisan을 사용해 config파일을 생성해줍니다.


php artisan vendor:publish


6) 생성된 config/aws.php 파일에 AWS 정보를 기입해줍니다.


return [

    'credentials' => [

        'key'    => 'YOUR_AWS_ACCESS_KEY_ID',

        'secret' => 'YOUR_AWS_SECRET_ACCESS_KEY',

    ],

    'region' => 'us-west-2',

    'version' => 'latest',


    // You can override settings for specific services

    'DynamoDb' => [

        'version' => 'latest'

    ],

];


※ IAM에서 사용자 등록하면 키랑 시크릿키 나옵니다.

※ region은 코드가 따로 있으니 표1 참고해주세요.


코드이름

ap-northeast-1

아시아 태평양(도쿄)

ap-southeast-1

아시아 태평양(싱가포르)

ap-southeast-2

아시아 태평양(시드니)

eu-central-1

EU(프랑크푸르트)

eu-west-1

EU(아일랜드)

sa-east-1

남아메리카(상파울루)

us-east-1

US East (N. Virginia)

us-west-1

미국 서부(캘리포니아 북부 지역)

us-west-2

미국 서부(오레곤)

< 표1. resion 코드 리스트 (link)>




2. DynamoDB Service Provider 생성하기



1) artisan으로 provider를 생성합니다.


php artisan make:provider DynamoSessionServiceProvider


위의 명령어를 실행하면 app/Providers 폴더에 DynamoSessionServiceProvider.php 파일이 생성됩니다.


2) 아래 코드를 namespace 이후에 덮어써줍니다.


use Illuminate\Support\ServiceProvider;

use Aws\DynamoDb\DynamoDbClient;

use Aws\DynamoDb\Session\SessionHandler;

use Session;


class DynamoSessionServiceProvider extends ServiceProvider {

    //기본 리전을 설정한다(config 값이 없을 때 들어감.)

    const DEFAULT_REGION = 'ap-northeast-1';


    // Make sure that this service provider always boots

    protected $defer = false;


    /**

     * Bootstrap the application services.

     *

     * @return void

     */

    public function boot()

    {

        //

    }


    /**

     * Register the application services.

     *

     * @return void

     */

    public function register()

    {

       Session::extend('dynamo', function ($app) {

            // Get a shortcut to config data

            $cfg = $app['config']->get('session');

            $aws_cfg = $app['config']->get('aws');

            

            // Do the real work of hooking up Dynamo as session handler

            $dynamoDb = DynamoDbClient::factory([

                'region' => (isset($aws_cfg['region']) ? $aws_cfg['region'] : self::DEFAULT_REGION),

                'version' => (isset($aws_cfg['DynamoDb']['version']) ? $aws_cfg['DynamoDb']['version'] : 'latest'),

                'credentials' => $aws_cfg['credentials']

            ]);


            $sessionHandler = $dynamoDb->registerSessionHandler([

                'table_name'               => $cfg['table'],

                'hash_key'                 => 'id',

                'session_lifetime'         => 60 * $cfg['lifetime'],   // minutes to seconds

                'consistent_read'          => true,

                'locking_strategy'         => null,

                'automatic_gc'             => true,

                'gc_batch_size'            => 25,

                'max_lock_wait_time'       => 10,

                'min_lock_retry_microtime' => 10000,

                'max_lock_retry_microtime' => 50000

            ]);


            // Set the start of the session id to the cookie name - optional

            $sessionHandler->open('', $cfg['cookie']);


            return $sessionHandler;

        });

    }

}


3) config/app.php파일에서 provider key를 찾아 끝에 생성한 provider를 추가해줍니다.


'providers' => [


        /*

         * Laravel Framework Service Providers...

         */

        ...

        Illuminate\View\ViewServiceProvider::class,


        /*

        AWS Service Provider

        */

        Aws\Laravel\AwsServiceProvider::class,



        /*

         * Application Service Providers...

         */

        ...

        YOUR_APP\Providers\RouteServiceProvider::class,

        

        // for DynamoDB SESSION

        YOUR_APP\Providers\DynamoSessionServiceProvider::class,


    ],


※ YOUR_APP = 생성한 Laravel Project의 이름입니다.


4) Session 설정 값을 업데이트 합니다.


config/session.php


'driver' => 'dynamo',

'table' => 'sessions', <- dynamoDB에 생성해놓은 테이블명




3. 축하합니다! 사용할 준비가 끝났습니다.


간단한 테스트 코드를 삽입합니다.


1) app/Http/routes.php에 아래 라우팅 주소 2개를 추가합니다.


Route::get('/s', function () {

Session::put('key', 'hello world!');


return 'save';

});


Route::get('/l', function () {

$get = Session::get('key') == '' ? 'false' : Session::get('key');


return $get;

});


2) 주소로 접근해서 확인합니다.


www.your-domain.com/s로 접근 후 www.your-domain.com/l로 접근했을 때 hello world!가 출력되는지 확인합니다.





※ 주의사항


1. IAM Role은 잘 체크해주세요

2. 특정폴더에 쓰기 권한 문제 발생에 주의하세요




끝.





'개발 > Laravel' 카테고리의 다른 글

AWS AMI + PHP56 + HTTPD24 + Laravel 초기 세팅  (0) 2015.12.07
Comments