s3, cloudFront로 경로 변경

Sangyeong Je·2024년 6월 10일
0

서버설정

목록 보기
10/11

s3 생성,

1. IAM 생성

1. 사용자 이름 입력후 다음으로 넘어가 직접 정책연결

2. AmazonS3FullAccess 정책 선택 후 사용자 생성

3. 액세스 키 만들기

2. CloudFront 배포 설정

먼저 AWS Management Console에서 CloudFront를 열어 배포 설정을 진행해 봅시다.

1. CloudFront 열기: AWS Management Console에서 CloudFront로 이동합니다.

2. 배포 생성: Create Distribution을 클릭한 후 Web 배포를 선택합니다.

3. 원본 설정:

  • Origin Domain Name 필드에 S3 버킷의 URL (s3.amazonaws.com)을 입력합니다.

  • Origin Path는 원하는 경로까지 지정 (route53 + originPath)

  • 원본 액세스에서 Legacy access identities 선택 후 새 OAI 생성

  • 예, 버킷 정책 업데이트를 체크해서 자동 업데이트

4. 뷰어 프로토콜 정책: Viewer Protocol Policy를 Redirect HTTP to HTTPS로 설정합니다.

5. 기타 설정: 필요에 따라 기타 설정을 조정하고, Create Distribution을 클릭하여 배포를 생성합니다.

6. 배포 도메인 이름 확인: 배포가 완료되면 CloudFront 배포 도메인 이름을 확인합니다.

3. Route 53에서 CNAME 설정

이제 Route 53에서 CNAME을 설정하여 CloudFront 배포 도메인 이름을 연결해봅시다.

Route 53 콘솔 열기: 해당 도메인의 호스팅 영역으로 이동합니다.

레코드 세트 생성: Create Record Set를 클릭합니다.

필드 입력:

  • Name 필드에 {{sub-domain}}을 입력합니다.

  • Type은 CNAME - Canonical Name으로 선택합니다.

  • Value 필드에 CloudFront 배포 도메인 이름 (cloudfront.net)을 입력합니다.

레코드 생성: Create 버튼을 클릭하여 레코드를 생성합니다.

CloudFront의 대체 도메인 이름을 route53의 이름으로 설정

4. S3 버킷 정책 수정

마지막으로 S3 버킷 정책을 수정하여 CloudFront가 S3 버킷의 객체를 읽을 수 있도록 설정해봅시다.

1. S3 콘솔 이동: S3 콘솔에서 버킷의 Permissions 탭으로 이동합니다.

2. 버킷 정책 편집: Bucket Policy를 편집합니다.

3. 정책 추가: 다음과 같은 정책을 추가합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::${s3경로}/*"
        }
    ]
}

5. CloudFront로 사전 서명된 URL 생성

1. 프라이빗 키 생성

openssl genpkey -algorithm RSA -out private_key.pem -aes256

2. 프라이빗키의 패스프레이즈로 퍼블릭 키 생성

openssl rsa -pubout -in private_key.pem -out public_key.pem

3. 퍼블릭 키 내용을 CloudFront > 퍼블릭 키, 퍼블릭 키 생성 후 key 값에 넣습니다.

4. 키 그룹을 생성해서 방금만든 퍼블릭 키를 추가합니다.

5. CloudFront > 배포에서 동작을 편집해서 뷰어 액세스 제한을 yes로 변경 후 생성한 키 그룹 추가하고 변경 사항 저장하기

6. 프라이빗 키를 이용해 서명된 url 만드는 함수 추가

CLOUDFRONT_KEY_PAIR_ID = d.CLOUDFRONT_KEY_PAIR_ID # 클라우드 프론트의 퍼블릭키의 아이디
PRIVATE_KEY_PATH       = d.PRIVATE_KEY_PATH # 시크릿키 위치
PRIVATE_KEY_PASSPHRASE = d.PRIVATE_KEY_PASSPHRASE # 시크릿키 패스워드

# 유효 시간 url 생성
def generate_cloudfront_signed_url(url, expires_in_seconds):
    # Load the private key
    with open(PRIVATE_KEY_PATH, 'rb') as key_file:
        private_key = serialization.load_pem_private_key(
            key_file.read(),
            password=PRIVATE_KEY_PASSPHRASE.encode()
        )
    
    # Calculate expiration date
    expiration_date = datetime.datetime.utcnow() + datetime.timedelta(seconds=expires_in_seconds)
    expiration_timestamp = int(expiration_date.timestamp())

    # Create policy
    policy = {
        "Statement": [
            {
                "Resource": url,
                "Condition": {
                    "DateLessThan": {
                        "AWS:EpochTime": expiration_timestamp
                    }
                }
            }
        ]
    }
    
    # Serialize policy to JSON
    policy_json = json.dumps(policy)
    policy_b64 = b64encode(policy_json.encode('utf-8')).decode('utf-8')

    # Sign the policy
    signature = private_key.sign(
        policy_json.encode('utf-8'),
        padding.PKCS1v15(),
        hashes.SHA1()
    )
    signature_b64 = b64encode(signature).decode('utf-8')

    # Create the signed URL
    signed_url = f"{url}?Policy={policy_b64}&Signature={signature_b64}&Key-Pair-Id={CLOUDFRONT_KEY_PAIR_ID}"
    return signed_url

0개의 댓글