S3에서 트리거된 이미지를 Lambda에서 Rekognition으로 라벨링한 후 해당 데이터를 Opensearch에 저장 및 검색하는 방법

4분 분량
콘텐츠 수준: 고급
0

AWS Lambda에서 S3로 이미지가 저장되면 트리거를 이용하여 사진을 AWS Rekognition의 Label detection으로 라벨링되고 라벨링된 이미지의 정보를 이미지이름과 라벨링된 정보를 Opensearch에 저장하여 검색하는 방법에 대해서 안내해드립니다.

사용사례

라벨링하여 저장된 내용을 검색하여 쇼핑 플랫폼에서는 유사한 제품을 추천할 수 있습니다. 예를 들어, 특정 스타일의 옷을 찾는 사용자에게 비슷한 스타일의 옷을 추천할 수 있습니다. 또는 이미지에 부적절한 라벨을 포함하는 경우에 해당 이미지를 차단 하거나 특정 규정에 따라 적절하지 않은 콘텐츠를 제한하는 데 사용될 수 있습니다.

전제조건

  • S3 버킷이 존재해야합니다.
  • Opensearch 도메인이 존재해야합니다.

단계1. Lambda 실행시 필요한 IAM 역할 생성

  • IAM페이지에 접속하여 [역할],[역할 생성], [Lambda] 아래의 두 권한을 넣어줍니다.
    • AmazonS3ReadOnlyAccess, AmazonRekognitionFullAccess
  • 역할 세부정보에서 역할의 이름 “Lambda_opensearch_role” 으로 지정하여 역할을 생성합니다.

단계2: Lambda 함수 생성

  • [함수 이름] 원하는 함수이름을 입력합니다.
  • [런타임],[Python 3.11]로 최신버전의 파이썬으로 지정합니다.
  • 이전 단계에서 생성한 IAM 권한(Lambda_opensearch_role)을 연결합니다.
  • 나머지 사항은 그대로 두고 [함수 생성]을 클릭하여 함수를 생성합니다.

단계3. 배포 패키지 생성

  1. 명령 프롬프트를 열고 my-openseach-function 프로젝트 디렉터리를 만듭니다. [2]
mkdir my-opensearch-function
  1. my-sourcecode-function 프로젝트 디렉터리로 이동합니다.
cd my-opensearch-function
  1. 외부 라이브러리를 새package 디렉터리에 설치합니다.
pip3 install --target ./package boto3
pip3 install --target ./package requests
pip3 install --target ./package requests_aws4auth
  1. 루트에서 설치된 라이브러리를 포함하는 배포 패키지를 만듭니다. 다음 명령은 프로젝트 디렉터리에my-deployment-package.zip 파일을 생성합니다.
cd package
zip -r ../my-deployment-package.zip 

단계4. Lambda 레이어 생성

  1. [Lambda],[추가 리소스].[계층],[계층 생성]을 클릭합니다.
  2. 계층 구성에 아래와 같이 이름을 입력하고 이전에 생성한 zip파일을 업로드 합니다.

여기에 이미지 설명 입력

  1. 이후 이전에 만든 Lambda함수를 클릭하고 [Layers], [Add a layer],[AWS layers]을 클릭한뒤 해당 레이어를 추가합니다.

단계5. Lambda의 S3 트리거 설정하기

  1. 만들어진 Lambda 함수에서 트리거 추가를 클릭합니다.
  2. [트리거 구성]에서 S3를 클릭한뒤 기존에 생성되어 있는 버킷을 지정합니다.
  3. 이후 기본적인 설정을 유지하고 [Recursive invocation] 을 동의하고 [추가]를 클릭합니다.

단계6. Lambda의 코드를 수정한뒤 배포

  1. 이전단계에서 만들었던 Lambda 함수에서 [코드]를 클릭합니다.
  2. 아래의 소스 코드를 붙여넣은뒤 Ctrl + S를 눌러서 저장합니다.
  3. 이후 [Deploy]를 눌러서 해당 코드를 배포합니다.
  • 해당 코드에서는 신뢰도 90% 이상의 키워드만을 저장합니다. (해당 코드의 <> 부분은 사용하시는 환경에 맞추어 설정한뒤에 사용해주세요. )
import boto3
import requests
import json

from requests_aws4auth import AWS4Auth

rekognition_client = boto3.client('rekognition')

host = '<Opensearch 도메인 엔드포인트>' 
region = '<Opensearch 도메인 리전' 
service = 'es'

def configure(host,region,service):
    host = host
    region = region
    service = service
    credentials = boto3.Session().get_credentials()
    awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)
    return awsauth

def lambda_handler(event, context):

    # S3 버킷 이름과 객체 키 가져오기
    bucket_name = event['Records'][0]['s3']['bucket']['name']
    object_key = event['Records'][0]['s3']['object']['key']

    # S3 객체에 대한 라벨 감지 요청
    response = rekognition_client.detect_labels(
        Image={
            'S3Object': {
                'Bucket': bucket_name,
                'Name': object_key
            }
        },
        MaxLabels=10  # 최대 라벨 수
    )
    # 감지된 라벨 출력
    lst=[]
    for label in response['Labels']:
        if int(label["Confidence"])>90:
            lst.append(label["Name"])
    keywords=" ".join(lst)

    credentials = boto3.Session().get_credentials()
    awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)


    index = 'product'
    datatype = '_doc'  # Change datatype to _doc
    url = host + index + '/' + datatype

    # 보낼 데이터 및 문서 지정
    headers = {"Content-Type": "application/json"}
    document = {"keywords": keywords, "image_name": object_key}
    
    print(keywords)
    try:
        r = requests.post(url, auth=awsauth, json=document, headers=headers)  # Change method to POST
        print(r)
    except Exception as e:  
        print('예외가 발생했습니다.', e)

단계7. Opensearch 보안 설정

  • 도메인 액세스 정책 수정을 아래와 같이 수정합니다.
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-west-1:123456789012:domain/domain-name/*"
    }
  ]
}
  • 추가적으로 Opensearch 대시보드에 접근하여 [Security], [Roles],[Mapped Access], [all_access]에 Lambda의 역할 ARN을 매핑합니다. 여기에 이미지 설명 입력

단계8. S3 데이터 삽입후 테스트

  • S3에 데이터를 삽입합니다.(예시. 해당 가이드에서는 아마존 쇼핑몰의 사진을 넣어서 테스트를 진행합니다.) 여기에 이미지 설명 입력

  • Opensearch의 아래의 코드를 입력하여 인덱스의 전체 내용을 확인할 수 있습니다.

GET product/_search
....
      {
        "_index" : "product",
        "_type" : "_doc",
        "_id" : "9Jk3jI0BmUvkPqOUX8vk",
        "_score" : 1.0,
        "_source" : {
          "keywords" : "Clothing Pants",
          "image_name" : "Nike_mens_NSW_Club_Joggers.jpg"
        }
      },
      {
        "_index" : "product",
        "_type" : "_doc",
        "_id" : "85k3jI0BmUvkPqOUX8sk",
        "_score" : 1.0,
        "_source" : {
          "keywords" : "Clothing Knitwear Sweater Sweatshirt Hoodie Hood Fleece",
          "image_name" : "NIKE_Pullover_Club_Hoodie.jpg"
        }
....

참고

Amazon SageMaker기반 무신사 상품 후기 이미지 자동 검수 서비스 개발 사례

https://aws.amazon.com/ko/blogs/korea/develop-an-automatic-review-image-inspection-service-with-amazon-sagemaker/

Rekognition을 활용한 서버리스 이미지 처리 방법

https://repost.aws/ko/articles/ARtg16LsVTRM-K43Ul3WaN2A/rekognition%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%84%9C%EB%B2%84%EB%A6%AC%EC%8A%A4-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%B2%98%EB%A6%AC-%EB%B0%A9%EB%B2%95

Lambda의 트리거를 이용하여 Opensearch에 데이터를 주기적으로 저장하는 방법

https://repost.aws/ko/articles/ARr-NPNbIPTWO2wBdwzZHCxw/lambda%EC%9D%98-%ED%8A%B8%EB%A6%AC%EA%B1%B0%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-opensearch%EC%97%90-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EC%A3%BC%EA%B8%B0%EC%A0%81%EC%9C%BC%EB%A1%9C-%EC%A0%80%EC%9E%A5%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

profile pictureAWS
지원 엔지니어
게시됨 3달 전751회 조회
댓글 없음

관련 콘텐츠