안녕하세요.
오늘은 CloudFront를 테스트 해보려고 합니다.
- S3로 정적 웹 사이트 호스팅
- S3 + CloudFront로 정적 웹 사이트 호스팅
- CloudFront 버전 관리 방법
- 파일 무효화
S3로 정적 웹 사이트(Hello World Page) 호스팅
버킷 생성
버킷 이름과 설정 값들을 변경하여 생성합니다.
퍼블릭 액세스 차단 설정 해제
버킷에 퍼블릭으로 접근하기 위해서는 차단 설정을 해제하고 버킷 생성
S3 파일 업로드
클라이언트에게 보여줄 파일을 업로드 합니다.
S3로 정적 웹 사이트 호스팅
속성 탭에서 정적 웹 사이트 호스팅 설정을 편집하고 저장합니다.
저장하고 버킷 웹 사이트 엔드포인트가 생성됩니다.
해당 URL을 통해 접속할 수 있습니다.
하지만, 지금 접속하면 403 Access Denied 를 볼 수 있습니다.
이 경우 권한 탭에서 버킷 정책을 변경해주면 해결됩니다.
정책을 적용하고 다시 접속하게 되면 Hello World를 볼 수 있습니다.
S3 + CloudFront로 정적 웹 사이트 호스팅
S3 설정
S3 설정은 “S3로 정적 웹 사이트 호스팅”과 동일하게 진행하고, 권한 탭에서 퍼블릭 액세스 차단 내용을 활성으로 변경합니다.
버킷 웹 사이트 엔드포인트 URL로 접속하면 403 Access Denied가 나오는 상태이어야합니다.
CloudFront 배포 생성 및 설정
원본 도메인 부분에는 S3에서 생성했던 내용을 찾아서 선택합니다. S3 버킷으로 액세스가 가능하도록 OAI를 활성화 합니다.
그리고 정책내용을 자동으로 변경할 수 있도록 합니다. 자동으로 변경하지않으면 생성 후 직접 권한 추가를 하면 됩니다.
다른 세부 사항에 대해서는 검색해서 필요한 것들을 추가 설정하면 됩니다.
기본 캐시 동작에서는 뷰어 프로토콜 정책을 “Redirect HTTP to HTTPS”로 설정합니다.
캐시 키 및 원본 요청에서는 recommended를 선택합니다.
”뷰어, 캐시 키 원본 요청”에서 설정한 내용으로 CI 진행 시 소스가 삭제가 되어도 클라이언트 쪽에서 인지를 못하게끔 진행되었습니다.
WAF 정책이 있으면 해당하는 정책을 지정하면 됩니다. SSL 역시 있으면 지정하면 됩니다.
대체 도메인 이름(CNAME)의 경우 설정하면 설정한 도메인으로 접속할 수 있습니다.
배포 후 배포 도메인 이름으로 접속하면 Access Denied가 나온다.
에러를 잡기 위해서 사용자 정의 오류 응답 생성을 진행합니다.
403, 404 Error Code에 대해서 추가하고 필요한 Error Code가 있다면 더 추가하면 됩니다.
이와 같이 셋팅을 하게되면 이미지처럼 S3로 다이렉트 접근은 차단이 되고, Cloudfront로 접근이 가능하게 설정됩니다.
CloudFront에서 제공되는 배포 도메인 이름을 CNAME으로 특정 URL로 지정하여 사용할 수 있습니다.
CloudFront → 배포 → 이름 → 편집 → 대체 도메인 이름 입력 후 저장
Route53에서 CNAME 값으로 CloudFront 배포 도메인 이름 지정
CloudFront 버전 관리 방법
설정된 기존 콘텐츠를 업데이트 하는 방법은 2가지가 있습니다.
- 동일한 이름을 사용하여 파일 업데이트
- 파일 이름에 버전 식별자를 사용하여 업데이트
동일한 이름의 기존 파일 업데이트
CloudFront 배포에서는 기존 파일을 업데이트하고 동일한 파일 이름을 사용할 수는 있지만 권장 하지않습니다.
파일 이름에 버전 식별자를 사용하여 업데이트
CloudFront 배포의 기존 파일을 업데이트할 경우
콘텐츠를 보다 잘 제어할 수 있도록 파일 이름 또는 디렉터리 이름에 일종의 버전 식별자를 포함하는 것이 좋습니다.
이 식별자는 날짜-타임스탬프, 일련 번호 또는 동일 객체의 두 버전을 식별하는 기타 방법이 될 수 있습니다.
Ex. 파일의 이름을 image.jpg → image_1.jpg라고 할 수 있습니다.
하지만 더 좋은 방법이 있습니다!
파일 무효화
* 를 사용한 파일 무효화 적용하는 방법
CloudFront 엣지 캐시에서 파일이 만료되기 전에 파일을 제거해야할 경우
- 엣지 캐시에서 파일을 무효화합니다. 최종 사용자가 파일을 요청하면 CloudFront는 최신 버전의 파일을 가져오도록 오리진에 반환합니다.
- 파일 버전 관리를 사용하여 서로 다른 이름을 가진 여러 버전의 파일을 제공합니다.
파일 무효화하려면 개별 파일에 대한 경로나 * 와일드카드로 끝나는 경로 중에 지정할 수 있습니다.
- /image/image1.jpg
- /images/image*
- /images/*
매월 특정 개수의 무효화 경로를 무료로 제출할 수 있습니다.
한 달에 할당된 개수의 무효화 경로를 초과하여 제출하는 경우, 제출한 무효화 경로 각각에 대해 요금을 지불합니다.
- 월별로 제출한 최초 1,000개의 무효화 경로에 대해서는 무료입니다.
- CloudFront가 수천 개의 파일을 무효화하더라도 * 와일드카드 수가 하나의 경로로 포함되는 경로입니다.
설정 방법
CloudFront에서 무효화 설정부분에서 진행하면 됩니다.
CI 에 적용 했을 때
Jenkinsfile 부분에 아래 내용을 추가해서 소스 빌드 후 S3 내용 삭제 & 업로드 하는 방식으로 처리했습니다.
pipeline {
...
stage('Deploy S3') {
steps {
withAWS(credentials: 'aws-credit', region: 'ap-northeast-2') {
s3Delete(bucket: 'hello.********', path: '/')
# default ACL : Private
s3Upload(bucket: 'hello.********', includePathPattern: '**/*', workingDir: 'build')
# CloudFront 배포 ID : E2JC7LGKH36M2D
cfInvalidate(distribution:'E2JC7LGKH36M2D', paths:['/*'])
}
}
}
...
}
마무리
이렇게 CloudFront 테스트를 해봤습니다.
여러 내용을 넣다보니 길어졌지만 중요한 내용을 꾹꾹 담아서 확인했습니다.
틀린 부분도 있을 수 있으니 알려주시면 확인해서 수정하도록 하겠습니다.
긴 내용 읽어주셔서 감사합니다. 다른 내용으로 다시 오겠습니다.

'AWS' 카테고리의 다른 글
CloudFront - (1) (0) | 2023.08.29 |
---|---|
IAM User 만들기 (0) | 2023.08.17 |
EC2로 웹 서버 구축하기 시리즈 - Terraform 편 (0) | 2023.08.16 |
EC2로 웹 서버 구축하기 시리즈 - Console 편 (0) | 2023.07.13 |