CloudFront와 S3를 분리 계정으로 운영하는 크로스 계정 구성

이건선·2026년 2월 21일

해결

목록 보기
61/66

개요

두 개의 AWS 계정을 사용하는 크로스 계정 환경에서, CloudFront와 ACM 인증서를 서비스 계정(B계정)에 배치하고 S3 정적 리소스는 별도 계정(A계정)에 유지하는 구성 방법을 다룹니다.

구성 목표

  • CloudFront + ACM 인증서를 서비스 계정(B계정)에서 통합 관리
  • 경로 기반 라우팅: /data/* → S3 (정적), /* → ALB (동적)
  • 크로스 계정 S3 접근: B계정 CloudFront가 A계정 S3 버킷에 접근

계정 구성

구분리소스
A계정 (스토리지)S3 버킷
B계정 (서비스)Route 53, ACM 인증서, CloudFront, ALB, EC2

최종 아키텍처

필요한 단계

단계계정작업
1B계정ACM 인증서 발급 (us-east-1)
2B계정CloudFront 배포 생성
3A계정S3 버킷 정책에 B계정 CloudFront 허용 추가
4B계정Route 53 레코드를 새 CloudFront로 변경

1단계: B계정 ACM 인증서 발급

중요: CloudFront용 인증서는 반드시 us-east-1 (버지니아 북부) 리전에서 발급해야 합니다.

CloudFront 생성 마법사에서 인증서를 요청하면 Route 53 DNS 검증까지 자동으로 완료됩니다.

ACM 인증서 요청 - 검증 대기 중 상태

Route 53에서 DNS 검증 레코드 자동 생성

발급된 인증서 정보:

항목
인증서 ID9af52753-783b-488a-8c61-f03408a680cc
도메인testfdk.shop, *.testfdk.shop
ARNarn:aws:acm:us-east-1:5***********:certificate/9af52753-783b-488a-8c61-f03408a680cc
상태발급됨

2단계: B계정 CloudFront 배포 생성

2.1 배포 기본 정보 설정

CloudFront 배포 생성 - Distribution name: CrossAccount-CDN-B

도메인 설정 - testfdk.shop 입력

Route 53 도메인 확인 - "Domain managed by Route 53"

2.2 S3 Origin 설정 (Cross-Account)

S3 Origin 설정 - A계정의 S3 버킷 도메인 입력

중요: Cross-Account S3 접근 시 "Allow private S3 bucket access to CloudFront" 옵션을 체크해야 합니다.

2.3 TLS 인증서 설정

TLS 인증서 필요 경고 - us-east-1에 ACM 인증서 없음

Wildcard 인증서 생성 선택 - .testfdk.shop*

ACM 인증서 생성 성공 - testfdk.shop, *.testfdk.shop

2.4 배포 생성 완료

배포 최종 검토 - Review and Create

⚠️ 주의: (아래의 스크린샷은 잘못 찍은 상태 '대체 도메인 이름'이 *.testfdk.shop 이 되어야 합니다.)

배포 생성 완료 - S3 버킷 정책 업데이트 필요 경고 표시

생성된 배포 정보:

항목
Distribution IDE3KAADYTXVFCY2
Domain Named29rs9rwfr6bi2.cloudfront.net
대체 도메인\*.testfdk.shop, testfdk.shop
ARNarn:aws:cloudfront::5***********:distribution/E3KAADYTXVFCY2

3단계: A계정 S3 버킷 정책 업데이트

B계정 CloudFront가 A계정 S3에 접근할 수 있도록 버킷 정책을 업데이트합니다.

A계정 S3 버킷 권한 탭 - 퍼블릭 액세스 차단 설정

버킷 정책 설정 완료 - B계정 CloudFront(E3KAADYTXVFCY2) 허용

버킷 정책 (B계정 CloudFront 접근 허용):

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "AllowCloudFrontServicePrincipalBAccount",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudfront.amazonaws.com"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::crossaccount-cdn-static-1***********/*",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceArn": "arn:aws:cloudfront::5***********:distribution/E3KAADYTXVFCY2"
                }
            }
        }
    ]
}

4단계: Route 53 레코드 설정

B계정 Route 53에서 *.testfdk.shop 레코드를 CloudFront 배포로 연결합니다.

⚠️ 주의: (아래의 스크린샷은 '레코드 이름'을 잘못 찍은 상태)

Route 53 레코드 설정 - CloudFront d29rs9rwfr6bi2.cloudfront.net 연결

설정 내용:

레코드유형대상
*.testfdk.shopA (Alias)d29rs9rwfr6bi2.cloudfront.net (B계정 CloudFront)

트러블슈팅: Origin 구조 문제

문제 발견

B계정 CloudFront에 접속 시 403 Forbidden 오류가 발생했습니다.

CloudFront 배포를 S3 Origin만으로 생성했기 때문에, 루트 경로(/)로 접근하면 S3에서 해당 객체를 찾을 수 없어 403이 반환되었습니다.

B계정 CloudFront - Origins (1개): S3만 설정된 상태

원인: CloudFront에 ALB Origin이 없어 동적 콘텐츠(루트 경로 등)를 처리할 수 없음


해결: ALB Origin 추가 및 Behavior 설정

6.1 ALB Origin 추가

ALB Origin 추가 - HTTPS만 해당 선택 (⚠️ 문제 발생)

Origin 설정 상세 - HTTPS port 443, TLSv1.2

⚠️ 주의: 처음에 "HTTPS만 해당"을 선택했으나, ALB가 HTTP만 리스닝하여 504 Gateway Timeout 오류가 발생했습니다.

6.2 Default Behavior를 ALB로 변경

Behavior 탭 - 기본값(*) Origin 확인

Behavior 편집 - Default → ALB Origin으로 변경

6.3 Origin 프로토콜 수정 (504 해결)

ALB Origin 프로토콜 수정 - HTTP만 해당, port 80

6.4 /data/* Behavior 추가 (S3용)

새 Behavior 생성 - /data/ → S3 Origin*


최종 구성

B계정 CloudFront Origins (2개)

Origin도메인프로토콜
ALBcrossaccount-alb-1795975996.us-east-1.elb.amazonaws.comHTTP
S3crossaccount-cdn-static-1***.s3.ap-northeast-2.amazonaws.comHTTPS

B계정 CloudFront Behaviors (2개)

우선순위경로 패턴Origin설명
0/data/*S3정적 파일
1기본값(*)ALB동적 콘텐츠

최종 리소스 상태

리소스계정식별자
S3 버킷A (1***)crossaccount-cdn-static-1***
CloudFrontB (5***)E3KAADYTXVFCY2
ACM 인증서B (5***)9af52753-783b-488a-8c61-f03408a680cc
Route 53B (5***)testfdk.shop 호스팅 영역
profile
멋지게 기록하자

0개의 댓글