- Amazon CloudFront 란?
- 글로벌 CDN (Content Delivery Network) 서비스.
- [0] 오리진 액세스 제어(OAC) 생성
- https://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html
- 서명 요청 (권장) : "사용자 -> CF -(모든 requst 에 비밀키 암호화한 signature 를 사용하여 접근 하겠다?)-> S3 버킷 오리진"
- 헤더 재정의 안 함 : 체크! // 사용자가 접근하기 위해, 직접 Authorization 셋팅을 복잡히??? 할때??? 관여 않겠다???
- 요청 서명 안 함 : "사용자 -> CF -(Public Access 가능해야만 된다?)-> S3 버킷 오리진"
- [1] 배포
- https://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/GettingStartedCreateDistribution.html
- https://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/distribution-working-with.html
- Origin Access : 그냥 생성한 OAC 선택!
- 나머지는... 그냥 아래 레거시 따라하게!
- 완료후 -> S3 버킷 정책을 업데이트해야 함!
- (s3:GetObject 뿐만 아니라? PutObject 도 해서... 생성한 CF PreSigned URL 으로 업로드도 가능하다!?!?)
- "Action": ["s3:GetObject", "s3:PutObject"],
- ...
- 레거시)
- 0) OAI 생성
- CF 차원에선, 다양한 S3 접근제어가 제공되는데~ OAI(Origin Access Identity) 라는 개념이 있음.
- (사용자가 S3 버킷에서 직접 접근하지 않고, CloudFront를 통해서만 접근 하도록 하는 접근제어)
- CloudFront 콘솔에서 "OAI 생성" 후 -> "S3 해당 버킷" 에서 해당 정책을 셋팅 하면 됨.
- ...
- 1) 배포 생성
- 1-1) 원본
- 1-2) 기본 캐시 동작
- 뷰어 프로토콜
- HTTPS only : 크롬에서 도메인이 https 일 경우~ 내부 http 링크를 -> https 으로 자동바꾸는 이슈 있었음...
- 뷰어 엑세스 제한
- 기본적으로 S3의 모든 파일은 다 막고, pre-signed URL 등으로 하는것이 일반적이다.
- "Trusted Key Groups" 는 밑에서 설명...
- Cache policy and origin request policy
- CloudFront 콘솔에서 "정책 생성" 후~ 해당 선택 해도 됨.
- Legacy cache settings
- CORS 이슈(?) 으로, S3 차원에서 설정되있는 CORS 관련 헤더를 추가 해주었던 ???
- ...
- 1-3) 설정
- 1-1) 원본
- 2) pre-signed 준비
- https://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html
- OpenSSL을 사용하여 길이가 2048비트인 RSA 키 페어를 생성하고 private_key.pem이라는 파일에 저장.
- 예) openssl genrsa -out private_key.pem 2048
- ('퍼블릭 키'와 '프라이빗 키' 모두 포함된 해당 private_key.pem 파일에서) '퍼블릭 키' 를 추출합니다.
- 예) openssl rsa -pubout -in private_key.pem -out public_key.pem
- CloudFront 콘솔에서 "퍼블릭 키 생성" -> "키 그룹 생성"
- 3) pre-signed URL 코드
- https://boto3.amazonaws.com/v1/documentation/api/1.9.46/reference/services/cloudfront.html#examples
-
from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import padding from botocore.signers import CloudFrontSigner def rsa_signer(message): with open('private_key.pem 경로', 'rb') as key_file: private_key = serialization.load_pem_private_key( key_file.read(), password=None, backend=default_backend() ) return private_key.sign(message, padding.PKCS1v15(), hashes.SHA1()) def init(): keyid = os.environ.get('CF_SIGNER_KEYID', None) g_cloudfront_signer = CloudFrontSigner(keyid, rsa_signer) def generate_cf_presigned_url(s3_key): try: domain = os.environ.get('CF_DOMAIN', None) private_url = f"https://{domain}/{s3_key}" expire_date = time_util.utc(hours=1) presigned_url = g_cloudfront_signer.generate_presigned_url(private_url, date_less_than=expire_date) except ClientError as e: return None except Exception as e: return None return presigned_url
- CF 차원에서, cloudfront signer 모듈을 제공함...
- 코드 그대로~ 해당 'private.pem' 파일로 서명을 해주는 -> RSA Signer 를 만들어서 ->
- 접근 하고자하는 S3 Key 를 명시하는 URL 에 Pre Sign 하는것임.
- 이 과정의 옵션으로 expire data 를 지정할수있고, 이렇게 서명된 URL 으로 -> CloudFront 에 요청을 하여 ->
- 접근제어를 받는거임. (Trusted Key Groups 기반의 뷰어 제한)
- 0) OAI 생성
- 연습) S3 파일 -> 브라우저 에서 (원하는 파일명 으로) 다운로드 하기
- 브라우져 상에서 -> S3 파일 접근시 -> 다운로드 동작을 하기위해 -> "Content-Disposition 헤더" 로 컨트롤 하면 된다.
- 그래서, boto3 의 S3 에서는 "Content-Disposition 헤더" 를 presigned URL 발급에 적용할수있다.
- 그라나, boto3 의 CF 에서는 해당 기능을 찾기 힘들었다.
- CloudFrontSigner(...) 이나 .generate_presigned_url(...) 에서 뭔가 있을꺼 같은데~ 잘 못찾겠음 ㅎ
- 일단은, S3 의 .put_object(...) 시~ ContentDisposition 옵션을 적용 -> CF 으로 접근해도 -> 해당 헤더가 잘 연동 되었다.
- attachment; filename="URL 인코딩하면, 한글도 잘됨!"
- ...
- [S3 권한 셋팅]
# 권한
...
# CORS 셋팅
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"HEAD",
"GET",
"PUT",
"POST",
"DELETE"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": [
"ETag"
],
"MaxAgeSeconds": 9000
}
]
-끝-
'AWS' 카테고리의 다른 글
Amazon EFS (0) | 2022.05.19 |
---|---|
Amazon VPC (0) | 2022.04.29 |
Amazon Route53 (작성예정) (0) | 2020.12.02 |
Amazon Kinesis Data Streams (0) | 2020.10.18 |
AWS CodeDepoly (0) | 2020.08.29 |