AWS 기술 블로그

Amazon Rekognition 를 활용한 얼굴 인식 셀프 체크인 시스템 구축하기

항공, 여행 업계는 최근까지 코로나 바이러스로 인해 많은 어려움을 겪었습니다. 하지만 최근에는 Endemic, Post 코로나 시대로 접어 들면서, 움추려 들었던 항공, 여행 수요가 폭발적으로 증가하고 있습니다. 이렇게 증가하는 수요를 비용 효율적으로 수용하기 위한 방법 중의 하나로 기업들은 최근 무인 키오스크를 활용한 셀프 체크인 서비스에 관심을 많이 가지게 되었습니다. 당장 공항만 가더라도 많은 키오스크들이 설치 되어 있는 것을 확인할 수 있습니다. 하지만 우리는 나이많은 어르신들이 키오스크와 한참 씨름하다가 직원들을 불러 겨우 티켓팅을 하는 모습들을 공항에서 어렵지 않게 볼 수 있습니다. 키오스크를 사용할 때 복잡한 UX 로 씨름하지 않고 간단하고 빠르게 단 한번의 인증 만으로 Check-In Service를 제공하는 모습을 상상해 보십시오. 고객은 줄을 길게 서지 않고 빠르게 체크인을 할 수 있을 것이고 기업 입장에서도 평균 고객 대응 시간을 크게 줄일 수 있을 것입니다.

지난 2022년 11월 AWS Industry Week, T&H 데모 부스에서 Amazon Rekognition 을 활용하여 고객의 여행 예약부터 현지의 호텔 체크인까지 여행 전반적인 경험을 압축한 얼굴 인식 셀프 체크인 데모를 소개하였습니다. 여행, 항공 업계의 고객분들께 많은 관심을 받았으며 AWS 서비스를 활용하여 셀프 체크인 시스템 도입을 위해 논의중에 있습니다.

이번 게시글에서는 AWS Industry Week 에서 데모로 보여드렸던 얼굴 인식 셀프 체크인 서비스에 대한 아키텍처를 소개합니다. 기계 학습을 통해 이미지 및 비디오 분석을 자동화 해주는 AI/ML 서비스인 Amazon Rekognition 의 얼굴인식 기능을 활용하여, 호텔이나 공항 등지에서 쉽고 빠르게 할 수 있습니다. 또한 본 솔루션에 사용된 Amazon EKS, Amazon Aurora, Amazon S3 등 다양한 AWS 서비스의 활용법에 대해서도 같이 설명하고자 합니다.

솔루션 개요

Amazon Rekognition 은 AWS AI/ML 서비스로, 직접 모델을 개발할 필요 없이 제공되는 API 만으로 손쉽게 머신러닝 모델을 사용해서 개발할 수 있는 서비스입니다. Amazon Rekognition 은 콘텐츠 탐지(성인, 폭력 컨텐츠), 얼굴 비교 및 검색, 얼굴 탐지 및 분석, 객체 레이블링, 텍스트 탐지 등 여러 기능을 제공하고 있습니다.

본 기술 블로그에서는 Amazon Rekognition 의 얼굴 비교 및 검색, 얼굴 표정 분석 등의 기술을 활용한 부분과 어플리케이션 개발 내용을 함께 제공하고자 합니다.

  • REST API  명세서 및 Frontend ↔ Backend API 호출 방법
  • Amazon Rekognition API 활용 방법
  • 어플리케이션 컨테이너 생성 및 Amazon EKS, ECR 활용 방법

본 솔루션의 고객 경험에 대해 간략하게 설명하고자 합니다. 이는 크게 2가지 단계로 이루어져 있습니다.

첫번째 단계는 “여행/항공 예약 단계”로, 고객이 여행을 떠나기 전에 호텔 혹은 항공 예약 등을 하는 “사전 예약 절차” 단계 입니다. 기존 예약 방식과 다르게 얼굴 인식 셀프 체크인 서비스에서는 고객이 예약을 진행할 때 본인의 얼굴을 노트북이나 모바일 기기 등으로 촬영하여 등록하는 단계가 추가 됩니다. 이때 등록한 얼굴은 추후 고객이 셀프 체크인을 진행 할 때 사용됩니다.

두번째 단계는 “자동 체크인 단계”로 예약된 호텔이나 항공사에 도착하여 얼굴 인식을 통해 셀프 체크인을 진행하는 단계입니다. 기존에는 체크인을 위해서 호텔로비, 항공사의 프론트에서 줄을 서고, 직원은 고객의 개인 정보를 확인하였습니다. 본 솔루션 도입 이후에는 간략하게 키오스크에서 얼굴을 인식하는 것 만으로 체크인 절차가 완료될 수 있습니다. 아래 그림에서 좌측이 기존 고객 경험, 우측이 본 솔루션 도입 후의 경험 변화를 나타내고 있습니다.

아키텍처 소개

1) 숙소와 항공권 예매를 위해 사용자는 Mobile Device(Mobile phone, Tablet, Labtop 등)를 이용해서 예매 페이지에 접속. 웹페이지를 접속하기 위해 AWS DNS 서비스인 Amazon Route53 을 통해 CDN 서비스인 Amazon CloudFront 도메인 주소를 식별하여 예매 웹 사이트로 접속

2) Amazon CloudFront를 활용해서 Amazon Elastic Kubernetes Service(EKS) 에서 호스팅 하고 있는 예매 및 체크인 애플리케이션에 사용되는 정적/동적 웹사이트 컨텐츠를 캐싱. 웹사이트의 요청에 빠른 응답을 제공 함을써 고객의 서비스 접근성 및 만족도를 향상

3) AWS의 Container Orchestration 서비스인 Amazon Elastic Kubernetes Service(EKS) 를 통해 숙소와 항공권 예매를 하고, 자동 체크인을 위한 Front-end와 Back-end Logic을 처리할 수 있는 애플리케이션 컨테이너들을 호스팅해서 요청받은 API 기반의 비즈니스 로직을 실행 및 처리

4) AWS의 고성능 RDBMS 서비스인 Amazon Aurora 를 적용하여 애플리케이션의 데이터를 저장 하도록 구성 함으로써, 높은 성능과 가용성, 뛰어난 확장성과 보안이 적용 되도록 구성 (Amazon Aurora는 MySQL, PostgreSQL과 호환되는 완전 관리형 RDBMS 서비스)

5) 숙소와 항공권을 예매한 사용자는 기계 학습을 통해 이미지 및 비디오 분석을 자동화 해주는 서비스인 Amazon Rekognition을 사용하여 티켓 예매 시에 촬영한 이미지와 로그인시 촬영된 이미지를 AI/ML 기반으로 자동 분석하여 체크인 및 티켓 발급

Amazon Rekognition API 소개

Amazon Rekognition 은 이미지, 비디오 영상에서 객체, 얼굴, 텍스트를 인식하고 분석하는 AWS AI/ML 서비스입니다.

그 중에서 셀프체크인 데모에서 사용한 API 에 대해서 소개하고자 합니다.

Face Detect API 는 눈, 코, 입 등 주요 얼굴의 특징을 찾아 얼굴을 감지하는 기술입니다. 이는 이미지 하나당 최대 100개까지의 얼굴 감지를 할 수 있습니다. 이를 통해 해당 이미지에 얼굴이 포함될 신뢰도, 수염이나 선글라스 착용여부 혹은 남녀 구분 등 얼굴의 특성을 감지하며, 해당 얼굴의 감정을 신뢰도와 함께 응답을 받을 수 있기 때문에 다양한 서비스에서 활용하실 수 있습니다.

Face Compare API 는 소스 이미지에 있는 얼굴을 대상 이미지에 있는 각 얼굴과 비교하여 결과를 응답받는 서비스 입니다.. 이는 얼굴 일치 정보를 신뢰도 수준으로 나타내며, similarityThreshold parameter를 사용하여 응답받을 신뢰도 수준을 정의할 수 있습니다. (Default 값은 80%) 본 블로그에서 기술하고 있는 셀프 체크인 서비스에서 Face Detect. Face Compare 기능을 주로 사용하였습니다.

또한 Personal Protective Equipment API 는 건설, 의료, 제조, 물류 등 다양한 산업에서 사용 될 수 있습니다. PPE 감지 기능을 통해 CCTV 에서 전송한 이미지를 분석하여 마스크, 헬멧, 장갑 등 필요한 보호 장비를 착용하고 있는지 자동으로 감지할 수 있으며 감지 결과를 이용하여 위험 구역에서 종사자들이 개인 보호 장비 착용을 알리는 경보를 트리거 할 수도 있습니다. 이는 종사자들이 개인 보호 장비 착용 지침을 준수하려 노력해도, 가끔 착용을 까먹거나, 업무 장소에서 요구하는 장비를 누락할 수 있는데, 이런 상황을 효과적으로 방지하고 대처할 수 있습니다.

선행 조건

이 블로그에서 설명하는 각 단계를 설정하고 실행하기 위해서는 아래 사항들이 선행되어야 합니다.

단계 요약

  • 단계 1 : 어플리케이션 개발
  • 단계 2 : AWS 서비스 구성 및 환경설정 (optional)
  • 단계 3 : 컨테이너 이미지 생성 및 업로드
  • 단계 4 : 어플리케이션 배포

단계 1 : 어플리케이션 개발

어플리케이션은 Spring boot 기반, JAVA 언어를 사용해서 개발되었으며 API 명세서로 기술하였습니다.

1.1 POST – Reservation API

항공편 정보(출발지, 목적지, 일정 등), 숙박 정보(투숙일정, 룸 타입 등)를 Body 에 넣어 전달하여 데이터베이스에 정보를 저장하고 UUID 형태로 BookingId 를 생성해서 응답합니다.

  • URL : /demo-service/booking
  • Method : POST
  • Request :
    {
       "nickname": "AWS Travel",
       "departure": "서울",
       "arrival": "제주",
       "departureDate": "2022-11-03",
       "returnDate": "2022-11-05",
       "passengerAdult": 2,
       "passengerChild": 1,
       "flightDeparture": "AWS101",
       "flightArrival": "AWS102",
       "checkinDate": "2022-11-03",
       "checkoutDate": "2022-11-05",
       "roomType": "Deluxe Room",
       "hotelAdult": 2,
       "hotelChild": 1
     }
  • Response :
    {
        "statusCode": "20005000",
        "statusMsg": "Success response",
        "data": {
            "bookingId": "28f91700-1e62-450b-b1e4-d0bc9cbb076c",
            "nickname": "AWS Travel",
            "arrival": "제주",
            "flightDeparture": "AWS101",
            "flightArrival": "AWS102",
            "checkinDate": "2022-11-03",
            "checkoutDate": "2022-11-05",
            "roomType": "Deluxe Room",
            "hotelAdult": 2,
            "hotelChild": 1
        }
    }

1.2 GET – Reservation API

BookingId 기반으로 사용자의 항공/호텔 예약정보와 얼굴 분석/비교를 통한 동일인 유사도(Similarity) 정보를 제공합니다.

  • URL : /demo-service/booking/
  • Method : GET
  • Path Variable : {bookingId}
  • Response :
    {
        "statusCode": "20005000",
        "statusMsg": "Success response",
        "data": {
            "bookingId": "28f91700-1e62-450b-b1e4-d0bc9cbb076c",
            "nickname": "AWS Travel",
            "arrival": "제주",
            "flightDeparture": "AWS101",
            "flightArrival": "AWS102",
            "checkinDate": "2022-11-03",
            "checkoutDate": "2022-11-05",
            "roomType": "Deluxe Room",
            "hotelAdult": 2,
            "hotelChild": 1
            "similarity": 99.999985
        }
    }

1.3 POST – UploadPhoto API

여행 예약을 할 때 사용자의 사진 촬영한 이미지를 Amazon S3 업로드하는 기능을 제공합니다.

Amazon Rekognition – detectFaces API를 활용해서 업로드된 이미지에서 얼굴이 있는지 확인할 수 있습니다.

  • URL : /demo-service/booking/photo/
  • Method : POST
  • Path Variable : {bookingId}
  • Body : {form-data}
    • KEY : file
    • VALUE : path/name
  • Response :
    {
        "statusCode": "20005000",
        "statusMsg": "Success response",
        "data": {
            "bookingId": "28f91700-1e62-450b-b1e4-d0bc9cbb076c",
            "nickname": "AWS Travel",
            "photoImg": " 0f435015-2755-4a90-871e-bf76b91f57f9.jpg"
        }
    }
String s3Bucket = "demo-industry-week-2022";

AmazonRekognition rekognitionClient = AmazonRekognitionClientBuilder.standard().withRegion(Regions.AP_NORTHEAST_2).build();

Image source = new Image().withS3Object((new S3Object().withName(sourceImage).withBucket(s3Bucket)));

DetectFacesRequest request = new DetectFacesRequest().withImage(source).withAttributes(Attribute.ALL);

boolean isDetectFaces = false;

try {
    DetectFacesResult result = rekognitionClient.detectFaces(request);
    List<FaceDetail> faceDetails = result.getFaceDetails();

    for (FaceDetail face : faceDetails) {
        if (request.getAttributes().contains("ALL")) {
            AgeRange ageRange = face.getAgeRange();
            log.info("The detected face is estimated to be between "
                    + ageRange.getLow().toString() + " and " + ageRange.getHigh().toString()
                    + " years old.");
            isDetectFaces = true;
            break;
        }
    }
} catch (AmazonRekognitionException e) {
    e.printStackTrace();
}
return isDetectFaces;

추가적으로 사용자가 마스크를 썼는지 확인하는 Personal Protective Equipment(PPE) API 도 제공합니다.

Amazon Rekognition – detectProtectiveEquipment API 를 사용해서 얼굴 사진 촬영하고 나서 마스크를 썼을 경우, 마스크를 벗고 재 촬영을 유도할 수 있습니다.

(마스크 탐지 동작을 개발하였으나, Industry Week 해당일에는 데모 시간 제약으로 인해 주석처리하고 진행하였습니다.)

ProtectiveEquipmentSummarizationAttributes summaryAttributes = new ProtectiveEquipmentSummarizationAttributes()
        .withMinConfidence(80F)
        .withRequiredEquipmentTypes("FACE_COVER");

DetectProtectiveEquipmentRequest request = new DetectProtectiveEquipmentRequest()
        .withImage(source)
        .withSummarizationAttributes(summaryAttributes);

Float coverDetectThreshold = 80F;

boolean isDetectMask = false;

try {
    DetectProtectiveEquipmentResult result = rekognitionClient.detectProtectiveEquipment(request);

    List<ProtectiveEquipmentPerson> persons = result.getPersons();

    for (ProtectiveEquipmentPerson person : persons) {
       List<ProtectiveEquipmentBodyPart> bodyParts = person.getBodyParts();

        if (!bodyParts.isEmpty()) {
            for (ProtectiveEquipmentBodyPart bodyPart : bodyParts) {
                List<EquipmentDetection> equipmentDetections = bodyPart.getEquipmentDetections();

                if (!equipmentDetections.isEmpty()) {
                    for (EquipmentDetection item : equipmentDetections) {
                        if (item.getType().contentEquals("FACE_COVER")) {
                            log.info("Item: " + item.getType() + ". Confidence: " + item.getConfidence().toString());
                            if (item.getConfidence() > coverDetectThreshold) {
                                isDetectMask = true;
                                break;
                            }
                        }
                    }
                    if (isDetectMask) {
                        break;
                    }
                }
            }
        }
        if (isDetectMask) {
            break;
        }
    }

} catch (AmazonRekognitionException e) {
    e.printStackTrace();
}

1.4 POST – CheckIn API

여행지의 호텔에 도착해서 셀프체크인 기능을 제공합니다. 체크인을 위한 안면 촬영을 한 이미지를 업로드 하고, Amazon Rekognition – compareFaces API를 활용해서 등록한 사진과의 비교를 통해서 일치하는 사진이 있으면 체크인을 성공처리하고 해당 사용자의 예약정보(투숙일, 인원, 룸 타입 등)를 제공합니다.

  • URL : /demo-service/checkin
  • Method : POST
  • Body : {form-data}
    • KEY : file
    • VALUE : path/name
  • Response :
    {
        "statusCode": "20005000",
        "statusMsg": "Success response",
        "data": {
            "bookingId": "28f91700-1e62-450b-b1e4-d0bc9cbb076c",
            "nickname": "AWS Travel",
            "arrival": "제주",
            "flightDeparture": "AWS101",
            "flightArrival": "AWS102",
            "checkinDate": "2022-11-03",
            "checkoutDate": "2022-11-05",
            "roomType": "Deluxe Room",
            "hotelAdult": 2,
            "hotelChild": 1,
           "photoImg": "0f435015-2755-4a90-871e-bf76b91f57f9.jpg"
           "similarity": 99.999985
        }
    }
String sourceImage = sourceImg;
String targetImage = targetImg;

AmazonRekognition rekognitionClient = AmazonRekognitionClientBuilder.standard().withRegion(Regions.AP_NORTHEAST_2).build();

Image source = new Image().withS3Object((new S3Object().withName(sourceImage).withBucket(s3Bucket)));
Image target = new Image().withS3Object((new S3Object().withName(targetImage).withBucket(s3Bucket)));
CompareFacesRequest request = new CompareFacesRequest()
        .withSourceImage(source)
        .withTargetImage(target)
        .withSimilarityThreshold(similarityThreshold);

try {
    CompareFacesResult compareFacesResult = rekognitionClient.compareFaces(request);

    // Display results
    List<CompareFacesMatch> faceDetails = compareFacesResult.getFaceMatches();
    for (CompareFacesMatch match : faceDetails) {
        ComparedFace face = match.getFace();
        BoundingBox position = face.getBoundingBox();
        log.info("Face at " + position.getLeft().toString()
                + " " + position.getTop()
                + " matches with " + match.getSimilarity().toString()
                + "% confidence.");
        return match.getSimilarity();

    }
    List<ComparedFace> uncompared = compareFacesResult.getUnmatchedFaces();

    log.info("There was " + uncompared.size() + " face(s) that did not match");
} catch (Exception e) {
    log.error("Occurred Exception : sourceImage : " + sourceImage + ", targetImg : " + targetImg);
    return 0F;
}

return 0F;

단계 2 : AWS 서비스 구성 및 환경설정 (optional)

2.1 Amazon EKS 구성

Amazon EKS 워크샵 스튜디오에서 아래의 2개 항목에 대해서 구성을 진행합니다.

  • 실습환경 구축 : Amazon EKS 구성을 위한 사전 사항으로 AWS Cloud9, AWS CLI, kubect, eksctl 설치
  • EKS 클러스터 생성하기

셀프 체크인 어플리케이션은 AWS 서비스(Amazon Rekognition, Amazon S3, AWS Secrets Manager) 를 사용해서 개발되었습니다. 어플리케이션은 Amazon EKS 클러스터에 Pod 에서 컨테이너가 실행되며 위의 AWS 서비스에 대한 접근을 Pod 수준에서 제어할 수 있습니다.
IAM roles for service account 자료를 참고해서 진행합니다.

aws iam create-policy \
    --policy-name custom-sa-policy \
    --policy-document file://iam-policy.json

실행결과 화면에서 Policy Arn 정보를 아래와 같이 확인할 수 있습니다.

{
    “Policy”: {
        “PolicyName”: “custom-sa-policy”,
        “Arn” : “arn:aws:iam::aws_account_id::policy/custom-sa-policy”
         …
    }
}

eksctl 을 사용하여 IAM Policy 를 연결해서 서비스 계정을 생성합니다.

eksctl create iamserviceaccount \
    --cluster eks-demo \
    --namespace default \
    --name custom-eks-sa \
    --attach-policy-arn arn:aws:iam::aws_account_id:policy/custom-sa-policy \
    --override-existing-serviceaccounts \
    --approve

생성된 서비스 계정은 단계4) 어플케이션 배포 (deployment.yaml) 에서 확인하실 수 있습니다.

2.2 Amazon Aurora 구성

Amazon PostgreSQL 데이터베이스를 생성합니다.

(셀프 체크인 어플리케이션은 Amazon Aurora – PostgreSQL 를 사용하였습니다.)

  • 데이터베이스 생성 방식 : 표준 생성
  • 데이터베이스 엔진 : Amazon Aurora
  • 에디션 : Amazon Aurora PostgreSQL 호환버전

데이터베이스에 사용할 보안 그룹 (Security Group) 을 먼저 생성합니다. 인바운드 규칙에 PostgreSQL 기본 포트 (5432) 와 AnyWhere-IPv4추가합니다.


DB 클러스터 연결을 위해서 사용자 이름, 암호를 등록이 필요합니다. 어플리케이션에서도 DB 연결을 위해 AWS Secrets Manager 사용하므로 반드시 기억해 두시기 바랍니다.

  • DB 클러스터 식별자 : DB 클러스터 이름을 작성합니다.
  • 자격증명 설정 : 마스터 사용자 이름, 암호를 작성합니다.

2.3 Amazon S3 구성

어플리케이션에서 얼굴 사진을 저장하기 위해 Amazon S3 버킷을 생성합니다.

Amazon S3 버킷 생성하기를 선택합니다.

  • 버킷 이름 : 글로벌 전역에서 고유이름으로 작성합니다.
  • AWS 리전 : 아시아 태평양(서울) ap-northeast-2 선택합니다.

생성된 S3 버킷 이름을 어플리케이션의 소스에서 환경설정을 작성하는 코드 (application.yml) 에 반영합니다.

…
s3:
  bucket-path: "demo-industry-week-2022"

2.4 AWS Secrets Manager  생성

데이터베이스의 사용자 이름, 암호가 코드에서 노출되지 않도록 아래와 같이 보안 암호를 생성합니다. 생성된 자격 증명으로 어플리케이션에서 DB 연결할 때 사용됩니다.

  • Amazon RDS 데이터베이스에 대한 자격 증명을 선택합니다.
  • 자격 증명의 사용자 이름, 암호는 2-1) 생성한 Amazon Aurora 데이터베이스 사용자 이름, 암호를 입력합니다.
  • 하단의 DB 인스턴스를 선택합니다.
  • 2단계 보안 암호 구성에서 보안 암호 이름을 /secret/dbsecret 으로 입력합니다. 그 외 나머지 항목은 그대로 둡니다.

2.5 Amazon ECR 생성

컨테이너 이미지를 저장소 생성을 위해 이름을 작성하고 생성합니다.

단계 3 : 컨테이너 이미지 생성 및 업로드

셀프 체크인의 어플리케이션 코드는 아래 “3.1 어플리케이션 빌드”를 참고하여, 다운로드 받아서 어플리케이션 빌드를 진행하고 컨테이너 이미지를 생성합니다.

3.1 어플리케이션 빌드

전체 소스코드를 다운로드 받아서 Gradle 빌드를 수행합니다.

어플리케이션 소스는 JAVA로 개발되었으며, 결과물은 boot/build/libs 경로 내에 boot-1.0.jar 파일로 생성됩니다.

wget https://aws-korea-tech-blog-public.s3.ap-northeast-2.amazonaws.com/building-a-face-recognition-self-check-in-system-using-amazon-rekognition/self-checkin.tar.gz
tar xzvf self-checkin.tar.gz
cd self-checkin
./gradlew build

3.2 컨테이너 이미지 생성 & 업로드

Dockerfile – 컨테이너 이미지를 생성하기 위한 설정 파일입니다. 생성된 컨테이너 이미지를 배포하면 어플리케이션이 구동됩니다.
컨테이너 이미지를 생성을 위해 Dockerfile 을 생성하고 컨테이너 이미지를 Amazon ECR 에 업로드 하도록 합니다.

베이스 이미지로 openjdk 를 가져와서 어플리케이션 빌드를 진행하게 됩니다. 최종적으로 demoapp.jar 파일을 생성하고 컨테이너를 실행합니다.

FROM openjdk:17-ea-11-jdk-slim
VOLUME /tmp
COPY boot/build/libs/boot-1.0.jar /app/demoapp.jar
ENTRYPOINT java -Xms256m -Xmx1024m -Dspring.profiles.active=prod -jar /app/demoapp.jar

컨테이너 이미지 생성을 위해서 docker build 명령어를 활용해서 컨테이너 이미지를 생성합니다.

컨테이너 이미지의 이름으로 사용할 self-checkin-app 작성하며 tag를 명시하지 않은 경우 latest 값으로 생성됩니다.

docker build -t self-checkin-app .

아래 명령어를 통해서 생성된 컨테이너 이미지를 조회할 수 있습니다.

docker images

최종적으로 생성된 컨테이너 이미지를 Amazon ECR 에 업로드합니다.

aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
docker tag self-checkin-app:latest aws_account_id.dkr.ecr.region.amazonaws.com/self-checkin-app:latest
docker push aws_account_id.dkr.ecr.region.amazonaws.com/self-checkin-app:latest

[컨테이너 이미지 업로드 결과]

단계 4 : 어플리케이션 배포

어플리케이션을 Amazon EKS 클러스터에 배포해서 서비스할 수 있도록 매니페스트 파일이 생성되어 있습니다.

아래 코드에서 컨테이너 이미지만 생성된 이미지의 레파지토리로 경로를 복사해서 수정합니다.

  • deployment.yaml
  • service.yaml
[deployment.yaml]
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demoapp-deployment
  labels:
    app: demoapp-service
spec:
  replicas: 2
  selector:
    matchLabels:
      app: demoapp-service
  template:
    metadata:
      labels:
        app: demoapp-service
    spec:
      serviceAccountName: custom-aws-eks-s3-controller
      containers:
      - name: demoapp-service
        image: 컨테이너 이미지 경로 작성
        imagePullPolicy: Always
        ports:
        - containerPort: 8100
      restartPolicy: Always

[service.yaml]
apiVersion: v1
kind: Service
metadata:
  name: demoapp-service-svc
  labels:
    app: demoapp-service-service
  annotations:
    alb.ingress.kubernetes.io/healthcheck-path: /health-check/
spec:
  ports:
    - port: 8100
      targetPort: 8100
      protocol: TCP
  selector:
    app: demoapp-service
  type:
    LoadBalancer

생성되어 있는 매니페스트를 아래 순서대로 배포합니다.

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

셀프 체크인 검증 및 시연

어플리케이션이 Amazon EKS 클러스터에 배포가 되었으며, Postman 을 이용해서 API 검증을 진행하실 수 있습니다.

1. Postman 을 이용해서 검증하기

Service Type:LoadBalancer 를 통해 외부에서 접속 가능한 주소를 확인합니다.

kubectl get svc

위의 결과화면에서 출력된 EXTERNAL-IP 를 이용해서 생성된 API 를 검증할 수 있습니다.

1.1 POST – Reservation API 검증

정상적으로 200 OK 응답을 받았으며, 응답 화면에서 bookingId 가 생성된 것을 확인할 수 있습니다.

1.2 GET – Reservation API 검증

bookingId 파라미터를 추가해서 예약 정보를 확인할 수 있습니다.

2. AWS Industry Week 데모

AWS Industry Week 에서 소개드린 셀프체크인 데모를 직접 확인해 보실 수 있습니다. 고객분들의 항공/숙박 예약을 완료한 이후, 고객의 얼굴 및 감정을 분석해서 셀프체크인이 동작될 수 있도록 구성하였습니다.

정리하기

향후 AWS 요금이 발생하지 않도록 하려면 이 실습 중에 생성된 리소스를 삭제하시기 바랍니다.

결론

이번 게시글에서는 Amazon Rekognition 의 얼굴 인식/비교 기능을 활용한 셀프 체크인 서비스의 아키텍처와 어플리케이션 샘플 코드에 대해 알아보았습니다. 이를 통해 고객에게 체크인 서비스를 좀 더 빠르고 편리하게 진행할 수 있어 차별화된 경험을 제공할 수 있으며, Face to Face 고객 대응 시간을 개선하여 운영 비용을 절감할 수 있습니다. 본 기술 블로그에 만족하셨다면 Amazon Rekognition 의 다양한 기능들을 탐색해 보시고, 다양한 서비스를 제공하는 AWS AI/ML Services 대해서도 관심을 가져 주시기를 바랍니다.

참고

Jaeyoung Ha

Jaeyoung Ha

하재영 솔루션즈 아키텍트는 소프트웨어 개발자 및 소프트웨어 아키텍트의 경험을 바탕으로 엔터프라이즈 고객을 대상으로 클라우드 마이그레이션과 모더나이제이션을 담당하고 있으며 최적의 아키텍처 설계를 구성하는 역할을 수행하고 있습니다.

DongHoon Han

DongHoon Han

한동훈 솔루션즈 아키텍트는 소프트웨어 개발 / 데이터 아키텍트 / IT 거버넌스의 경험을 바탕으로, Enterprise팀에서 Retail 고객을 대상으로 AWS 클라우드 서비스를 활용하고 적용하시는데 어려움이 없도록 도움을 드리는 역할을 하고 있습니다.

Hakmin Kim

Hakmin Kim

김학민 SA 매니저는 마이그레이션 PSA 역할을 수행했고, 현재는 Travel & Hospitality, Transporation & Logistics, Engineering & Construction, HCLS 등의 비지니스를 지원하는 SA팀 매니저를 하고 있습니다. 마이그레이션에 대한 다양한 경험을 쌓았고, 고객의 클라우드 여정을 도와드리는 역할을 하고 있습니다.

Janghwan Hwang

Janghwan Hwang

황장환 솔루션즈 아키텍트는 IT 인프라스트럭처 엔지니어와 아키텍트를 담당했던 경험을 바탕으로, 국내 Enterprise 고객들의 다양한 시스템들을 AWS의 서비스를 활용한 아키텍처를 적용하여 클라우드로 원활하게 전환할 수 있도록 도움을 드리고 있습니다.

Jaewoong Ko

Jaewoong Ko

고재웅 솔루션즈 아키텍트는 약 15년간 네트워크전문가로써 Enterprise, Service Provider, Finance등 여러 고객들의 네트워크 컨설팅, 설계, 구축, 교육등 많은 경험을 하였으며, CSE로써 네트워크 기술지원 경험을 바탕으로 대한항공 고객의 새로운 도전을 함께 하고 있습니다.