[AWS] CloudFront 캐시를 EC2에서 삭제

14458 단어 EC2CloudFrontAWS
CloudFront 캐시 삭제는 AWS 콘솔에서 수동으로 수행할 수 있지만,
배포 시 자동화를 위해 EC2에서 캐시를 삭제하는 방법을 요약했습니다.

EC2+S3+CloudFront는 사전 구축된 전제에서 설명합니다.



1. 준비



배포 시 상황을 시뮬레이션할 준비를 합니다.

1-1. S3에 파일 업로드



먼저 테스트용 파일을 업로드합니다.
AWS 콘솔 > 서비스 > S3 > 해당 버킷 > 업로드
S3에 적절한 이미지 파일과 HTML 파일 등을 업로드합니다.


다음을 눌러 나중에 확인하기 위해 공개 액세스 권한을 부여합니다.


다른 설정은 기본적으로 OK이며 업로드를 누릅니다.

업로드한 세부정보를 확인하고 객체 URL에 액세스하여 콘텐츠를 확인하세요.


덧붙여서 이번 업로드한 것은 이런 내용입니다.


CloudFront URL에 액세스합니다.
AWS 콘솔 > 서비스 > CloudFront > 해당 배포판
에서 세부정보를 보고 도메인 이름을 확인합니다.


그 뒤에 S3에서 업로드한 객체의 경로를 부여하면 해당 파일에 대한 URL이 됩니다.
https:///


같은 내용이 표시되면 OK입니다.

덧붙여서 자신은 ↓의 현상에 맞았으므로, S3 버킷을 재작성했습니다.
S3+CloudFront에서 S3 URL로 리디렉션되는 경우의 해결 방법 | Developers.IO
하지만 재작성하지 않아도 기장에 반영될 때까지 기다리면 문제 없습니다.

1-2. S3 파일 덮어쓰기



오리진 서버(S3)와 캐시 서버(CloudFront)의 내용에 차이를 주기 위해 S3의 내용을 변경합니다.
방금전과 같은 순서로, 같은 파일명 그리고 다른 내용의 파일을 S3에 업로드하면 OK입니다.

다시 업로드한 후 방금 방문한 S3 URL과 CloudFront URL에 각각 액세스하고,
S3는 변경 후의 내용, CloudFront는 변경 전의 내용이 되어 있는지 확인합니다.

CloudFront의 상태 코드는 304(리소스 미갱신)가 반환되고 있다고 생각합니다.


2. 캐시 삭제



CloudFront 캐시 삭제는 공식 파일 무효화(CreateInvalidation)을 가리킵니다.
이렇게 하려면 CloudFront API 을 사용합니다.
이 API를 이용하는 방법으로서, 쉘 스크립트로 실시하는 경우와 PHP로 실시하는 경우를 설명합니다.

2-1. 쉘 스크립트로 삭제하기



AWS CLI 설치 & 설정 나중에$ aws cloudfront create-invalidation명령으로 캐시를 삭제할 수 있습니다.
세부사항: create-invalidation — AWS CLI 2.0.24 Command Reference

EC2의 임의 폴더에 다음 파일 만들기



clear_cache.sh
#!/bin/bash

echo "CloudFront cache clear..."
aws cloudfront create-invalidation \
--distribution-id "EDFDVBD6EXAMPLE" \
--paths "/*"

권한 부여 및 실행


$ chmod 755 clear_cache.sh
$ ./clear_cache.sh

출력 결과


CloudFront cache clear...
{
    "Invalidation": {
        "Status": "InProgress", 
        "InvalidationBatch": {
            "Paths": {
                "Items": [
                    "/*"
                ], 
                "Quantity": 1
            }, 
            "CallerReference": "cli-1592983262-260490"
        }, 
        "Id": "XXXXXXXXXX", 
        "CreateTime": "2020-06-24T07:21:03.500Z"
    }, 
    "Location": "https://cloudfront.amazonaws.com/2019-03-26/distribution/EDFDVBD6EXAMPLE/invalidation/XXXXXXXXXX"
}

참고
CloudFront 캐시를 삭제하는 쉘 스크립트를 작성해 보았습니다. - Qiita

2-2. PHP로 삭제하기



이번은 PHP입니다만, AWS SDK는 다른 언어도 다양합니다. 있으므로 뭐든지 좋다고 생각합니다.

AWS SDK for PHP 설치 한 후
Aws\CloudFront\CloudFrontClient 개체를 사용하여$result = $client->createInvalidation(); 또는$promise = $client->createInvalidationAsync();명령으로 캐시를 삭제할 수 있습니다.
AWS SDK for PHP 3.x

EC2의 임의 폴더에 다음 파일 만들기



clear_cache.php
<?php
require 'vendor/autoload.php';

use Aws\CloudFront\CloudFrontClient;
use Aws\Exception\AwsException;

echo('CloudFront cache clear...'."\n");

$access_key = "xxxxxx";
$access_secret = "xxxxxx";
$distribution_id = "XXXXXX";
$paths = [
    '/*',
];

$client = new CloudFrontClient([
    'region'  => 'us-east-1',
    'version' => '2019-03-26',
    'credentials' => [
        'key'    => $access_key,
        'secret' => $access_secret,
    ],
]);

/** @var \Aws\Result $result */
$result = $client->createInvalidation([
    'DistributionId' => $distribution_id,
    'InvalidationBatch' => [
        'Paths' => [
            'Quantity' => count($paths),
            'Items' => $paths,
        ],
        'CallerReference' => time(),
    ],
]);

var_dump($result);
?>

실행



$ php clear_cache.php

출력 결과


CloudFront cache clear...
/home/ec2-user/clear_cache.php:37:
class Aws\Result#90 (2) {
  private $data =>
  array(3) {
    'Invalidation' =>
    array(4) {
      'Id' =>
      string(14) "xxxxxxx"
      'Status' =>
      string(10) "InProgress"
      'CreateTime' =>
      class Aws\Api\DateTimeResult#109 (3) {
        ...
      }
      'InvalidationBatch' =>
      array(2) {
        ...
      }
    }
    'Location' =>
    string(99) "https://cloudfront.amazonaws.com/2019-03-26/distribution/XXXXXX/invalidation/I2WADC1K0L962S"
    '@metadata' =>
    array(4) {
      'statusCode' =>
      int(201)
      'effectiveUri' =>
      string(84) "https://cloudfront.amazonaws.com/2019-03-26/distribution/XXXXXX/invalidation"
      'headers' =>
      array(5) {
        ...
      }
      'transferStats' =>
      array(1) {
        ...
      }
    }
  }
  private $monitoringEvents =>
  array(0) {
  }
}

참고
AWS PHP SDK v3에서 Amazon CloudFront 캐시 삭제 | 콘크리트 파이브 재팬 - concrete5 Korea Inc.

3. 확인



CloudFront 상태가 '배포됨(APPROVED)'으로 변경된 후
CloudFront URL https:///에 액세스합니다.
내용이 변경된 내용이 되었는지 확인합니다.
상태 코드도 304가 아니라 200입니다.



콘솔에서 로그 확인



일단 AWS 콘솔 > 서비스 > CloudTrail 에서 로그를 확인합니다.
(그 외에 CloudFront의 로그 설정하고 있는 것이 있으면 그쪽을 보면 좋다고 생각합니다.)



오류 코드에 아무것도 표시되지 않으면 성공입니다.

좋은 웹페이지 즐겨찾기