Skip to content

aws-samples/social-graph-based-people-recommender-using-amazon-neptune-and-textract

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

7 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Octember - Social Graph Based People Recommender Using Amazon Neptune And Textract

  • OCR(Optical Character Reconition) ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•œ ๋ช…ํ•จ ๊ด€๋ฆฌ ๋ฐ Graph database(Neptune)์„ ์ด์šฉํ•œ ์ธ๋งฅ ์ถ”์ฒœ ์„œ๋น„์Šค

Table of Contents

  1. Architecture
  2. RESTful API Specification
  3. Lambda Functions Overview
  4. Build & Deploy
  5. References & Tips
  6. Limits
  7. Demo

Architecture

octember-architecture

Key AWS Services
  • API Gateway
  • Lambda Function
  • Kinesis Data Stream
  • Kinesis Data Firehorese
  • Elasticsearch Service
  • ElastiCache
  • DynamoDB
  • Neptune (Graph database)
  • Textract
  • S3

[Top]

RESTful API Specification

Image upload
  • Request

    • PUT

      - /v1/{bucket}/{object}
      
      URL Path parameters Description Required(Yes/No) Data Type
      bucket s3 bucket ์ด๋ฆ„ Yes String
      object s3 object ์ด๋ฆ„ Yes String
    • ex) octember-use1 ๋ผ๋Š” s3 bucket์˜ bizcard-raw-img ๋””๋ ‰ํ„ฐ๋ฆฌ ์•„๋ž˜์— bar_s20191101_125236.jpg ํŒŒ์ผ์„ ์—…๋กœํ•˜๋Š” ์˜ˆ์ œ

      curl -X PUT "https://t2e7cpvqvu.execute-api.us-east-1.amazonaws.com/v1/octember-use1/bizcard-raw-img%2Fbar_s20191101_125236.jpg" \
           --data @bar_s20191101_125236.jpg
      
  • Response

    • No Data

[Top]

Search
  • Request

    • GET

      - /v1/search?query=isv&user=foobar&limit=10
      
      Key Description Required(Yes/No) Data Type
      query ๊ฒ€์ƒ‰ ์งˆ์˜์–ด (name, job title, company, address) No String
      user ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ํ•„ํ„ฐ๋ง ์กฐ๊ฑด (biz card๋ฅผ ๋“ฑ๋กํ•œ user id) No String
      limit ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ ๊ฐ’: 10) No Integer
      • (!) query ํ˜น์€ user ์ค‘ ํ•˜๋‚˜์˜ ๊ฐ’์€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•จ
    • ex)

      curl -X GET "https://gfrgyj029q.execute-api.us-east-1.amazonaws.com/v1/search?query=architect&limit=2"
      
  • Response

    • meta ๋ฐ์ดํ„ฐ

      Key Description Data Type
      _index Elasticsearch Index ์ด๋ฆ„ String
      _type Elasticsearch Type ์ด๋ฆ„ String
      _id ๋ฌธ์„œ id String
      _score ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ Relevance ์ ์ˆ˜ String
      _source JSON
    • _source ๋ฐ์ดํ„ฐ

      Key Description Data Type
      doc_id ๋ฌธ์„œ id String
      name ์ด๋ฆ„ String
      phone_number ์ „ํ™” ๋ฒˆํ˜ธ String
      email email ์ฃผ์†Œ String
      job_title ํšŒ์‚ฌ ์งํ•จ String
      company ํšŒ์‚ฌ ์ด๋ฆ„ String
      addr ํšŒ์‚ฌ ์ฃผ์†Œ String
      is_alive ๋ฌธ์„œ ์‚ญ์ œ ์—ฌ๋ถ€ ํ”Œ๋ž˜๊ทธ(0: ์‚ญ์ œ, 1: ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅํ•œ ๋ฌธ์„œ) Integer
      owner ๋ช…ํ•จ ๋“ฑ๋ก ์‚ฌ์šฉ์ž id String
      image_id ๋ช…ํ•จ ์ด๋ฏธ์ง€ ํŒŒ์ผ ์ด๋ฆ„ String
      content_id ์ค‘๋ณต ๋ฌธ์„œ ์ œ๊ฑฐ๋ฅผ ์œ„ํ•œ ๋ฌธ์„œ ๋‚ด์šฉ id String
      created_at ๋ฌธ์„œ ์ƒ์„ฑ ์‹œ๊ฐ„ String
    • ex)

      [
          {
              "_index": "octember_bizcard",
              "_type": "bizcard",
              "_id": "dfb6c487",
              "_score": 0.5619609,
              "_source": {
                  "addr": "508, Nonhyeon-ro, Gangnam-gu Seoul, 06141, Rep. of KOREA",
                  "email": "[email protected]",
                  "phone_number": "(+82 10) 2135 1294 ",
                  "company": "aws",
                  "name": "Foo Lee",
                  "job_title": "Solutions Architect",
                  "created_at": "2019-11-05T05:20:24Z",
                  "doc_id": "dfb6c487",
                  "image_id": "bar_s20191101_125236.jpg",
                  "owner": "bar",
                  "is_alive": 1,
                  "content_id": "e2c266fc"
              }
          },
          {
              "_index": "octember_bizcard",
              "_type": "bizcard",
              "_id": "8a78483a",
              "_score": 0.43445712,
              "_source": {
                  "addr": "12Floor GS Tower, 508 Nonhyeon-ro Gangnam-gu, Seoul, Korea",
                  "email": "[email protected]",
                  "phone_number": "(+82 10) 7843 3795 ",
                  "company": "aws",
                  "name": "Bar Kim",
                  "job_title": "ISV Partner Solutions Architect",
                  "created_at": "2019-11-05T05:18:28Z",
                  "doc_id": "8a78483a",
                  "image_id": "foo_j20191101_125250.jpg",
                  "owner": "foo",
                  "is_alive": 1,
                  "content_id": "3064ab8c"
              }
          }
      ]
      

[Top]

PYMK(People You May Know)
  • Request

    • GET

      - /v1/pymk?user=foo%20bar&limit=10
      
      Key Description Required(Yes/No) Data Type
      user ์ธ๋งฅ ์ถ”์ฒœ์„ ๋ฐ›๊ณ ์ž ํ•˜๋Š” ์‚ฌ์šฉ์ž ์ด๋ฆ„ Yes String
      limit ์ธ๋งฅ ์ถ”์ฒœ ๊ฒฐ๊ณผ ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ ๊ฐ’: 10) No Integer
    • ex)

      curl -X GET "https://y2xmtfbduf.execute-api.us-east-1.amazonaws.com/v1/pymk?user=foo%20bar&limit=2"
      
  • Response

    • body ๋ฐ์ดํ„ฐ

      Key Description Data Type
      name ์ด๋ฆ„ String
      phone_number ์ „ํ™” ๋ฒˆํ˜ธ String
      email email ์ฃผ์†Œ String
      job_title ํšŒ์‚ฌ ์งํ•จ String
      company ํšŒ์‚ฌ ์ด๋ฆ„ String
      score ์ธ๋งฅ ์ถ”์ฒœ ์ ์ˆ˜ Float
    • ex)

      [
          {
              "name": [
                  "Bar Lee"
              ],
              "phone_number": [
                  "(+82 10) 3025 7502 "
              ],
              "company": [
                  "aws"
              ],
              "job_title": [
                  "Solutions Architect"
              ],
              "email": [
                  "[email protected]"
              ],
              "score": 4.0
          },
          {
              "name": [
                  "Foo Kim"
              ],
              "phone_number": [
                  "(+82 10) 7315 3970 "
              ],
              "company": [
                  "aws"
              ],
              "job_title": [
                  "Partner Solutions Architect"
              ],
              "email": [
                  "[email protected]"
              ],
              "score": 3.0
          }
      ]
      

[Top]

Lambda Functions Overview

Name Description Event Source IAM Role VPC Etc
TriggerTextExtractFromS3Image biz card ์ด๋ฏธ์ง€๊ฐ€ s3์— ๋“ฑ๋ก๋˜๋ฉด, text ๋ฐ์ดํ„ฐ ์ถ”์ถœ ์ž‘์—…์„ ์‹คํ–‰ ์‹œํ‚ค๋Š” ์ž‘์—… S3 ObjectCreated Event DynamoDB Read/Write, Kinesis Data Stream Read/Write No VPC ETL
GetTextFromS3Image textract๋ฅผ ์ด์šฉํ•ด์„œ biz card ์ด๋ฏธ์ง€์—์„œ text ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋Š” ์ž‘์—… Kinesis Data Stream S3 Read/Write, DynamoDB Read/Write, Kinesis Data Stream Read/Write, Textract ETL
UpsertBizcardToES biz card์˜ text ๋ฐ์ดํ„ฐ๋ฅผ ElasticSearch์— ์ƒ‰์ธํ•˜๋Š” ์ž‘์—… Kinesis Data Stream Kinesis Data Stream Read ETL
UpsertBizcardToGraphDB biz card์˜ text ๋ฐ์ดํ„ฐ๋ฅผ graph database์— load ํ•˜๋Š” ์ž‘์—… Kinesis Data Stream Kinesis Data Stream Read ETL
SearchBizcard biz card๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒ€์ƒ‰ ์„œ๋ฒ„ API Gateway Proxy Server
RecommendBizcard PYMK(People You May Know)๋ฅผ ์ถ”์ฒœํ•ด์ฃผ๋Š” ์„œ๋ฒ„ API Gateway Proxy Server

[Top]

Data Specification

S3์— ์—…๋กœ๋“œํ•  biz card image ํŒŒ์ผ ์ด๋ฆ„ ํ˜•์‹
  • {user_id}_{image_id}.jpg

    ex) foobar_i592134.jpg

  • {user_id} ๋Š” octember ์„œ๋น„์Šค์— ๊ฐ€์ž…ํ•œ ํšŒ์› ์•„์ด๋””
GetTextFromS3Image In/Output Data
  • Input
    • {"s3_bucket": "{bucket name}", "s3_key": "{object key}"}

      ex) {"s3_bucket": "octember-use1", "s3_key": "bizcard-raw-img/foobar_i592134.jpg"}

  • Output
    • json data format
       {
        "s3_bucket": "{bucket name}",
        "s3_key": "{object key}",
        "owner": "{user_id}",
        "data": {
          "addr": "{address}",
          "email": "{email address}",
          "phone_number": "{phone number}",
          "company": "{company name}",
          "name": "{full name}",
          "job_title": "{job title}",
          "created_at": "{created datetime}"
         }
       }
      
    • ex)
       {
        "s3_bucket": "octember-use1",
        "s3_key": "bizcard-raw-img/foobar_i592134.jpg",
        "owner": "foobar",
        "data": {
          "addr": "12Floor GS Tower, 508 Nonhyeon-ro, Gangnam-gu, Seoul 06141, Korea",
          "email": "[email protected]",
          "phone_number": "(+82 10) 1025 7049",
          "company": "aws",
          "name": "Foo Bar",
          "job_title": "Solutions Architect",
          "created_at": "2019-10-25T01:12:54Z"
         }
       }
      

[Top]

UpsertBizcardToES In/Output Data
  • Input
    • GetTextFromS3Image output data ์ฐธ๊ณ 
  • Output
    • json data format
       {
         "doc_id": "md5({image file name})",
         "image_id": "{image file name}",
         "is_alive": {0 - dead, 1 - alive(default)},
         "addr": "{address}",
         "email": "{email address}",
         "phone_number": "{phone number}",
         "company": "{company name}",
         "name": "{full name}",
         "job_title": "{job title}",
         "created_at": "{created datetime}"
       }
      
    • ex)
       {
         "doc_id": "21cf827e",
         "image_id": "foobar_i592134.jpg",
         "is_alive": 1,
         "addr": "12Floor GS Tower, 508 Nonhyeon-ro, Gangnam-gu, Seoul 06141, Korea",
         "email": "[email protected]",
         "phone_number": "(+82 10) 1025 7049",
         "company": "aws",
         "name": "Foo Bar",
         "job_title": "Solutions Architect",
         "created_at": "2019-10-25T01:12:54Z"
       }
      

[Top]

UpsertBizcardToGraphDB In/Output Data
  • Input
    • GetTextFromS3Image output data ์ฐธ๊ณ 
  • Output
    • Neptune Schema ์ฐธ๊ณ 

[Top]

S3 Bucket ๋ฐ Directory ๊ตฌ์กฐ
Bucket Folder Description
{bucket name} bizcard-raw-img ์‚ฌ์šฉ์ž๊ฐ€ ์—…๋กœ๋“œํ•œ biz card image ์›๋ณธ ์ €์žฅ์†Œ
{bucket name} bizcard-by-user/{user_id} ์—…๋กœ๋“œ๋œ biz card image๋ฅผ ์‚ฌ์šฉ์ž๋ณ„๋กœ ๋ณ„๋„๋กœ ๋ณด๊ด€ํ•˜๋Š” ์ €์žฅ์†Œ
{bucket name} bizcard-text/{YYYY}/{mm}/{dd}/{HH} biz card image์—์„œ ์ถ”์ถœํ•œ text ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ; ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ์žฌ์ƒ‰์ธ ๋ฐ ๋ฐฐ์น˜ ํ˜•ํƒœ์˜ ํ…์ŠคํŠธ ๋ถ„์„์„ ์œ„ํ•œ ๋ฐฑ์—… ์ €์žฅ์†Œ

[Top]

DynamoDB Schema
primary key(partition key) s3_bucket s3_key mts status
{user_id}_{image_id}.jpg s3 bucket s3 object key last modified time(yyyymmddHHMMSS) processing status {START, PROCESSING, END}
foobar_i592134.jpg octember-use1 bizcard-raw-img/foobar_i592134.jpg 20191025011254 END

[Top]

Neptune Schema
  • Vertex
Vertex Label Property Description
person id, name, email, phone_number, job_title, company biz card์— ์žˆ๋Š” ์ธ๋ฌผ ์ •๋ณด
person
{
"id": "3858f622",
"name": "Foo Bar",
"_name": "foo bar",
"email": "[email protected]",
"phone_number": "(+82 10) 1025 7049",
"job_title": "Solutions Architect",
"company": "aws"
}
  • Edge
Edge Label Property Description
knows weight biz card๋ฅผ ์ฃผ๊ณ  ๋ฐ›์€ ์‚ฌ๋žŒ๋“ค ๊ฐ„์˜ ๊ด€๊ณ„ (weight: ๊ด€๊ณ„์˜ ์ค‘์š”๋„)
knows {"weight": 1.0}

[Top]

How To Build & Deploy

(1) aws cdk๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

Prerequisites
  1. Getting Started With the AWS CDK๋ฅผ ์ฐธ๊ณ ํ•ด์„œ cdk๋ฅผ ์„ค์น˜ํ•˜๊ณ , cdk๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•  IAM User๋ฅผ ์ƒ์„ฑํ•œ ํ›„, ~/.aws/config์— ๋“ฑ๋กํ•จ ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, cdk_user๋ผ๋Š” AdministratorAccess ๊ถŒํ•œ์„ ๊ฐ–๋Š” IAM User๋ฅผ ์ƒ์„ฑ ํ•œ ํ›„, ์•„๋ž˜์™€ ๊ฐ™์ด ~/.aws/config์— ์ถ”๊ฐ€๋กœ ๋“ฑ๋กํ•จ

    $ cat ~/.aws/config
    [profile cdk_user]
    aws_access_key_id=AKIAI44QH8DHBEXAMPLE
    aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
    region=us-east-1
  2. Lambda Layer์— ๋“ฑ๋กํ•  Python ํŒจํ‚ค์ง€๋ฅผ ์ƒ์„ฑํ•ด์„œ s3 bucket์— ์ €์žฅํ•จ. ์˜ˆ๋ฅผ ๋“ค์–ด, elasticsearch, gremlinpython, redis ํŒจํ‚ค์ง€๋ฅผ Lambda Layer์— ๋“ฑ๋ก ํ•  ์ˆ˜ ์žˆ๋„๋ก octember-resources๋ผ๋Š” ์ด๋ฆ„์˜ s3 bucket์„ ์ƒ์„ฑ ํ›„, ์•„๋ž˜์™€ ๊ฐ™์ด ์ €์žฅํ•จ.

    $ aws s3 ls s3://octember-resources/var/
    2019-10-25 08:38:50          0
    2019-10-25 08:40:28    1294387 octember-es-lib.zip
    2019-10-29 08:35:28    1311836 octember-gremlinpython-lib.zip
    2019-10-30 07:41:07     141534 octember-redis-lib.zip

    ์ฐธ๊ณ : AWS Lambda Layer์— ๋“ฑ๋กํ•  Python ํŒจํ‚ค์ง€ ์ƒ์„ฑ ์˜ˆ์ œ

  3. cdk๋ฅผ ์ด์šฉํ•ด์„œ Amazon ElasticSearch Service๋ฅผ VPC ๋‚ด์— ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด Amazon ElasticSearch Service๋ฅผ ์œ„ํ•œ service linked role ์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•œ๋‹ค.

     $ aws iam create-service-linked-role --aws-service-name es.amazonaws.com
  4. ์†Œ์Šค ์ฝ”๋“œ๋ฅผ git์—์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ ํ›„, cdk.context.json ํŒŒ์ผ์— lib_bucket_name ๋ผ๋Š” key ๊ฐ’์œผ๋กœ lambda layer์— ๋“ฑ๋กํ•  ํŒจํ‚ค์ง€๊ฐ€ ์ €์žฅ๋œ s3 bucket ์ด๋ฆ„์„ ์„ค์ • ํ•œ ํ›„, cdk deploy ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐฐํฌํ•จ

    $ git clone [email protected]:aws-samples/social-graph-based-people-recommender-using-amazon-neptune-and-textract.git
    $ cd octember-bizcard
    $ cat <<EOF > cdk.context.json
    > {
    >   "lib_bucket_name": "octember-resources"
    > }
    > EOF
    $ python3 -m venv .env
    $ source .env/bin/activate
    (.env) $ pip install -r requirements.txt
    (.env) $ cdk --version
    2.10.0 (build e5b301f)
    (.env) $ cdk context -j
    {
      "lib_bucket_name": "octember-resources"
    }
    (.env) $ export CDK_DEFAULT_ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
    (.env) $ export CDK_DEFAULT_REGION=us-east-1
    (.env) $ cdk bootstrap aws://${CDK_DEFAULT_ACCOUNT}/${CDK_DEFAULT_REGION}
    (.env) $ cdk --profile=cdk_user synth
      Resources:
        OctemberVPC04CAC20C:
          Type: AWS::EC2::VPC
          Properties:
            CidrBlock: 10.0.0.0/16
            EnableDnsHostnames: true
            EnableDnsSupport: true
            InstanceTenancy: default
    
      ......
    
        AssetParametersa05ca8352deadc2f1972c4fb21555d99120d0510cccb81d30b285153803df7ddS3VersionKey52AC24C7:
          Type: String
          Description: S3 key for asset version "a05ca8352deadc2f1972c4fb21555d99120d0510cccb81d30b285153803df7dd"
        AssetParametersa05ca8352deadc2f1972c4fb21555d99120d0510cccb81d30b285153803df7ddArtifactHashEF43BE8F:
          Type: String
          Description: Artifact hash for asset "a05ca8352deadc2f1972c4fb21555d99120d0510cccb81d30b285153803df7dd"
        SsmParameterValueawsserviceamiamazonlinuxlatestamzn2amihvmx8664gp2C96584B6F00A464EAD1953AFF4B05118Parameter:
          Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
          Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
    
    (.env) $ cdk --profile=cdk_user deploy

    โœ… cdk bootstrap ... ๋ช…๋ น์–ด๋Š” CDK toolkit stack ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด ์ตœ์ดˆ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰ ํ•˜๊ณ , ์ดํ›„์— ๋ฐฐํฌํ•  ๋•Œ๋Š” CDK toolkit stack ๋ฐฐํฌ ์—†์ด cdk deploy ๋ช…๋ น์–ด๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  5. ๋ฐฐํฌํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ญ์ œํ•˜๋ ค๋ฉด, cdk destroy ๋ช…๋ น์–ด๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์‹คํ–‰

    (.env) $ cdk --profile=cdk_user destroy

    โœ… cdk destroy ๋ฅผ ์ˆ˜ํ–‰ ์‹œ, CloudWatch Log Groups, S3 Bucket, DynamoDB ํ…Œ์ด๋ธ”์€ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋ฐ˜๋“œ์‹œ ์ง์ ‘ ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Useful CDK commands
  • cdk ls list all stacks in the app
  • cdk synth emits the synthesized CloudFormation template
  • cdk deploy deploy this stack to your default AWS account/region
  • cdk diff compare deployed stack with current state
  • cdk docs open CDK documentation

[Top]

(2) aws ์›น console์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

Image upload
  1. s3 bucket์„ ์ƒ์„ฑํ•จ; ์˜ˆ๋ฅผ ๋“ค์–ด์„œ us-east-1 ๋ฆฌ์ „์— octember-use1 ๋ผ๋Š” ์ด๋ฆ„์˜ bucket์„ ์ƒ์„ฑํ•จ
  2. ์ƒ์„ฑ๋œ s3 bucket ์•ˆ์— bizcard-raw-img, bizcard-by-user ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•จ
    $ aws s3 ls s3://octember-use1/
      PRE bizcard-by-user/
      PRE bizcard-raw-img/
    
  3. API Gateway + S3๋ฅผ ์ฐธ๊ณ ํ•ด์„œ s3์— ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œ ํ•˜๋Š” RESTful API๋ฅผ ์ƒ์„ฑํ•จ
  4. Kinesis Data Stream๋ฅผ ์ฐธ๊ณ ํ•ด์„œ octember-bizcard-img ์ด๋ฆ„์˜ Kinesis Data Stream์„ ์ƒ์„ฑํ•จ
  5. DynamoDB๋ฅผ ์ฐธ๊ณ ํ•ด์„œ OctemberBizcardImg ์ด๋ฆ„์˜ DynamoDB ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•จ; primary partition key๋ฅผ string ํƒ€์ž…์œผ๋กœ ํ•˜๊ณ , ์ด๋ฆ„์€ image_id ๋ผ๊ณ  ์„ค์ •ํ•จ
  6. Lambda๋ฅผ ์ฐธ๊ณ ํ•ด์„œ TriggerTextExtractFromS3Image ๋ผ๋Š” lambda function์„ ์ƒ์„ฑํ•˜๊ณ , TriggerTextExtractFromS3Image ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ด์„œ lambda function code์— ๋“ฑ๋กํ•จ
  7. TriggerTextExtractFromS3Image ์ƒ์„ฑ ์‹œ, REGION_NAME, KINESIS_STREAM_NAME, DDB_TABLE_NAME ๋“ฑ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋ฆฌ์ „ ์ด๋ฆ„, Kinesis Data Stream ์ด๋ฆ„, DynamoDB ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ ์•Œ๋งž๊ฒŒ ์„ค์ •ํ•จ
    ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ฐ’์„ ์„ค์ •ํ•จ
    REGION_NAME=us-east-1
    KINESIS_STREAM_NAME=octember-bizcard-img
    DDB_TABLE_NAME=OctemberBizcardImg
    
  8. Kinesis Data Stream๋ฅผ ์ฐธ๊ณ ํ•ด์„œ octember-bizcard-text ์ด๋ฆ„์œผ๋กœ Kinesis Data Stream์„ ์ƒ์„ฑํ•จ
  9. Lambda๋ฅผ ์ฐธ๊ณ ํ•ด์„œ GetTextFromS3Image ๋ผ๋Š” lambda function์„ ์ƒ์„ฑํ•˜๊ณ , GetTextFromS3Image ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ด์„œ lambda function code์— ๋“ฑ๋กํ•จ
  10. GetTextFromS3Image ์ƒ์„ฑ ์‹œ, REGION_NAME, KINESIS_STREAM_NAME, DDB_TABLE_NAME ๋“ฑ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋ฆฌ์ „ ์ด๋ฆ„, Kinesis Data Stream ์ด๋ฆ„, DynamoDB ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ ์•Œ๋งž๊ฒŒ ์„ค์ •ํ•จ
    ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ฐ’์„ ์„ค์ •ํ•จ
    REGION_NAME=us-east-1
    KINESIS_STREAM_NAME=octember-bizcard-text
    DDB_TABLE_NAME=OctemberBizcardImg
    

[Top]

Search
  1. Elasticsearch Service๋ฅผ ์ฐธ๊ณ ํ•ด์„œ VPC ๋‚ด์— octember ๋ผ๋Š” domain ์ด๋ฆ„์œผ๋กœ Elasticsearch cluster๋ฅผ ์ƒ์„ฑํ•จ
  2. Kinesis Data Firehorse๋ฅผ ์ฐธ๊ณ ํ•ด์„œ Source๋ฅผ octember-bizcard-text, Destination์„ s3 bucket(์˜ˆ: octember-use1)์œผ๋กœ ์„ค์ •ํ•จ
    s3 destination์˜ prefix๋ฅผ bizcard-text/ ๋กœ ์„ค์ •ํ•จ
  3. Lambda๋ฅผ ์ฐธ๊ณ ํ•ด์„œ UpsertBizcardToES ๋ผ๋Š” lambda function์„ ์ƒ์„ฑํ•˜๊ณ , UpsertBizcardToES ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ด์„œ lambda function code์— ๋“ฑ๋กํ•จ
  4. UpsertBizcardToES ์ƒ์„ฑ ์‹œ, REGION_NAME, ES_HOST ๋“ฑ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋ฆฌ์ „ ์ด๋ฆ„, Elasticsearch cluster endpoint ์ฃผ์†Œ๋ฅผ ์•Œ๋งž๊ฒŒ ์„ค์ •ํ•จ
    ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ฐ’์„ ์„ค์ •ํ•จ
    REGION_NAME=us-east-1
    ES_HOST=https://vpc-octember-ykpng6bf4qn1599enqv2f7rikf.us-east-1.es.amazonaws.com
    
  5. ElasitCache๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ฒ€์ƒ‰ ์งˆ์˜ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹ฑํ•˜๊ธฐ ์œ„ํ•œ ์บ์‰ฌ ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•จ
    ์—๋ฅผ ๋“ค์–ด octember-es-cache ๋ผ๋Š” ์ด๋ฆ„์˜ Redis๋ฅผ ์ƒ์„ฑํ•จ
  6. Lambda๋ฅผ ์ฐธ๊ณ ํ•ด์„œ SearchBizcard ๋ผ๋Š” ๊ฒ€์ƒ‰ ์„œ๋ฒ„๋กœ ์‚ฌ์šฉํ•  lambda function์„ ์ƒ์„ฑํ•˜๊ณ , SearchBizcard ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ด์„œ lambda function code์— ๋“ฑ๋กํ•จ
  7. SearchBizcard ์ƒ์„ฑ ์‹œ, REGION_NAME, ES_HOST, ELASTICACHE_HOST ๋“ฑ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋ฆฌ์ „ ์ด๋ฆ„, Elasticsearch cluster endpoint ์ฃผ์†Œ, ElastiCache endpoint ์ฃผ์†Œ๋ฅผ ์•Œ๋งž๊ฒŒ ์„ค์ •ํ•จ
    ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ฐ’์„ ์„ค์ •ํ•จ
    REGION_NAME=us-east-1
    ES_HOST=https://vpc-octember-ykpng6bf4qn1599enqv2f7rikf.us-east-1.es.amazonaws.com
    ELASTICACHE_HOST=octember-es-cache.xqep4c.0001.use1.cache.amazonaws.com
    
  8. ๊ฒ€์ƒ‰ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ API Gateway + Lambda๋ฅผ ์ฐธ๊ณ ํ•ด์„œ api gateway์™€ SearchBizcard ๋ผ๋Š” lambda function์„ ๋™ํ•ฉํ•œ RESTful API๋ฅผ ์ƒ์„ฑํ•จ

[Top]

PYMK(People You May Know)
  1. Neptune๋ฅผ ์ฐธ๊ณ ํ•ด์„œ VPC ๋‚ด์— octember-bizcard ๋ผ๋Š” ์ด๋ฆ„์˜ graph database๋ฅผ ์ƒ์„ฑํ•จ
  2. Lambda๋ฅผ ์ฐธ๊ณ ํ•ด์„œ UpsertBizcardToGraphDB ๋ผ๋Š” lambda function์„ ์ƒ์„ฑํ•˜๊ณ , UpsertBizcardToGraphDB ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ด์„œ lambda function code์— ๋“ฑ๋กํ•จ
  3. UpsertBizcardToGraphDB ์ƒ์„ฑ ์‹œ, REGION_NAME, NEPTUNE_ENDPOINT ๋“ฑ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋ฆฌ์ „ ์ด๋ฆ„, Neptune endpoint ์ฃผ์†Œ๋ฅผ ์•Œ๋งž๊ฒŒ ์„ค์ •ํ•จ
    ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ฐ’์„ ์„ค์ •ํ•จ
    REGION_NAME=us-east-1
    NEPTUNE_ENDPOINT=octember-bizcard.64ocu93lfjfj.us-east-1.neptune.amazonaws.com
    
  4. ElasitCache๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ์ธ๋งฅ ์ถ”์ฒœ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹ฑํ•˜๊ธฐ ์œ„ํ•œ ์บ์‰ฌ ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•จ
    ์—๋ฅผ ๋“ค์–ด octember-neptune-cache ๋ผ๋Š” ์ด๋ฆ„์˜ Redis๋ฅผ ์ƒ์„ฑํ•จ
  5. Lambda๋ฅผ ์ฐธ๊ณ ํ•ด์„œ RecommendBizcard ๋ผ๋Š” ๊ฒ€์ƒ‰ ์„œ๋ฒ„๋กœ ์‚ฌ์šฉํ•  lambda function์„ ์ƒ์„ฑํ•˜๊ณ , RecommendBizcard ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ด์„œ lambda function code์— ๋“ฑ๋กํ•จ
  6. RecommendBizcard ์ƒ์„ฑ ์‹œ, REGION_NAME, NEPTUNE_ENDPOINT, ELASTICACHE_HOST ๋“ฑ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋ฆฌ์ „ ์ด๋ฆ„, Neptune endpoint ์ฃผ์†Œ, ElastiCache endpoint ์ฃผ์†Œ๋ฅผ ์•Œ๋งž๊ฒŒ ์„ค์ •ํ•จ
    ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ฐ’์„ ์„ค์ •ํ•จ
    REGION_NAME=us-east-1
    NEPTUNE_ENDPOINT=octember-bizcard.64ocu93lfjfj.us-east-1.neptune.amazonaws.com
    ELASTICACHE_HOST=octember-neptune-cache.2rb5x2.0001.use1.cache.amazonaws.com
    
  7. ์ธ๋งฅ ์ถ”์ฒœ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ API Gateway + Lambda๋ฅผ ์ฐธ๊ณ ํ•ด์„œ api gateway์™€ RecommendBizcard ๋ผ๋Š” lambda function์„ ๋™ํ•ฉํ•œ RESTful API๋ฅผ ์ƒ์„ฑํ•จ

[Top]

References & Tips

Lambda
  • ์ž์Šต์„œ: Amazon S3๊ณผ ํ•จ๊ป˜ AWS Lambda ์‚ฌ์šฉ
  • AWS Lambda ๊ณ„์ธต
  • Lambda Layer์— ๋“ฑ๋กํ•  Elasticsearch Python ํŒจํ‚ค์ง€ ์ƒ์„ฑ ์˜ˆ์ œ
    • virtualenv๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
      $ python3 -m venv es-lib # virtual environments์„ ์ƒ์„ฑํ•จ
      $ cd es-lib
      $ source bin/activate
      (es-lib) $ mkdir -p python_modules # ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์ €์žฅํ•  ๋””๋ ‰ํ„ฐ๋ฆฌ ์ƒ์„ฑ
      (es-lib) $ pip install 'elasticsearch>=7.0.0,<7.11' requests requests-aws4auth -t python_modules # ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ํŒจํ‚ค์ง€ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ €์žฅํ•จ
      (es-lib) $ deactivate
      $ mv python_modules python # ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ํŒจํ‚ค์ง€ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„์„ python์œผ๋กœ ๋ณ€๊ฒฝํ•จ (python ๋””๋ ‰ํ„ฐ๋ฆฌ์— ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๊ฒฝ์šฐ ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์ด๋ฆ„์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ ํ›„, ๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•จ)
      $ zip -r es-lib.zip python/ # ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๊ฐ€ ์„ค์น˜๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์••์ถ•ํ•จ
      $ aws s3 mb s3://my-bucket-for-lambda-layer-packages # ์••์ถ•ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์—…๋กœ๋“œํ•  s3 bucket์„ ์ƒ์„ฑํ•จ
      $ aws s3 cp es-lib.zip s3://my-bucket-for-lambda-layer-packages/var/ # ์••์ถ•ํ•œ ํŒจํ‚ค์ง€๋ฅผ s3์— ์—…๋กœ๋“œ ํ•œ ํ›„, lambda layer์— ํŒจํ‚ค์ง€๋ฅผ ๋“ฑ๋กํ•  ๋•Œ, s3 ์œ„์น˜๋ฅผ ๋“ฑ๋กํ•˜๋ฉด ๋จ
    • Docker๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• - How do I create a Lambda layer using a simulated Lambda environment with Docker?
      $ cat <<EOF > requirements.txt
      > elasticsearch>=7.0.0,<7.11
      > requests==2.23.0
      > requests-aws4auth==0.9
      > EOF
      $ docker run -v "$PWD":/var/task "public.ecr.aws/sam/build-python3.7" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.7/site-packages/; exit"
      $ zip -r es-lib.zip python > /dev/null
      $ aws s3 mb s3://my-bucket-for-lambda-layer-packages
      $ aws s3 cp es-lib.zip s3://my-bucket-for-lambda-layer-packages/var/
      
API Gateway + S3
  • ์ž์Šต์„œ: API Gateway์—์„œ Amazon S3 ํ”„๋ก์‹œ๋กœ REST API ์ƒ์„ฑ
  • (API Gateway ๊ธฐ๋ณธ ํƒ์ƒ‰ ์ฐฝ์—์„œ) API์˜ Settings์—์„œ Binary Media Types์— ํ•„์š”ํ•œ ๋ฏธ๋””์–ด ์œ ํ˜•(์˜ˆ: image/png, image/jpg)์„ ์ž…๋ ฅ ํ›„ ์ €์žฅํ•จ
  • S3์— ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ ํ†ตํ•ฉ ์š”์ฒญ(Integration Request)์˜ HTTP Headers์—์„œ x-amz-acl ํ—ค๋Š” ์ƒ๋žตํ•˜๊ฑฐ๋‚˜ ์˜ฌ๋ฐ”๋ฅธ ACL ๊ฐ’์„ ์„ค์ •ํ•ด์•ผ ํ•จ
  • ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ๋‹ค์šด๋กœ๋“œํ•˜๋ ค๋ฉด, ํ†ตํ•ฉ ์š”์ฒญ(์—…๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ) ๋ฐ ํ†ตํ•ฉ ์‘๋‹ต(๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ)์—์„œ ์ฝ˜ํ…์ธ  ์ฒ˜๋ฆฌ(Content Handling)๋ฅผ Convert to binary (if needed) ๋กœ ์„ค์ •ํ•ด์•ผ ํ•จ
API Gateway + Lambda
Textract
Elasticsearch Service
DynamoDB
S3(Simple Storage Service)
Neptune
Kinesis Data Stream
Kinesis Data Firehorse
ElasitCache
VPC

[Top]

Limits

  • Amazon Textract ์„œ๋น„์Šค๊ฐ€ ์ง€์›ํ•˜๋Š” ์–ธ์–ด๊ฐ€ ์ œํ•œ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ™•์ธ ํ›„ ์‚ฌ์šฉ์ด ํ•„์š”ํ•จ (ํ•œ๊ตญ์–ด๋Š” ํ˜„์žฌ 2019-11-11 ๊นŒ์ง€ ์ง€์›๋˜์ง€ ์•Š๊ณ  ์žˆ์Œ)
  • ๋ช…ํ•จ ์ด๋ฏธ์ง€(jpeg/png) ํฌ๊ธฐ๋Š” 5MB ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•จ
  • Amazon Kinesis Data Firehose๋Š” ํ˜„์žฌ (2019-11-11) VPC ๋‚ด์— ์žˆ๋Š” Elasticsearch domains์— ๋ฐ์ดํ„ฐ๋ฅผ loading ํ•˜๋Š” ๊ฒƒ์€ ์ง€์› ํ•˜์ง€ ์•Š์Œ

    Note: Amazon Kinesis Data Firehose currently doesn't support VPC domains.

  • Amazon Kinesis Data Firehose adds support for streaming data delivery to an Amazon Elasticsearch Service domain in an Amazon Virtual Private Cloud (VPC) (2020-04-24)

[Top]

Demo

๋ช…ํ•จ ์ด๋ฏธ์ง€๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์‚ฌ์ „ ์ค€๋น„ ์ž‘์—…

    1. ๋‹ค์Œ๊ณผ ๊ฐ™์€ IAM Policy๋ฅผ ๊ฐ–๋Š” IAM User๋ฅผ ์ƒ์„ฑํ•จ.
      ๊ณผ ๋Š” ๊ฐ์ž์˜ AWS ์ ์ ˆ ํ•˜๊ฒŒ ์ˆ˜์ •ํ•จ.
      {
         "Version": "2012-10-17",
         "Statement": [
          {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
              "s3:getObject*",
              "s3:listObject*",
              "s3:PutObject",
              "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::octember-bizcard-<availability-zone>-<account-id>/bizcard-raw-img/*"
          },
          {
            "Effect": "Allow",
            "Action": [
              "execute-api:Invoke",
              "execute-api:ManageConnections"
            ],
            "Resource": "arn:aws:execute-api:*:*:*"
          }
        ]
      }
      ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด us-east-1 ์ด๊ณ , ์— 123456789012 ๋ผ๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์€ IAM Policy๋ฅผ ๊ฐ–๋Š” IAM User๋ฅผ ์ƒ์„ฑํ•จ.
      {
         "Version": "2012-10-17",
         "Statement": [
          {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
              "s3:getObject*",
              "s3:listObject*",
              "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::octember-bizcard-us-east-1-123456789012/bizcard-raw-img/*"
          },
          {
            "Effect": "Allow",
            "Action": [
              "execute-api:Invoke",
              "execute-api:ManageConnections"
            ],
            "Resource": "arn:aws:execute-api:*:*:*"
          }
        ]
      }
    2. ์•ž์„œ ์ƒ์„ฑํ•œ IAM User (์˜ˆ: octember-bizcard-uploader)์˜ AccessKey, SecretKey๋ฅผ ๋กœ์ปฌ PC์— ๋‹ค์šด๋กœ๋“œ ํ•จ.
  • Postman์„ ์ด์šฉํ•ด์„œ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ API๋กœ ๋ช…ํ•จ์„ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•

    1. Postman์—์„œ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด Authorization ํƒญ์—์„œ TYPE์„ AWS Signature๋กœ ์„ ํƒํ•˜๊ณ , S3 Read/Write ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž (์˜ˆ: octember-bizcard-uploader)์˜ AccessKey, SecretKey๋ฅผ ๋“ฑ๋กํ•˜๊ณ , AWS Region์„ ์„ค์ •ํ•จ
      octember-bizcard-img-uploader-01
    2. Headers ํƒญ์„ ์„ ํƒํ•˜๊ณ , Key, Value๋ฅผ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ถ”๊ฐ€ํ•จ
      octember-bizcard-img-uploader-02
    3. Body ํƒญ์—์„œ binary๋ฅผ ์„ ํƒํ•˜๊ณ , Select File ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์„œ, ์ „์†กํ•  ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•จ
      octember-bizcard-img-uploader-02
    4. ์ „์†กํ•  ์ด๋ฏธ์ง€ ํŒŒ์ผ์ด ์ถ”๊ฐ€ํ•œ ํ›„, Send ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์„œ PUT ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•จ
      octember-bizcard-img-uploader-02

[Top]

Demo Scenario
  1. OctemberTM ์‚ฌ์šฉ์ž๋ณ„๋กœ ์ž์‹ ์˜ ๋ช…ํ•จ ์ด๋ฏธ์ง€๋ฅผ ํ•˜๋‚˜์”ฉ ๋“ฑ๋กํ•จ;
    ์˜ˆ๋ฅผ ๋“ค์–ด samples ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ edy_a0653895773.jpg, poby_a5411145874.jpg, pororo_a2553858703.jpg ๋ช…ํ•จ ์ด๋ฏธ์ง€๋ฅผ ๋“ฑ๋กํ•จ
    ๋ฐ˜๋“œ์‹œ edy_a0653895773.jpg, poby_a5411145874.jpg, pororo_a2553858703.jpg ๋ช…ํ•ญ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ๋“ฑ๋กํ•ด์•ผ ํ•จ
    octember-bizcard-sample.png
  2. OctemberTM ์‚ฌ์šฉ์ž๋ณ„๋กœ ๊ฐ์ž ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ช…ํ•จ ์ด๋ฏธ์ง€๋ฅผ ๋“ฑ๋กํ•จ;
    ์˜ˆ๋ฅผ ๋“ค์–ด OctemberTM ์‚ฌ์šฉ์ž Edy Kim์˜ ๋ช…ํ•จ ์ด๋ฏธ์ง€ edy_cr8677419714.jpg, edy_ha3800766762.jpg, edy_pb5411145874.jpg ์„ ๋“ฑ๋กํ•œ ํ›„, ๋‚˜๋จธ์ง€ ์‚ฌ์šฉ์ž๋“ค(Poby Kim, Pororo Kim)์˜ ๋ช…ํ•จ ์ด๋ฏธ์ง€๋„ ๋“ฑ๋กํ•จ
  3. samples ๋””๋ ‰ํ„ฐ๋ฆฌ ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ๋ช…ํ•จ์„ ๋“ฑ๋กํ•˜๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์€ ์ธ๋งฅ ๊ด€๊ณ„๊ฐ€ ์ƒ์„ฑ๋จ demo-octember-bizcard-network.png
  4. ๋“ฑ๋ก๋œ ๋ช…ํ•จ์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ์ž ์ด๋ฆ„์ด๋‚˜ ์ง์žฅ๋ช…, ์ง๋ฌด(Job title) ๋“ฑ์œผ๋กœ ๊ฒ€์ƒ‰ํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•จ demo-octember-bizcard-search.png
  5. ์ธ๋งฅ ์ถ”์ฒœ api๋ฅผ ์ด์šฉํ•ด์„œ OctemberTM ํšŒ์›์—๊ฒŒ ์ถ”์ฒœํ•  ๋งŒํ•œ ์‚ฌ๋žŒ์„ ์ฐพ์•„๋ด„ demo-octember-bizcard-pymk.png

[Top]

Security

See CONTRIBUTING for more information.

License

This library is licensed under the MIT-0 License. See the LICENSE file.

About

biz card management & social network analysis system (PoC version a.k.a Remember)

Topics

Resources

License

Code of conduct

Security policy

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •