S3 -API Gateway - Lambda - Amazon Rekognition을 활용해서 얼굴 유사도 웹 사이트 구축
현재 HR 관련해서 출석, 출퇴근 등과 같은 출결 관련한 문제를 얼굴 인식을 통해서 진행하는 프로젝트를 진행 중입니다. 저는 최대한 클라우드의 기능을 최대로 써보기 위해서 알아보던 중 Amazon Rekognition 서비스에 대해서 알게 되었고, 이 안에 많은 기능이 있다는 것을 알게 되었습니다. 그 중 compare_faces를 사용해 보았습니다.
처음에는 사실 장고로 배포해볼까도 생각해봤는데, 사실 경험이 많지 않아 다른 방법으로 배포하는 방법에 대해서 고안해보았습니다.
Lambda 함수 생성
저는 이렇게 Lambda 함수를 하나 생성했습니다. 제가 매우 중요한 사실을 잊고 있었습니다... 여기서 가장 중요한 건 실행 역할 부분입니다 진짜 이것때매 엄청 애먹었습니다..
하.. 이 말이 뭔말이냐 궁금해 하실텐데, 저는 권한 설정이 없다는 오류가 계속 떠서 루트 계정으로 로그인해서 해당 계정에 계속 AmazonRekognitionFullAccess 권한을 주고 있었습니다.. 그런데... 제 mistake..
Lambda 함수에 할당된 IAM 역할이 해당 작업을 수행할 수 있는 권한이 없다는 것을 의미한다는.. 이런 너무 기본적인 실수를 하고 있었습니다..
결국 IAM 콘솔로 이동해서, 해당 역할에게 AmazonRekognitionFullAccess 권한을 부여하니까 바로 오류없이 성공했습니다.. 휴..!
Lambda 함수 코드
이벤트에서 body를 파싱해서 body가 없을 경우 에러를 발생시키고, body를 json 형식으로 변환합니다. 여기서 만약 'source image'와 'target image'가 포함되었는 지 확인하고, 없을 경우 에러를 발생시킵니다.
Base64 인코딩된 이미지를 디코딩하여 바이너리 데이터로 변환합니다.
여기서 궁금한 것은 "왜 Base64로 인코딩이 필요한가?" 에 대해서 궁금해 하실 수 있는데,
일단, API Gateway로부터 전달된 이미지 데이터는 Base64 인코딩된 문자열로 전송되고, 이를 디코딩하여 바이너리 데이터로 변환해야 Rekognition API가 사용할 수 있다고 합니다.
쉽게 말해서, 인코딩된 이미지는 JSON의 문자열로 안전하게 포함될 수 있으며, 디코딩을 통해 Rekognition API가 처리할 수 있는 형식으로 변환되도록 합니다.
API Gateway
API Gateway의 Rest API는 HTTP를 기반으로 하는 RESTful API를 ㅅ생성, 배포 및 관리할 수 있게 해주는 서비스 입니다.
API 생성
1. REST API를 선택하고, 구축을 클릭합니다.
2. API 이름(Face Rekognition)을 입력하고 API 생성을 클릭합니다.
리소스 생성
1. 리소스 생성을 클릭하고, 리소스 경로를 /compare로 설정합니다.
메서드 생성
1. 생성한 리소스(/compare)를 선택합니다.
2. 메서드 생성을 클릭하고, POST를 선택합니다.
3. 통합 유형은 Lambda 함수를 선택하고, 생성한 Lambda 함수 이름을 입력합니다.
4. 메서드 생성을 클릭합니다.
제가 이 부분은 Lambda 프록시 통합을 체크 해주지 않았는데, 이 부분을 체크해줬습니다.
Lambda 프록시 통합
- Amazon API Gateway와 Lambda를 통합하는 방식 중 하나입니다.
- Lambda 프록시 통합을 사용하면 API Gateway가 들어오는 모든 HTTP 요청을 단일 Lambda 함수로 전달하고, 해당 Lambda 함수의 응답을 클라이언트로 직접 반환합니다.
- Lambda 프록시 통합을 사용하면 API Gateway와 Lambda 간의 통합을 간소화하고, 유연성과 관리 용이성을 높일 수 있다고 합니다.
- 모든 요청을 단일 Lambda 함수에서 처리하고 응답을 직접 제어할 수 있으므로, 복잡한 API 로직을 간단하게 구현할 수 있습니다.
API 배포
성공적으로 배포를 완료하였습니다!
S3 버킷에 HTML, CSS, JAVASCRIPT 파일 모두 넣기
저는 버킷 생성에 있어서, 일단 간단하게 정적 웹 페이지만을 만들 목적이었기 때문에 모든 퍼블릭 액세스 차단을 해제해주고, 속성에서 정적 웹 사이트 호스팅을 활성해 주기로 했습니다.
성공적으로 나온 모습을 확인할 수 있었습니다.. 저는 보면서 느낀게, 와 진짜 AWS의 다양한 서비스들만 잘 이용할 줄 알아도 정말 많은 기능이 있다는 것을 알 수 있었습니다.. 진짜 모델 학습도 시킬 필요 없이 API 가져와서 간단하게 이런 서비스를 만드는 것이 진짜 신기했습니다.. 저는 이제 이어서 S3에 여러 개의 사진을 넣어준 다음에 해당 사람이 S3 안에서 누군지를 판별(?) 하는 서비스를 만들어 보려고 합니다.
다음 포스팅의 내용은 그러한 내용이 될 것 같습니다.. 후딱 오겠습니다!!
긴급 추가!!
하.. 이거 다시 처음부터 진행하는데, 계속 S3로 정적 웹사이트로 열려고 하는데 403 Forbidden 오류가 딱.. 뜨길래.. 별 걸 다 해봤는데.. ㅋㅋㅋㅋㅋ 한 두시간 헤맨 것 같은데.. 결론부터 말씀드리자면 버킷 정책을 설정해줬어야 했네요.. 공개 읽기 권한이 설정되어있지 않아서 생긴 문제였네요.. 하.. ㅎㅎ 후.. 꼼꼼하게 봤어야 하는데.. 저 같은 오류 생기는 분들도 있으실 것 같아서 급하게 추가합니다..!
그런데, 사실 이젠 이러한 오류 문구는 하도 많이 만나봐서.. ㅎ 면역력이 생겼습니다. ㅎ
S3 버킷 -> 권한 -> 버킷 정책 편집
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket-name/*"
}
]
}
이 부분에서 Resource 부분에서 본인의 버킷 이름으로 변경해주시면 됩니다!
'개발 > AWS' 카테고리의 다른 글
[AWS] Cloudwatch 콘솔에서 Lambda 함수 로그 그룹이 존재하지 않는다 오류 해결법 (0) | 2024.07.03 |
---|---|
[AWS] Rekognition Collection에 S3에 있는 파일들을 저장해보자! (0) | 2024.07.02 |
[AWS] 티스토리 API 없이 크롤링하여 Lambda를 활용한 실시간 최신 블로그 포스트 보여주기 (0) | 2024.06.25 |
[AWS] [Step 5 - CloudFront] (1) | 2024.06.03 |
[AWS] [Step 2 & 3] 요즘 대세인 aws-resume-challenge 해보자!! (0) | 2024.05.29 |