Amazon S3를 사용하여 API Gateway를 프록시로 사용하는 정적 웹 사이트를 호스팅하려면 어떻게 해야 합니까?
Amazon API Gateway를 사용하여 API를 정적 웹 사이트의 프록시로 생성하고 싶습니다. 그런 다음 Amazon Simple Storage Service(Amazon S3)에서 웹 사이트를 호스팅하고 싶습니다.
해결 방법
Amazon S3를 사용하여 API Gateway를 프록시로 사용하는 정적 웹 사이트를 호스팅하려면 HTTP 통합 또는 AWS 서비스 통합을 사용하십시오.
HTTP 통합 사용
정적 웹 사이트에 공개적으로 액세스할 수 있는 경우 HTTP 통합을 사용하여 API에 대한 Amazon S3 정적 웹 사이트 URL을 제공하십시오.
Amazon S3에서 정적 웹 사이트를 구성합니다. 그런 다음, API Gateway 콘솔을 사용하여 루트 리소스에 대한 REST API와 메서드를 생성하고 REST API를 배포합니다.
REST API 생성
다음 단계를 완료하십시오.
- API Gateway 콘솔을 엽니다.
- API 생성을 선택합니다.
- REST API에서 빌드를 선택합니다.
- API 이름에 REST API의 이름을 입력합니다.
- API 엔드포인트 유형 드롭다운 목록에서 해당 엔드포인트 유형을 선택한 다음 API 생성을 선택합니다.
- 탐색 창에서 API 이름 아래의 리소스를 선택합니다.
- 리소스 생성을 선택합니다.
- 리소스 경로에서 **/**로 유지합니다.
- 리소스 이름에 이름을 입력합니다. 예: key.
- 리소스 생성을 선택합니다.
루트 리소스에 대한 메서드 생성
다음 단계를 완료하십시오.
- 리소스에서 생성한 리소스를 선택합니다. 예: /key.
- 메서드에서 메서드 생성을 선택합니다.
- 메서드 유형 드롭다운 목록에서 GET를 선택합니다.
- 통합 유형에서 HTTP를 선택합니다.
- HTTP 프록시 통합을 선택합니다.
- HTTP 메서드 드롭다운 목록에서 GET를 선택합니다.
- 엔드포인트 URL에 http://BUCKET_NAME.s3-website.REGION.amazonaws.com/key를 입력합니다.<br id=hardline_break/> 참고: BUCKET_NAME을 버킷 이름으로, REGION을 버킷의 리전으로, key를 리소스 이름으로 바꾸십시오.
- 메서드 생성을 선택합니다.
REST API 배포
다음 단계를 완료하십시오.
- API 배포를 선택합니다.
- 스테이지 드롭다운 목록에서 *새 스테이지*를 선택합니다.
- 스테이지 이름에 이름을 입력합니다. 예: STAGE_NAME.
- 배포를 선택합니다.
- 스테이지 세부 정보에서 API를 테스트하기 위한 호출 URL을 기록해 둡니다.
- S3 웹 사이트의 API 프록시를 테스트하려면 다음 curl 명령을 실행합니다.
참고: API_ID를 해당 API ID로, REGION을 해당 리전으로, STAGE_NAME을 해당 스테이지 이름으로 바꾸십시오.curl -X GET https://API_ID.execute-api.REGION.amazonaws.com/STAGE_NAME/index.html
AWS 서비스 통합 사용
S3 정적 웹 사이트 구성
S3 정적 웹 사이트의 퍼블릭 액세스가 차단된 경우 API 프록시에서만 액세스할 수 있도록 웹 사이트를 구성합니다.
다음 단계를 완료하십시오.
- Amazon S3에서 정적 웹 사이트를 구성합니다.<br id=hardline_break/> 참고: 정적 웹 사이트를 구성할 때는 3단계: 퍼블릭 액세스 차단 설정 편집 섹션을 건너뛰십시오. 기본값인 모든 퍼블릭 액세스 차단 설정을 활성 상태로 유지합니다.
- API 프록시가 S3 버킷에만 액세스할 수 있도록 버킷 콘텐츠를 공개적으로 사용할 수 있도록 하는 버킷 정책을 수정합니다. 버킷 정책 예시:
참고: BUCKET_NAME을 버킷 이름으로, REGION을 리전으로, ACCOUNT_ID를 AWS 계정 ID로, API_ID를 API ID로 바꾸십시오.{ "Version": "2012-10-17", "Statement": [{ "Sid": "APIProxyBucketPolicy", "Effect": "Allow", "Principal": { "Service": "apigateway.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::BUCKET_NAME/*", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:execute-api:REGION:ACCOUNT_ID:API_ID/*/GET/" } } }] } - S3 버킷에 대한 GetObject API 액세스를 허용하는 AWS Identity and Access Management(IAM) 정책을 생성합니다. IAM 정책 예시:
참고: BUCKET_NAME을 사용하는 버킷 이름으로 바꾸십시오.{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": [ "arn:aws:s3:::BUCKET_NAME/*" ] }] } - IAM 역할을 생성한 다음, 이전 IAM 정책을 연결합니다.
- IAM 역할의 Amazon 리소스 이름(ARN)을 기록합니다.<br id=hardline_break/>
참고: API Gateway에 역할을 부여하려면 IAM 역할에 다음과 같은 신뢰 정책이 포함되어야 합니다.
{ "Version": "2012-10-17", "Statement": [{ "Sid": "", "Effect": "Allow", "Principal": { "Service": "apigateway.amazonaws.com" }, "Action": "sts:AssumeRole" }] }
S3 서비스용 REST API 프록시 생성
다음 단계를 완료하십시오.
- API Gateway 콘솔을 엽니다.
- API 생성을 선택합니다.
- REST API에서 빌드를 선택합니다.
- API 이름에 REST API의 이름을 입력합니다.
- API 엔드포인트 유형 드롭다운 목록에서 대부분의 클라이언트 트래픽이 시작되는 위치를 기준으로 엔드포인트 유형을 선택합니다.<br id=hardline_break/> 참고: 클라이언트 트래픽이 인터넷에서 액세스하는 퍼블릭 서비스에는 엣지 최적화 엔드포인트를 사용하는 것이 좋습니다. 클라이언트 트래픽이 동일한 AWS 리전 내에서만 API에 액세스하는 경우 리전 엔드포인트를 사용하십시오.
- API 생성을 선택합니다.
루트 리소스에 대한 GET 메서드 생성
다음 단계를 완료하십시오.
- 루트 리소스 **/**를 선택합니다.
- 메서드 생성을 선택합니다.
- 메서드 유형 드롭다운 목록에서 GET를 선택합니다.
- 통합 유형에서 AWS 서비스를 선택합니다.
- AWS 리전 드롭다운 목록에서 내 리전을 선택합니다.
- AWS 서비스 드롭다운 목록에서 **Simple Storage Service(S3)**를 선택합니다.
- AWS 하위 도메인에서 필드를 비워 둡니다.
- HTTP 메서드 드롭다운 목록에서 GET를 선택합니다.
- 작업 유형에서 경로 재정의 사용을 선택합니다.
- 경로 재정의에 S3 버킷 경로를 입력합니다. 예: BUCKET_NAME/index.html.
- 실행 역할에 IAM 역할의 ARN을 입력합니다.
- 메서드 생성을 선택합니다.
참고: 이 설정은 프런트엔드 GET API 요청 **https://your-api-host/stage/**를 GET S3 백엔드 https://your-s3-host/index.html에 통합합니다.
API 리소스 객체 생성
다음 단계를 완료하십시오.
- 리소스 생성을 선택합니다.
- 리소스 경로에서 **/**로 유지합니다.
- 리소스 이름에 이름을 입력합니다. 예: object.
- 리소스 생성을 선택합니다.
리소스에 대한 GET 메서드 구성
다음 단계를 완료하십시오.
- 리소스에서 생성한 리소스를 선택합니다. 예: /object.
- 루트 리소스의 GET 메서드 생성 섹션에서 2~12단계를 완료합니다.
- GET를 선택한 다음 통합 요청을 선택합니다.<br id=hardline_break/> 참고: object를 해당 리소스 이름으로 바꾸십시오.
- 편집을 선택합니다.
- URL 경로 파라미터를 확장한 다음 경로 매개변수 추가를 선택합니다.
- 이름에서 리소스 이름을 입력합니다.
- 다음에서 매핑됨에서 값을 method.request.path.object로 입력합니다.<br id=hardline_break/> 참고: object를 해당 리소스 이름으로 바꾸십시오.
- 저장을 선택합니다.
GET 메서드에 대한 응답 헤더 매핑 설정
브라우저가 콘텐츠 유형의 응답을 처리하도록 백엔드 콘텐츠 유형 헤더 파라미터 값을 프론트엔드 대응값에 매핑해야 합니다.
다음 단계를 완료하십시오.
- 리소스에서 **/**를 선택합니다.
- GET를 선택한 다음 메서드 응답을 선택합니다.
- 응답 200에서 편집을 선택합니다.
- 헤더 이름에서 헤더 추가를 선택합니다.
- 이름을 콘텐츠 유형으로 설정합니다.
- 저장을 선택합니다.
- 통합 응답을 선택한 후 편집을 선택합니다.
- 헤더 매핑에서 Content-Type 옆에 있는 매핑 값을 integration.response.header.Content-Type으로 입력합니다.
- /object 리소스 아래에서 GET 메서드에 대해 2~8단계를 반복합니다.<br id=hardline_break/> 참고: object를 해당 리소스 이름으로 바꾸십시오.
REST API 배포
다음 단계를 완료하십시오.
- API 배포를 선택합니다.
- 스테이지 드롭다운 목록에서 *새 스테이지*를 선택합니다.
- 스테이지 이름에 이름을 입력합니다. 예: STAGE_NAME.
- 배포를 선택합니다.
- 스테이지 세부 정보에서 API를 테스트하기 위한 호출 URL을 기록해 둡니다.
S3 정적 웹 사이트의 API 프록시를 테스트하려면 curl 명령을 실행합니다.
참고: 다음 예에서 API_ID를 해당 API ID로, REGION을 해당 리전으로, STAGE_NAME을 해당 스테이지 이름으로 바꾸십시오.
루트 리소스를 테스트하려면 다음 curl 명령을 실행합니다.
curl -X GET https://API_ID.execute-api.REGION.amazonaws.com/STAGE_NAME/
객체 리소스를 테스트하려면 다음 curl 명령을 실행합니다.
curl -X GET https://API_ID.execute-api.REGION.amazonaws.com/STAGE_NAME/home.html

