두 개의 AWS 계정을 사용하는 크로스 계정 환경에서, CloudFront와 ACM 인증서를 서비스 계정(B계정)에 배치하고 S3 정적 리소스는 별도 계정(A계정)에 유지하는 구성 방법을 다룹니다.
/data/* → S3 (정적), /* → ALB (동적)| 구분 | 리소스 |
|---|---|
| A계정 (스토리지) | S3 버킷 |
| B계정 (서비스) | Route 53, ACM 인증서, CloudFront, ALB, EC2 |

| 단계 | 계정 | 작업 |
|---|---|---|
| 1 | B계정 | ACM 인증서 발급 (us-east-1) |
| 2 | B계정 | CloudFront 배포 생성 |
| 3 | A계정 | S3 버킷 정책에 B계정 CloudFront 허용 추가 |
| 4 | B계정 | Route 53 레코드를 새 CloudFront로 변경 |
중요: CloudFront용 인증서는 반드시 us-east-1 (버지니아 북부) 리전에서 발급해야 합니다.
CloudFront 생성 마법사에서 인증서를 요청하면 Route 53 DNS 검증까지 자동으로 완료됩니다.

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

Route 53에서 DNS 검증 레코드 자동 생성
발급된 인증서 정보:
| 항목 | 값 |
|---|---|
| 인증서 ID | 9af52753-783b-488a-8c61-f03408a680cc |
| 도메인 | testfdk.shop, *.testfdk.shop |
| ARN | arn:aws:acm:us-east-1:5***********:certificate/9af52753-783b-488a-8c61-f03408a680cc |
| 상태 | 발급됨 |

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

도메인 설정 - testfdk.shop 입력

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

S3 Origin 설정 - A계정의 S3 버킷 도메인 입력
중요: Cross-Account S3 접근 시 "Allow private S3 bucket access to CloudFront" 옵션을 체크해야 합니다.

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

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

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

배포 최종 검토 - Review and Create
⚠️ 주의: (아래의 스크린샷은 잘못 찍은 상태 '대체 도메인 이름'이 *.testfdk.shop 이 되어야 합니다.)

배포 생성 완료 - S3 버킷 정책 업데이트 필요 경고 표시
생성된 배포 정보:
| 항목 | 값 |
|---|---|
| Distribution ID | E3KAADYTXVFCY2 |
| Domain Name | d29rs9rwfr6bi2.cloudfront.net |
| 대체 도메인 | \*.testfdk.shop, testfdk.shop |
| ARN | arn:aws:cloudfront::5***********:distribution/E3KAADYTXVFCY2 |
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"
}
}
}
]
}
B계정 Route 53에서 *.testfdk.shop 레코드를 CloudFront 배포로 연결합니다.
⚠️ 주의: (아래의 스크린샷은 '레코드 이름'을 잘못 찍은 상태)

Route 53 레코드 설정 - CloudFront d29rs9rwfr6bi2.cloudfront.net 연결
설정 내용:
| 레코드 | 유형 | 대상 |
|---|---|---|
| *.testfdk.shop | A (Alias) | d29rs9rwfr6bi2.cloudfront.net (B계정 CloudFront) |
B계정 CloudFront에 접속 시 403 Forbidden 오류가 발생했습니다.
CloudFront 배포를 S3 Origin만으로 생성했기 때문에, 루트 경로(/)로 접근하면 S3에서 해당 객체를 찾을 수 없어 403이 반환되었습니다.

B계정 CloudFront - Origins (1개): S3만 설정된 상태
원인: CloudFront에 ALB Origin이 없어 동적 콘텐츠(루트 경로 등)를 처리할 수 없음

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

Origin 설정 상세 - HTTPS port 443, TLSv1.2
⚠️ 주의: 처음에 "HTTPS만 해당"을 선택했으나, ALB가 HTTP만 리스닝하여 504 Gateway Timeout 오류가 발생했습니다.

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

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

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

새 Behavior 생성 - /data/ → S3 Origin*
| Origin | 도메인 | 프로토콜 |
|---|---|---|
| ALB | crossaccount-alb-1795975996.us-east-1.elb.amazonaws.com | HTTP |
| S3 | crossaccount-cdn-static-1***.s3.ap-northeast-2.amazonaws.com | HTTPS |
| 우선순위 | 경로 패턴 | Origin | 설명 |
|---|---|---|---|
| 0 | /data/* | S3 | 정적 파일 |
| 1 | 기본값(*) | ALB | 동적 콘텐츠 |
| 리소스 | 계정 | 식별자 |
|---|---|---|
| S3 버킷 | A (1***) | crossaccount-cdn-static-1*** |
| CloudFront | B (5***) | E3KAADYTXVFCY2 |
| ACM 인증서 | B (5***) | 9af52753-783b-488a-8c61-f03408a680cc |
| Route 53 | B (5***) | testfdk.shop 호스팅 영역 |