CloudFront 서명된 URL로 S3에 액세스하는 방법

9234 단어 CloudFrontS3AWS

개요





이번에는 CloudFront의 서명 된 URL로 S3에 액세스하는 방법에 대한 내용을 작성해 보았습니다.

절차는 다음과 같습니다.
・S3 작성
· CloudFront 작성
· CloudFront 서명 된 URL 발급
· CloudFront 서명 된 URL로 S3에 액세스

S3 만들기





BucketName을 넣고 ② > ③(Block all public access 전부 체크) > ④를 진행하여 S3을 작성하십시오. 

그런 다음 간단한 index.html 파일을 S3에 업로드합니다.

CloudFront 만들기





CloudFront로 이동하여 Create Distribution을 클릭합니다.



Delivery Method는 웹을 선택합니다.
RTMP는 Streaming service입니다.



  • Origin Domain Name: S3 목록에서 처음 생성한 S3을 선택합니다.

  • Origin Path:S3 SubBucketFolder입니다만, 이번 작성하고 있지 않으므로, 공란으로 OK입니다.

  • Origin ID:Origin Domain Name 선택하면 마음대로 표시됩니다.

  • Restrict Bucket Access: S3에 CloudFront만 액세스할 수 있도록 하는 설정이므로 Yes를 선택합니다.

  • Origin Access Identity: 처음 생성하는 경우 Create a New Identity를 선택합니다.

  • Grant Read Permissions on Bucket:Block all public access 하고 있으므로 CloudFront에서 S3에 액세스할 수 있는 권한을 부여합니다.



  • Viewer Protocol Policy: 이번에는 인증서 없이 수행하므로 Http and Https를 선택합니다.

  • Restrict Viewer Access: 서명된 URL만 액세스를 허용하려면 Yes를 선택합니다.

  • 그런 다음 'Create Distribution'을 클릭하여 CloudFront를 만듭니다.
    아마도 Status가 Deployed까지 15분 정도 걸릴 것입니다. .

    Deployed가 표시되면 S3 Policy 확인 및 Domain Name으로 액세스합니다.
    우선 S3 Policy는 Grant Read Permissions on Bucket에 의해 업데이트되고 있다고 생각합니다.


    그리고 도메인 이름으로 액세스하면,

    MissingKey라고합니다. 이전에 Restrict Viewer Access를 'Yes'로 설정했으므로,
    별도로 서명된 URL을 게시하지 않으면 액세스할 수 없습니다.

    이제 CloudFront 서명된 URL을 게시합니다.

    참고로 index.html과 같이 특정 Object가 아닌 URL을 요청하는 경우 아래 설정을 수행하십시오.
    Distribution Settings > Edit > Default Root Object에 index.html 입력 > Yes, Edit를 클릭하고 15분을 기다립니다. .

    CloudFront 서명된 URL 게시





    Root User에서 My Security Credentials로 이동합니다.



    CloudFront key pairs > Create New Key Pair를 클릭하여 Private 및 Public 키를 다운로드합니다.

    CloudFront 서명된 URL로 S3에 액세스



    이제 S3에 액세스할 준비가 되었다고 생각합니다.
    저자는 Laravel에서 CloudFront의 서명된 URL을 게시합니다.
    
    AWS_ACCESS_KEY_ID= // AWS Access Key
    AWS_SECRET_ACCESS_KEY= // AWS Secret Access Key
    AWS_DEFAULT_REGION= // AWS region
    AWS_BUCKET= // S3 bucket name
    CLOUDFRONT_DOMAIN_NAME= //cloudfront Domain Name
    RESOURCE_KEY=index.html
    CLOUDFRONT_EXPIRES=60 //1分
    CLOUDFRONT_PRIVATE_KEY= // Security Credentials private key path
    CLOUDFRONT_KEY_PAIR_ID= // Security Credentials CloudFront key pairs Access Key ID
    
    
           $sdk = new Sdk([
                'region'  => env('AWS_DEFAULT_REGION'),
                'version' => 'latest',
                'credentials' => [
                    'key'    => env('AWS_ACCESS_KEY_ID'),
                    'secret' => env('AWS_SECRET_ACCESS_KEY')
                ]
            ]);
    
            $client = $sdk->createCloudFront();
            $expires = time() + env('CLOUDFRONT_EXPIRES');
    
            $cloudFrontUrl = $client->getSignedUrl([
                'url'         => env('CLOUDFRONT_DOMAIN_NAME') . '/' . env('RESOURCE_KEY'),
                'expires'     => $expires,
                'private_key' => storage_path('app') . '/' . env('CLOUDFRONT_PRIVATE_KEY'),
                'key_pair_id' => env('CLOUDFRONT_KEY_PAIR_ID')
            ]);
    
            dump($cloudFrontUrl);
            exit;
    



    게시한 URL로 액세스하면 S3에 업로드한 index.html이 표시됩니다.


    그런 다음 1분 후에 액세스하면 Access Denied가 표시되고 액세스할 수 없게 됩니다.

    참고



    Authorization@Edge using cookies: Protect your Amazon CloudFront content from being downloaded by unauthenticated users
    [CloudFront+S3] 특정 버킷에 특정 배포판에서만 액세스할 수 있도록 설정

    좋은 웹페이지 즐겨찾기