안녕하세요 :)
오늘은 CloudFront와 S3 버킷을 연동하는 실습을 진행하겠습니다.
[순서]
1. S3 생성
2. CloudFront 배포
3. S3권한 설정
4. 완료
1.S3 생성
우선 CloudFront와 연동시킬 S3버킷을 생성해 줍니다.
객체 소유권이란 다른 AWS 계정에서도 소유권을 갖거나 접속제어 가능유무를 설정하는 것 입니다.
저는 ACL 비활성화를 통해서 내가 접속한 계정에서만 소유하도록 설정했습니다.
이 버킷의 퍼블릭 액세스를 차단한다는 것은 외부에서도 파일을 읽게 하지 못한다는 의미다.
퍼블릭 액세스를 경우에 따라 차단하고 싶다면, "모든 퍼블릭 액세스 차단"은 비활성화하고 세부적인 옵션을 선택하면 된다.
▶새 ACL(액세스 제어 목록)을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단
→ 지정된 ACL이 퍼블릭이거나, 요청에 퍼블릭 ACL이 포함되어 있으면 PUT 요청을 거절한다.
▶임의의 ACL(액세스 제어 목록)을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단
→ 버킷의 모든 퍼블릭 ACL과 그 안에 포함된 모든 Object를 무시하고, 퍼블릭 ACL를 포함하는 PUT 요청은 허용한다.
▶새 퍼블릭 버킷 또는 액세스 지점 정책을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단
→ 지정된 버킷 정책이 퍼블릭이면 PUT 요청을 거절한다. 이 설정을 체크하면 버킷 및 객체에 대한 퍼블릭 액세스를 차단하고 사용자가 버킷 정책을 관리할 수 있으며, 이 설정 활성화는 기존 버킷 정책에 영향을 주지 않는다.
▶임의의 퍼블릭 버킷 또는 액세스 지점 정책을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단
→ 퍼블릭 정책이 있는 버킷에 대한 액세스가 권한이 있는 사용자와 AWS 서비스로만 제한되며, 이 설정 활성화는 기존 버킷 정책에 영향을 주지 않는다.
이렇게 버킷이 생성되었습니다.
만들어진 버킷에 들어가줍니다.
저는 CloudFront를 배포할 때 원본경로 옵션을 사용해보려고 폴더를 만들어서
그 안에 txt파일이랑 이미지를 업로드 시켰습니다.
이렇게 S3버킷을 만들어 보고 파일을 만들어 그 안에 txt파일이랑 이미지파일을 업로스 시켜봤습니다.
2.CloudFront 배포
CloudFront배포를 생성해 줍니다.
▶ 원본도메인에는 CloudFront랑 연동할 S3를 선택해 줍니다.
(필요에 따라서 S3정적 호스팅 도메인, EC2 도메인, ELB도메인 역시 사용 가능합니다.)
▶ 원본 경로는 S3안에 여러개의 폴더들이 있을 때 특정 폴더만 타켓을 하고싶다면 원본 경로를 사용하면 됩니다.
저는 S3를 만들때 폴더를 생성해서 그 폴더안에 txt파일이랑 이미지파일을 넣어놨습니다.
그래서 txt파일의 URL경로는 testcdn.bigco.site/s3-cloudfront/test.txt 입니다.
이렇게되면 URL경로가 너무 길어져서 원본경로에 파일이름인 /s3-cloudfront을 넣어놓으면 testcdn.bigco.site를 들어올때
자동으로 원본 경로는 추가해놓은 S3안의 폴더인 /s3-cloudfront을 타겟을 하게 됩니다.
즉 S3폴더를 타겟으로 설정하여 폴더명을 안쓰고 testcdn.bigco.site/test.txt이렇게 사용하면 됩니다.
전 -> testcdn.bigco.site/s3-cloudfront/test.txt
후 -> testcdn.bigco.site/test.txt
▶ 원본 엑세스 제어 설정 Origin Access Identity (OAI)
S3의 컨텐츠를 CloudFront를 사용해서만 볼 수 있도록 제한하는 방법이다.
S3의 정적인 컨텐츠 URL로 바로 접근하는게 아니라 CDN을 통해서 접근하는 것이다.
S3는 정적인 컨텐츠를 호스팅 하기 때문에 CloudFront와 잘 맞습니다.
CloudFront만 권한을 가지고 S3에 접근하고 나머지 접근권한은 막아줍니다.
→ CloudFront는 유저와 S3사이에서 중개하는 역할
S3 Bucket Policy로 CloudFront의 접근을 허용해야 사용 가능
캐시동작은 기본으로 설정해줬습니다.
▶ 뷰어 프로토콜 정책
HTTP and HTTPS -> HTTP와 HTTPS프로토콜을 허용
Redirect HTTP TO HTTPS -> HTTP로 접속하면 HTTPS로 리다이렉트
Only HTTPS -> 오직 HTTPS로만 접근
▶ 대체 도메인(CNAME)
대체 도메인은 CloudFront 생성 시 할방받는 도메인 이름이 있는데 그 도메인 대신 자신이 생성한
간단한 도메인 이름을 지정하는 것 입니다.
예를들어 저는 CloudFront는 생성시 부여받은 DNS는 https://d2byl4907d4usv.cloudfront.net 입니다
하지만 저 DNS로 접근하기보다 제가 생성한 testcdn.bigco.site로 접근하기 더 수월하여 바꿔줬습니다.
▶ 사용자 정의 SSL 인증서
저는 CloudFront DNS접속시 HTTPS접근을 허용하려고 ACM인증서를 발급 받았습니다.
허나 CloudFront에 사용될 ACM인증서는 버지니아 북부에 생성을 하고 발급 받아야합니다.
저는 서울리전에 인증서를 받급받고 등록하려는데 ACM인증서가 안떠서 한참 찾아봤던 기억이 나네요.
이렇게 배포가 끝났습니다.
마지막 수정부분에 배포라고 떠있는데 날짜가 뜨면 배포가 완료된 것입니다.
배포 완료까지는 최소 2분에서 5분까지 걸리더라구요.
그리고 배포가 완료되는 동안 대체도메인에 설정했던 도메인을 Route53 A레코드에 별칭을 사용하여 추가해줬습니다.
3.S3권한 설정
사진 2-2에 원본 엑세스 제어 설정, 즉 S3의 컨텐츠를 CloudFront를 사용해서만 볼 수 있도록 권한설정을 해줘야하 한다.
정책이 편리하게 나와있어서 "정책 복사" 버튼을 클릭한 후 S3 버킷 권한으로 이동을 해줍니다.
S3 버킷의 상당 권한으로 들어가서 버킷 정챙에 편집을 눌러줍니다 .
그리고 복사했던 권한 정책을 붙여넣기 해주시고 권한을 적용시켜 줍니다.
{
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "AllowCloudFrontServicePrincipal",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::s3-bucket-testcdn/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::193432528475:distribution/E2S2HPQNSMTDAY"
}
}
}
]
}
4.완료
CloudFront와 S3를 연동하여 버킷에 넣어놓은 test.txt파일과 펭수 이미지를 출력하게 됩니다.
이렇게 오늘은 CloudFront와 S3를 연동하는 실습을 진행하였습니다.
CloudFront는 정적, 동적 컨텐츠를 빠르게 응답하기 위한 캐시 기능을 제공하는 CDN서비스 입니다.
캐싱을 지원하기 때문에 S3에 저장된 컨텐츠를 직접 접근하지 않아도 각각의 Region의 Edge Location에 데이터가 저장되서 사용자와 가까운 Edge Location으로 라우팅됩니다.
그러므로 CloudFront는 콘텐츠를 Edge Location에 캐싱하기 때문에 S3에 대한 부하를 줄일 수 있고, 요청하는 콘텐츠를 사용자에게도 빠르게 응답할 수 있습니다. 또한 S3에 대한 엑세스 제한을 강화시켜 콘텐즈 보안 유지에도 장점이 있습니다.
감사합니다 :0
참고자료