s3 생성,
먼저 AWS Management Console에서 CloudFront를 열어 배포 설정을 진행해 봅시다.
이제 Route 53에서 CNAME을 설정하여 CloudFront 배포 도메인 이름을 연결해봅시다.
마지막으로 S3 버킷 정책을 수정하여 CloudFront가 S3 버킷의 객체를 읽을 수 있도록 설정해봅시다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::${s3경로}/*"
}
]
}
openssl genpkey -algorithm RSA -out private_key.pem -aes256
openssl rsa -pubout -in private_key.pem -out public_key.pem
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