Laravel에서 AWS CloudFront Invalidation 생성 및 조회하기

AWS SDK For PHP를 사용하여 CloudFrontClient 라이브러리로 Invalidation을 생성하려 했었는데 아래와 같은 문제가 생겼다. 

1. 각 인스턴스 별 ACCESS KEY 및 ACCESS SECRET KEY를 발행하여. env에서 관리해야 한다
2. 발급받은 각각의 키를 분실하거나 공유하게 될 경우 발생하는 어마무시한 후처리 작업..(키 재발행 및 적용 등)

 

물론, AWS에서 자체적으로 제공하는 PHP를 위한 SDK가 있는데 굳이 CLI command reference를 사용하려는 이유는

1. AWS로 구성되어 있는 서비스지만 S3,CloudFront 작업 이외에 SDK를 사용하여 develop 해나갈 기능이 없다고 판단.
2. iam의 EC2인스턴스 서버별 작업 권한(S3접근, CloudFront접근, 추가, 수정 등) 부여를 경험해 보고 싶음 등등

그리하여 CloudFront 무효화 작업 API를 만들때 CLI Command Reference를 사용하여 개발을 진행하였다.

 

▶사전에 각자 AWS IAM에서 작업할 서버에 CloudFront 작업 권한을 부여하자.


1. CreateInvalidation API 만들기

  • 본인은 CloudFrontInvalidationController를 만들어 여기서 비즈니스 로직을 처리하기로 함.
<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;

class CloudFrontInvalidationController extends Controller
{
	
    private $returnData;
    
    public function __construct()
    {            
        $this->returnData = [ 'code' => 200 , 'message' => 'invalidation is success!'];
    }
    
    public function store(Request $request)
    {
    	//...
    }
}
  • routes 폴더 밑에 api.php에 적당하게 아무렇게나 지어준다
<?php
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::post('/cloudfront/invalidations','Api\CloudFrontInvalidationController@store');

 

2. CLI Command Reference를 사용하여 Create Invalidation 처리

public function store(Request $request)
{

    $validator = Validator::make($request->input(),[
        'distributionId' => '옵션|옵션1|등..',
        'paths' => '옵션|옵션1|등..|난array로함'
    ]);

    if ($validator->fails()) {
        return false;
    }
    
    $distributionId = $request->distributionId;
    $paths = $request->paths;
    
	$cliInput = "aws cloudfront create-invalidation ";
    $cliInput .= "--distribution-id {$distributionId} ";
    $cliInput .= "--paths ";
    $cliOutput = null; // 원한다면 exec에 붙여서 결과값 도출

    foreach ($paths as $path) {
        $cliInput .= " \"".$path."\" ";
    }
    
    // 커맨드 명령어 실행
    exec($cliInput);
}

 

번외

1. Laravel의 Console>Commands에 signature로 명령어를 만들어 artisan으로 사용할 수도 있었지만, 그렇게까지 할 필요 없는 기능이라고 생각되어.. 해보고 싶은 자들은 한 번쯤 해봐도 좋을 듯..? 

2. 위의 코드는 샘플용 코드로 각자 더 develop해서 사용하길 권장