내 목표
도메인이 여러 개(예: 10개 또는 20개) 있는데 리디렉션하고 싶습니다.어느방문자어딘가에해당 페이지에서 다른 도메인의 한 페이지로 이동합니다(예: 내 stackoverflow.com 프로필 페이지).
여기에는 다음이 포함됩니다
http
(예http://mydomain01.com
: ) 을 사용하는 apex 도메인https
(예https://mydomain01.com
: ) 을 사용하는 apex 도메인http
(예:http://www.mydomain01.com
또는http://blog.mydomain01.com
) 을 사용하는 하위 도메인https
(예:https://www.mydomain01.com
또는https://blog.mydomain01.com
) 을 사용하는 하위 도메인- 모든 경로(예:
http://mydomain01.com/some_path
또는https://www.mydomain01.com/another/path.html
)
또한 다른 모든 도메인( mydomain02.com
, mydomain03.com
등, 각각 위의 사용 사례가 있음)에 대해서도 동일합니다.
내 연구
- 이 AWS 기사apex 도메인에서 다른 도메인으로 인터넷 트래픽을 리디렉션하는 방법을 설명합니다(내 사례 #1).여기에는 다음이 포함됩니다위 목록) 사용AWS S3그리고AWS 루트 53: 이 기능은 에서는 작동
http
하지만 에서는 작동하지 않습니다https
. - 이 AWS 기사여러 가지 경우에 대해 인터넷 트래픽을 리디렉션하는 방법을 설명합니다.여기에는 다음이 포함됩니다위 목록) 사용AWS S3,AWS 루트 53그리고AWS 클라우드프론트: 이는
http
및 에 모두 적용됩니다https
. (Application Load Balancer 사용에 대해서도 이야기하지만 여기서는 범위를 벗어나는 것 같습니다...) - 이 AWS 기사CloudFront 배포 설정 및 로그 파일에 대한 통찰력을 얻는 방법에 대한 자세한 내용을 추가합니다.
- 이 AWS 기사고급 조건부 리디렉션을 사용하기 위한 문서 리디렉션 규칙: 목표를 달성하기 위해 거기로 가야 하는지 확실하지 않아서 아직 자세히 살펴보지 않았습니다.
게다가 SO 질문도 분명히 많이 있습니다(참조:관련된이 질문의 오른쪽에 있음) 및 해당 주제에 대한 기타 게시물; 대부분의 문제는 이전 버전의 AWS 콘솔 UI의 스크린샷을 사용한다는 것입니다. 대부분의 내용은 여전히 동일해야 하지만 해당 스크린샷을 현재 UI IMO와 연관시키면 또 다른 혼란이 추가됩니다.
AWS(및 기타) 문서의 주요 내용은 다음과 같습니다.
- AWS S3에서 버킷을 생성하고 그 안에 리디렉션을 구성해야 합니다.
- AWS CloudFront에서 배포를 생성해야 합니다.
- CloudFront에서 사용자 지정 도메인을 사용하려면 AWS ACM에서 인증서를 생성해야 합니다.
- AWS Route 53에서 호스팅 영역을 생성하고 여기에 레코드를 구성해야 합니다.
지금까지 내 작업
최신 AWS CLI는 에서 설치 region
및 output
구성되며 , 자격 증명은 (모든 AWS 계정에 대해 각각) ~/.aws/config
에서 설정됩니다 .~/.aws/credentials
AWS_*
환경 변수에드 입니다 export
.
US East (N. Virginia) (us-east-1)
한 지역에서 AWS 리소스를 사용할 수 없어 발생하는 추가 문제를 방지하기 위해 모든 작업에 AWS 지역을 사용하고 있습니다 .
$ aws --version
aws-cli/2.2.23 Python/3.9.6 Darwin/19.6.0 source/x86_64 prompt/off
>
이 게시물에서 셸로 쉽게 복사할 수 있도록 셸 프롬프트나 셸 줄 연속 문자를 생략했습니다 .
S3 버킷 설정
경고:이렇게 하면 액세스 제한이 없는 "모든 공개" 버킷이 생성됩니다. 이 경우 보호할 버킷 콘텐츠가 없으므로 이는 문제가 되지 않지만 일반적으로 이러한 공개 버킷은 나쁜 습관입니다. 또한 액세스 제한으로 인해 발생하는 추가 문제를 방지하기 위해 공개 버킷을 사용하고 있습니다.먼저, 제대로 작동하도록 하세요. 둘째, 보안을 강화하라.
버킷 만들기
aws s3api create-bucket --bucket mydomain01.com
- 응답:
{
"Location": "/mydomain01.com"
}
리디렉션 설정
- AWS
put-bucket-website
문서 - 내 SO 프로필을 수정할 필요가 없습니다...
aws s3api put-bucket-website --bucket mydomain01.com --website-configuration \
'{ "RedirectAllRequestsTo": { "HostName": "stackoverflow.com/users/217844/ssc" } }'
- 응답 없음
알았어:S3 버킷 이름은 apex 도메인 이름과 일치해야 합니다.
버킷 이름을 사용했지만 mydomain01.com
(예를 들어) 원인에 대한 표시가 없으면 실패하는 것 같습니다. AWS 문서에서는 이를 명확하게 설명하지 않습니다. 사실 제가 여기서 뭔가를 크게 오해하고 있는지는 아직 잘 모르겠습니다. 하지만 제가 알 수 있는 바에 따르면 공식 AWS 문서는 실제로 이에 대해 다소 엉성합니다. - IMO - 중요한 요점 : 예를 들어,#2그냥 말한다
- 전역 고유 이름을 사용하여 S3 버킷을 생성합니다.
어느 것이 될 수 있는가어느전역적으로 고유한 이름입니다.#1어떤 식으로든 언급합니다. 일단 해당 비트를 읽는 방법을 알게 되면...
참고로, 그 기사 #2는 나를 계속 혼란스럽게 합니다.
맞춤 도메인을 사용하지 않는 경우...
내가 왜?~ 아니다맞춤 도메인을 사용 중이신가요?!? 요점은 내 사용자 정의 도메인을 리디렉션하는 것입니다. 그렇지 않나요?!? 뭐, 아무튼...
알았어:호스트 이름 앞에 프로토콜을 추가하면 안 됩니다.
AWS 콘솔이나 AWS CLI 모두 프로토콜( http://
또는 https://
)이 입력되었는지 테스트하지 않는 것 같습니다.호스트 이름UI 필드 / HostName
JSON 문자열로 전달됩니다. 그러나 앞에 하나가 추가되면 리디렉션이 실패합니다. 보다테스트 리디렉션아래에.
알았어:AWS S3 콘솔 UI 버그.
리디렉션이 설정된 후 AWS 콘솔은 UI에 버킷 URL( http://mydomain01.com.s3-website-us-east-1.amazonaws.com
)에 대한 클릭 가능한 링크를 버킷 맨 아래에 표시합니다.속성탭에서정적 웹사이트 호스팅부분.
해당 링크를 클릭하면 페이지가 열리지 않습니다. 이는 http://https//stackoverflow.com/users/217844/ssc/
프로토콜에 관계없이 AWS 콘솔이 URL을 엉망으로 만들고 열려고 시도하기 때문인 것 같습니다.
테스트 리디렉션
- 사용하여
HTTPie
요즘 멋진 아이들이 사용하는 것 같기 때문에curl
대신 껍질에wget
- 브라우저의 AWS 콘솔에서 셸로 링크를 복사합니다.
http http://mydomain01.com.s3-website-us-east-1.amazonaws.com/
HTTP/1.1 301 Moved Permanently
Content-Length: 0
Date: Mon, 02 Aug 2021 12:39:09 GMT
Location: http://stackoverflow.com/users/217844/ssc/
Server: AmazonS3
x-amz-id-2: rakAqUMnRraGvo/WkSa6AnbuhWn/9YZX/CAlI/OJQKYoWp/OdQIbyhsvHSwNved3suwMdgglqpE=
x-amz-request-id: C5BBG833Q9TQ9J6X
--> 작동하는 것 같습니다
- 프로토콜이 호스트 이름 앞에 잘못 추가된 경우 리디렉션을 테스트합니다. 깨진
Location
URL을 참고하세요:
http http://mydomain01.com.s3-website-us-east-1.amazonaws.com/
HTTP/1.1 301 Moved Permanently
Content-Length: 0
Date: Mon, 02 Aug 2021 12:52:10 GMT
Location: http://https://stackoverflow.com/users/217844/ssc/
Server: AmazonS3
x-amz-id-2: Ee2/ob0faTpRdp6mGITdmClozXNmF1Q2oTbPioms8O91VA8n5VA3MoHhveeFz7v2VS65YKFKlDA=
x-amz-request-id: ZJP653R50YD5HSRS
내 질문 #1
참고: 이 글을 쓰기 시작했을 때 이런 질문이 있었습니다. 나생각하다그 이후로 나는 그들에게 직접 대답할 수 있었습니다(참조테스트 www
하위 도메인 레코드아래에). 내가 틀렸다면 누군가 나를 정정해주세요.
- 큐:CloudFront를 사용하는 경우에도 "버킷 이름 == 도메인 이름" 요구 사항이 적용됩니까?
ㅏ:예. - 큐:apex 도메인과 모든 하위 도메인에 대해 각각 하나의 버킷을 생성해야 합니까? 그래서 내 예에서는
mydomain01.com
www.mydomain01.com
blog.mydomain01.com
?
ㅏ:예.
Route 53 호스팅 영역 설정
호스팅 영역 생성
- AWS Route 53
create-hosted-zone
문서 caller-reference
단순히 고유한 문자열이어야 합니다.
aws route53 create-hosted-zone --caller-reference "$(date '+%Y%m%d-%H%M%S')" --name mydomain01.com
- 응답
{
"Location": "https://route53.amazonaws.com/2013-04-01/hostedzone/Z123456789EXAMPLE0SKX",
"HostedZone": {
"Id": "/hostedzone/Z123456789EXAMPLE0SKX",
"Name": "mydomain01.com.",
"CallerReference": "20210802-150736",
"Config": {
"PrivateZone": false
},
"ResourceRecordSetCount": 2
},
"ChangeInfo": {
"Id": "/change/C1234567890SKXEXAMPLE",
"Status": "PENDING",
"SubmittedAt": "2021-08-02T13:07:37.860000+00:00"
},
"DelegationSet": {
"NameServers": [
"ns-1234.awsdns-12.com",
"ns-5678.awsdns-34.co.uk",
"ns-1234.awsdns-56.net",
"ns-5678.awsdns-78.org"
]
}
}
Z123456789EXAMPLE0SKX
다음 단계에 필요한 호스팅 영역 ID를 기록해 두십시오.
apex 도메인에 대한 레코드 생성
- AWS Route 53
change-resource-record-sets
문서 http
이 기능은 에서는 작동 하지만 에서는 작동하지 않습니다 .https
- 전달할 JSON은 다소 복잡합니다.
change-batch.apex.json
아래 내용으로 로컬 임시 파일을 만듭니다. - 값 을 얻
HostedZoneId
거나DNSName
Amazon S3 웹사이트 엔드포인트: 버킷이 에 생성되었으므로US East (N. Virginia)
다음을 사용하십시오.Z3AQBSTGFYJSTF
{
"Changes": [
{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "mydomain01.com.",
"Type": "A",
"AliasTarget": {
"HostedZoneId": "Z3AQBSTGFYJSTF",
"DNSName": "s3-website-us-east-1.amazonaws.com",
"EvaluateTargetHealth": false
}
}
}
]
}
알았어:s3-website-us-east-1.amazonaws.com
에는 그대로 사용해야 합니다 DNSName
.
example.com
AWS 문서는 or 등에 대해 온갖 곳에서 이야기합니다 example.com.s3-website-us-east-1.amazonaws.com
. 이 경우 이것은 자체 값(예: mydomain01.com.s3-website-us-east-1.amazonaws.com
)으로 대체할 수 있는 몇 가지 예는 아니지만,의 축어적 값테이블, 즉s3-website-us-east-1.amazonaws.com
.
알았어:호스트 이름 앞에 프로토콜을 추가하면 안 됩니다.
http://
위의 문제와 유사 하게 AWS 콘솔과 AWS CLI는 https://
모두호스트 이름UI 필드 / 로 DNSName
전달됨 적어도 이 모습은매우콘솔에서 잘못되었습니다. 예:http\072\057\057mydomain01.s3-website-us-east-1.amazonaws.com.
레코드가 생성되거나 편집될 때 드롭다운 상자에서 값을 선택할 수 있는 AWS 콘솔에서는 두 문제 모두 다소 완화되었습니다. AWS CLI를 사용할 때는 보내는 내용을 다시 확인해야 합니다.
동일한 문제 및 완화가 다음에도 적용됩니다.레코드 이름UI 필드/ Name
JSON 값.
apex 도메인에 대한 레코드를 생성합니다.
- 사용
jq
빠른 테스트를 위해 임시 파일에 유효한 json이 포함되어 있습니다.
jq . < change-batch.apex.json 1> /dev/null
- 출력 없음 -> 유효한 JSON
aws route53 change-resource-record-sets --hosted-zone-id Z123456789EXAMPLE0SKX \
--change-batch "file://$(pwd)/change-batch.apex.json"
- 응답
{
"ChangeInfo": {
"Id": "/change/C1234567890EXAMPLESKX",
"Status": "PENDING",
"SubmittedAt": "2021-08-02T14:20:09.370000+00:00"
}
}
Apex 도메인 레코드 테스트
- 시험
http
http http://mydomain01.com
HTTP/1.1 301 Moved Permanently
Content-Length: 0
Date: Mon, 02 Aug 2021 15:06:08 GMT
Location: http://stackoverflow.com/users/217844/ssc/
Server: AmazonS3
x-amz-id-2: EfDtCxif2iV4eInskirSBAOjQS7o9arzJCeZjscF6mW7cwwmm9Nxb7QJT50x2kjdslX2fOxA+lk=
x-amz-request-id: WM7K9TDEF75A6P1V
--> 좋아 보인다
http
경로로 테스트
http http://mydomain01.com/some/path
... similar output as above ...
- 시험
https
http https://mydomain01.com
http: error: ConnectionError: HTTPSConnectionPool(host='mydomain01.com', port=443):
Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x101a48100>:
Failed to establish a new connection: [Errno 60] Operation timed out')) while doing a GET request to URL: https://mydomain01.com/
- (가독성을 위해 응답을 래핑했습니다)
--> 시간 초과(60초 후?) - 예상대로: S3 버킷을 사용한 리디렉션이 작동하지 않습니다 https
(위 참조).
알았어:DNS 변경 전파 지연.
AWS와 구글은매우DNS 설정에 대한 변경 사항을 전파하는 측면에서 빠르지만(초 또는 분 단위로) 다른 "느린" 이름 서버가 관련될 수 있습니다. 설명된 대로 우회하세요.여기혼란의 원인을 없애기 위해. 이 접근 방식은 macOS에서만 작동하지만 개념은 모든 OS에서 동일합니다.
알았어:브라우저 캐시.
셸이 아닌 브라우저에서 DNS 변경 사항을 테스트할 때 브라우저는 캐시에서 결과를 얻을 수 있습니다. 저는 대부분의 작업을 Chrome을 사용하여 수행하지만 테스트에는 Firefox(또는 Safari)를 사용하므로 모든 테스트 전에 전체 캐시를 지워 Google, AWS 등에서 로그아웃하지 않고도 잠재적인 문제를 제거할 수 있습니다.
www
하위 도메인 에 대한 레코드 생성
- 유일한 차이점은
Name
JSON 값 입니다
sed -e 's|mydomain01.com.|www.mydomain01.com.|g' change-batch.apex.json > change-batch.www.json
aws route53 change-resource-record-sets --hosted-zone-id Z123456789EXAMPLE0SKX \
--change-batch "file://$(pwd)/change-batch.www.json
- 위와 비슷한 반응
테스트 www
하위 도메인 레코드
- 시험
http
http http://www.mydomain01.com
HTTP/1.1 404 Not Found
Content-Length: 363
Content-Type: text/html; charset=utf-8
Date: Mon, 02 Aug 2021 15:28:05 GMT
Server: AmazonS3
x-amz-id-2: MGLcynq1iEGKh+pT6N6iRpCuQSN243q/5zm2Y7rXTnM7iW9nvDokF6s20xEUBr7QiEtBPEzZmII=
x-amz-request-id: TK83G35EMYFR8SKX
<html>
<head><title>404 Not Found</title></head>
<body>
<h1>404 Not Found</h1>
<ul>
<li>Code: NoSuchBucket</li>
<li>Message: The specified bucket does not exist</li>
<li>BucketName: www.mydomain01.com</li>
<li>RequestId: TK83G35EMYFR8SKX</li>
<li>HostId: MGLcynq1iEGKh+pT6N6iRpCuQSN243q/5zm2Y7rXTnM7iW9nvDokF6s20xEUBr7QiEtBPEzZmII=</li>
</ul>
<hr/>
</body>
</html>
- 내 생각엔 그게 두 번째에 대한 답인 것 같아내 질문 #1위: 전달하려면 apex/하위 도메인당 하나의 S3 버킷이 필요합니다.
CloudFront 배포 설정
- 참고: AWS 콘솔을 사용하면 정말 쉽게인증서를 요청하다DNS를 사용하여 유효성을 검사합니다.
인증서를 생성하다
- AWS ACM
request-certificate
문서 - 인증서는 apex 및 모든 하위 도메인에 대해 작동해야 하므로이 인증서에 다른 이름을 추가하세요/ 통과하다
--subject-alternative-names
; 보다이 AWS 기사(상단 파란색 상자). *.mydomain01.com
쉘이 해석하지 않도록 주위에 따옴표를 추가하십시오.*
aws acm request-certificate --domain-name mydomain01.com --validation-method DNS \
--subject-alternative-names '*.mydomain01.com'
- 응답:
{
"CertificateArn": "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab"
}
123456789012
내 AWS 계정 ID입니다. 그 이후의 모든 것은certificate/
단지 UUID일 뿐입니다
인증서 세부정보 가져오기
- AWS ACM
describe-certificate
문서 - 임시 로컬 파일에 응답을 저장합니다. 추출
ResourceRecord.Name
하여ResourceRecord.Value
사용jq
- 내가 소유하고 있음을 증명하는 AWS Route 53 기록에 필요합니다.
mydomain01.com
- 또는
--query
매개변수를 사용하여aws acm describe-certificate
aws acm describe-certificate \
--certificate-arn "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab" \
> describe-certificate.json
jq -r '.Certificate.DomainValidationOptions[0].ResourceRecord.Name' describe-certificate.json
_1234567890abcdef1234567890abcdef.mydomain01.com.
jq -r '.Certificate.DomainValidationOptions[0].ResourceRecord.Value' describe-certificate.json
_1234567890abcdef1234567890abcdef.weirdchars.acm-validations.aws.
인증서 검증을 위해 Route 53 레코드 생성
- AWS ACM에서 자동으로 확인하고 이 레코드가 발견되면 인증서가 검증됩니다.
- 이전과 마찬가지로 임시 로컬 파일을 사용합니다
change-batch.cert.json
. 예를 참조하세요.apex 도메인에 대한 레코드 생성; 내용물:
{
"Changes": [
{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "_1234567890abcdef1234567890abcdef.mydomain01.com.",
"Type": "CNAME",
"TTL": 300,
"ResourceRecords": [
{
"Value": "_1234567890abcdef1234567890abcdef.weirdchars.acm-validations.aws."
}
]
}
}
]
}
- 쉘 명령:
aws route53 change-resource-record-sets --hosted-zone-id Z123456789EXAMPLE0SKX \
--change-batch "file://$(pwd)/change-batch.cert.json
- 위의 레코드를 생성할 때와 유사한 응답
- 참고: ACM이 인증서를 검증하는 데 몇 분 정도 걸릴 수 있습니다.
CloudFront 배포판 생성
- AWS CloudFront
create-distribution
문서 - 다시 말하지만,
CallerReference
단순히 고유한 문자열이어야 합니다. 예를 들어date '+%Y%m%d-%H%M%S'
쉘에서 파일을 생성하고 복사하는 데 사용합니다 . 보다호스팅 영역 생성 create-distribution.json
이전과 마찬가지로 복잡한 값에는 임시 로컬 파일을 사용합니다 . 아래 내용MinimumProtocolVersion
: 값을 얻다이 AWS 기사OriginProtocolPolicy
:http-only
원본(S3 버킷)에서만 수행할 수 있으므로 사용합니다.http
ViewerProtocolPolicy
:redirect-to-https
이 배포판을 만드는 전체 요점은 에서http
다음 으로 리디렉션하는 것입니다.https
- 참고: 어떤 필드가 필수인지는 모르겠습니다(AWS 문서에서는 알려주지 않습니다). AWS CLI 명령은 전송된 데이터에 누락되거나 잘못된 내용이 있는 경우 명확하고 자세한 메시지를 표시합니다.
{
"CallerReference": "20210802-191725",
"Aliases": {
"Quantity": 2,
"Items": ["mydomain01.com", "*.mydomain01.com"]
},
"Origins": {
"Quantity": 1,
"Items": [
{
"Id": "mydomain01.com.s3.us-east-1.amazonaws.com_20210802-191725",
"DomainName": "mydomain01.com.s3.us-east-1.amazonaws.com",
"CustomOriginConfig": {
"HTTPPort": 80,
"HTTPSPort": 443,
"OriginProtocolPolicy": "http-only"
}
}
]
},
"OriginGroups": {
"Quantity": 0
},
"DefaultCacheBehavior": {
"TargetOriginId": "mydomain01.com.s3.us-east-1.amazonaws.com_20210802-191725",
"ForwardedValues": {
"QueryString": false,
"Cookies": {
"Forward": "none"
},
"Headers": {
"Quantity": 0
},
"QueryStringCacheKeys": {
"Quantity": 0
}
},
"TrustedSigners": {
"Enabled": false,
"Quantity": 0
},
"ViewerProtocolPolicy": "redirect-to-https",
"MinTTL": 0,
"AllowedMethods": {
"Quantity": 2,
"Items": [
"HEAD",
"GET"
],
"CachedMethods": {
"Quantity": 2,
"Items": [
"HEAD",
"GET"
]
}
},
"SmoothStreaming": false,
"DefaultTTL": 86400,
"MaxTTL": 31536000,
"Compress": false,
"LambdaFunctionAssociations": {
"Quantity": 0
},
"FieldLevelEncryptionId": ""
},
"CacheBehaviors": {
"Quantity": 0
},
"CustomErrorResponses": {
"Quantity": 0
},
"Comment": "",
"Logging": {
"Enabled": false,
"IncludeCookies": false,
"Bucket": "",
"Prefix": ""
},
"PriceClass": "PriceClass_All",
"Enabled": true,
"ViewerCertificate": {
"ACMCertificateArn": "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab",
"MinimumProtocolVersion": "TLSv1.2_2021",
"SSLSupportMethod": "sni-only"
},
"Restrictions": {
"GeoRestriction": {
"RestrictionType": "none",
"Quantity": 0
}
},
"WebACLId": "",
"HttpVersion": "http2",
"IsIPV6Enabled": true
}
- 쉘 명령:
- 참고:
--no-cli-pager
페이징을 비활성화하고 검사를 위해 임시 로컬 파일에 응답을 저장하려면 추가하세요.
aws --no-cli-pager cloudfront create-distribution \
--distribution-config "file://$(pwd)/create-distribution.json"
> create-distribution.response.json
- 응답: 대규모 JSON 구조, 대부분 일부 배포 메타 정보와 함께 전송된 구성
알았어:CloudFront 배포는 배포하는 데 약간의 시간이 걸립니다.
에서배포판개요에는최종 수정됨다음과 같은 필드배포 중모든 변경 후 잠시 동안; 화면 및 브라우저 창 너비에 따라 이 필드가 숨겨질 수 있으므로 UI는 배포가 실행 중인 것처럼 보일 수 있지만 실제로는 그렇지 않습니다.
테스트 배포
DomainName
응답에서 가져오기
jq -r '.Distribution.DomainName' create-distribution.response.json
abcdefghij1234.cloudfront.net
- 시험
http
http http://abcdefghij1234.cloudfront.net
HTTP/1.1 301 Moved Permanently
Connection: keep-alive
Content-Length: 183
Content-Type: text/html
Date: Mon, 02 Aug 2021 20:14:27 GMT
Location: https://abcdefghij1234.cloudfront.net/
Server: CloudFront
Via: 1.1 8640a37b586353bc916562c577770223.cloudfront.net (CloudFront)
X-Amz-Cf-Id: ooT0Y1QvDE7_yoRmb0p0Un2Db6O713rBvudtmz1xer7YwEU0GE8smw==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: Redirect from cloudfront
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>CloudFront</center>
</body>
</html>
따라서 배포판은 예상대로 에서 - http://abcdefghij1234.cloudfront.net
로 리디렉션됩니다. https://abcdefghij1234.cloudfront.net
그것이 바로 그것이 만들어진 이유입니다.
- 시험
https
HTTP/1.1 403 Forbidden
Connection: keep-alive
Content-Type: application/xml
Date: Mon, 02 Aug 2021 20:14:35 GMT
Server: AmazonS3
Transfer-Encoding: chunked
Via: 1.1 c3e656776c8a9f0e1ea24405ab1dcc85.cloudfront.net (CloudFront)
X-Amz-Cf-Id: or4SC8urWEv_8c3jDURv5IINwFU1TDVLSQ3_X7tya7Ncz8ujyz0-IQ==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: Error from cloudfront
x-amz-bucket-region: us-east-1
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>EAST1CM5WJR8QM3S</RequestId>
<HostId>zF2dJm2vsuSM633NHuzcA5VqrCrNkfYGu31FRmKKIkebuI5+6l5DlVnr4kk9be262hcqktoiROw=</HostId>
</Error>
- (가독성을 위해 XML 형식으로 지정)
좋지 않은 것 같습니다. 그것이 예상되는지 확실하지 않습니까?!?
AWS Route 53 레코드 업데이트
- S3 버킷 사용에서 CloudFront 배포 사용으로 변경
- 이전과 마찬가지로 이전 파일을 입력
change-batch.apex.updatejson
하여 임시 로컬 파일을 만듭니다.sed
change-batch.apex.json
UPSERT
대신 사용CREATE
: 레코드가 이미 존재하므로 업데이트해야 합니다.HostedZoneId
: 이전 값Z3AQBSTGFYJSTF
(S3의 경우)을 다음Z2FDTNDATAQYW2
에서 가져온 일부 마법 값 으로 바꿉니다.change-resource-record-sets
문서DNSName
: 인용문change-resource-record-sets
문서
배포를 생성할 때 CloudFront에서 할당한 도메인 이름을 지정합니다.
CloudFront 배포에는 리소스 레코드 세트의 이름과 일치하는 대체 도메인 이름이 포함되어야 합니다. 예를 들어 리소스 레코드 세트의 이름이 acme.example.com인 경우 CloudFront 배포에는 대체 도메인 이름 중 하나로 acme.example.com이 포함되어야 합니다.
--> s3-website-us-east-1.amazonaws.com
(S3의 경우) 다음으로 교체 abcdefghij1234.cloudfront.net
:
sed -e 's|CREATE|UPSERT|g' \
-e 's|Z3AQBSTGFYJSTF|Z2FDTNDATAQYW2|g' \
-e 's|s3-website-us-east-1.amazonaws.com|abcdefghij1234.cloudfront.net|g' \
change-batch.apex.json > change-batch.apex.update.json
- 파일 내용:
{
"Changes": [
{
"Action": "UPSERT",
"ResourceRecordSet": {
"Name": "mydomain01.com.",
"Type": "A",
"AliasTarget": {
"HostedZoneId": "Z2FDTNDATAQYW2",
"DNSName": "abcdefghij1234.cloudfront.net",
"EvaluateTargetHealth": false
}
}
}
]
}
- 쉘 명령
aws route53 change-resource-record-sets \
--hosted-zone-id Z123456789EXAMPLE0SKX \
--change-batch "file://$(pwd)/change-batch.apex.update.json"
- 위의 레코드를 생성할 때와 유사한 응답
Apex 도메인 레코드 테스트
- 시험
http
http http://mydomain01.com
HTTP/1.1 301 Moved Permanently
Connection: keep-alive
Content-Length: 183
Content-Type: text/html
Date: Mon, 02 Aug 2021 19:08:27 GMT
Location: https://mydomain01.com/
Server: CloudFront
Via: 1.1 2408979685aa1bdb752824d292e63bf7.cloudfront.net (CloudFront)
X-Amz-Cf-Id: Ww60Ol_0fdR8SsgcHeRYUd_de1rVejX6w_wuK80aR21e3IHstB-irA==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: Redirect from cloudfront
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>CloudFront</center>
</body>
</html>
- 이제 응답은 CloudFront에서 오고 더 이상 S3에서 나오지 않으므로 업데이트된 DNS 레코드가 작동하는 것 같습니다 :-)
http
경로로 테스트
http http://mydomain01.com/some/path
... similar output as above ...
--> 좋아 보인다
- 시험
https
http https://mydomain01.com
HTTP/1.1 403 Forbidden
Connection: keep-alive
Content-Type: application/xml
Date: Mon, 02 Aug 2021 18:53:51 GMT
Server: AmazonS3
Transfer-Encoding: chunked
Via: 1.1 ea89c67081222c8c680e7a37ad75f4f0.cloudfront.net (CloudFront)
X-Amz-Cf-Id: 5prv5_g5zXOX3aRBp2Gq64JJPuwC2o5dHIp9RCAHm6Ls8hK6EFghXw==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: Error from cloudfront
x-amz-bucket-region: us-east-1
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>T78ASF3FA9QGV4T5</RequestId>
<HostId>xaEgwEtbeesL4XfxMdxVoPAt9Lpb1ZDM9Fs5W4htBbcWNbV9sMUTjVAPIuWwAQ3Xh1yRhh4b4Ts=</HostId>
</Error>
- (이전과 마찬가지로 가독성을 위해 xml 형식으로 지정)
참고: 이 응답은 이전 응답이 AmazonS3
아닌 에서 제공됩니다. CloudFront
S3 버킷에는 액세스 제한이 전혀 없습니다. 그런데 어떻게접근 불가?!?
버킷 권한을 다시 확인하세요.
aws s3api get-bucket-policy --bucket mydomain01.com
An error occurred (NoSuchBucketPolicy) when calling the GetBucketPolicy operation: The bucket policy does not exist
비어있는 것과 일치합니다.버킷 정책필드 - 그런데 버킷 정책이 전혀 없어도 정말 괜찮을까요?!?
이제 되돌아보면테스트 배포위에서 직접 액세스에 대한 응답 abcdefghij1234.cloudfront.net
도 CloudFront가 아닌 S3에서 나오는 것을 볼 수 있으므로 문제는 매우 명확해 보입니다.
내 질문 #2
- S3 버킷이 액세스를 거부하는 이유는 무엇입니까?
- S3 버킷에 액세스 정책이 전혀 없는 것이 정상입니까? 일반적으로 누구에게나 명시적으로 액세스를 허용하는 정책인 "공용" 버킷이 없습니까?
- 비슷하다apex/하위 도메인당 하나의 S3 버킷, apex/하위 도메인당 하나의 CloudFront 배포도 필요합니까?
- 그렇다면
*.mydomain01.com
인증서(및 배포)에 대체 도메인을 추가하는 것은 실제로 의미가 없는 것 같습니다. 그렇죠?!? 또한 하나의 도메인 전용으로 배포당 하나의 인증서가 필요합니다. 맞나요?
답변1
당신은 일반적으로 올바른 길을 가고 있습니다. 한 가지 설명: 도메인이 이미 다른 DNS 서비스 공급자를 사용하는 경우 Route53을 생략할 수 있습니다.
Q: CloudFront를 사용하는 경우에도 "버킷 이름 == 도메인 이름" 요구 사항이 적용됩니까?
아니요, CloudFront를 사용하는 경우에는 가능합니다. CNAME은 CloudFront에서 별도로 구성됩니다.
Q: apex 도메인과 모든 하위 도메인에 대해 각각 하나의 버킷을 생성해야 합니까?
아니요, 도메인/하위 도메인당 하나의 버킷이 필요하지 않습니다.
S3 버킷이 액세스를 거부하는 이유는 무엇입니까?
s3-website-us-east-1.amazonaws.com
도메인을 CF 원본으로 사용해야 합니다 .
S3 버킷에 액세스 정책이 전혀 없는 것이 정상입니까? 일반적으로 누구에게나 명시적으로 액세스를 허용하는 정책인 "공용" 버킷이 없습니까?
버킷을 트래픽 리디렉션에만 사용하는 경우 액세스 정책이 없어도 괜찮습니다.
apex/하위 도메인당 하나의 S3 버킷과 마찬가지로 apex/하위 도메인당 하나의 CloudFront 배포도 필요합니까?
예. 하나의 배포가 최대 하나의 ACM 인증서를 연결할 수 있으므로 도메인/하위 도메인당 하나의 CloudFront 배포가 필요합니다.
그렇다면
*.mydomain01.com
인증서(및 배포)에 대체 도메인을 추가하는 것은 실제로 의미가 없는 것 같습니다. 그렇죠?!? 또한 하나의 도메인 전용으로 배포당 하나의 인증서가 필요합니다. 맞나요?
CF 배포는 하위 도메인 트래픽도 처리해야 하므로 와일드카드 도메인을 추가하는 것이 합리적입니다.
더 궁금하신 사항이 있으시면 참여해주세요AWS 채팅그리고 채팅에 @나.