top of page

์ œ๋กœ ์ฝœ๋ผ, ์ œ๋กœ ๋งฅ์ฃผ ๊ทธ๋ฆฌ๊ณ  ์ œ๋กœ ETL : DynamoDB์™€ OpenSearch Zero-ETL ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์„ ํ•œ ๋ฒˆ์—

  • 2024๋…„ 6์›” 18์ผ
  • 3๋ถ„ ๋ถ„๋Ÿ‰

์ตœ์ข… ์ˆ˜์ •์ผ: 2024๋…„ 6์›” 18์ผ

์ œ๋กœ ์ฝœ๋ผ, ์ œ๋กœ ๋งฅ์ฃผ ๊ทธ๋ฆฌ๊ณ  ์ œ๋กœ ETL: DynamoDB์™€ OpenSearch Zero-ETL๋กœ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์„ ํ•œ ๋ฒˆ์—

์ œ๋กœ ์ฝœ๋ผ, ์ œ๋กœ ๋งฅ์ฃผ ๊ทธ๋ฆฌ๊ณ  ์ œ๋กœ ETL: DynamoDB์™€ OpenSearch Zero-ETL๋กœ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์„ ํ•œ๋ฒˆ์—

Written by Hyejin Jeon


์•ˆ๋…•ํ•˜์„ธ์š”, ์Šค๋งˆ์ผ์ƒคํฌ์˜ ์ „ํ˜œ์ง„์ž…๋‹ˆ๋‹ค.

AWS์˜ Zero-ETL ๊ธฐ๋Šฅ์ด 2023๋…„ 11์›” ์ •์‹ ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ๋กœ ์ฝœ๋ผ, ์ œ๋กœ ๋งฅ์ฃผ์— ์ด์–ด๊ฒฐ๊ตญ Zero-ETL๋„ ์ถœ์‹œ๋˜์—ˆ๋„ค์š”..


์˜ค๋Š˜์€ Zero-ETL ๊ธฐ๋Šฅ์ด ๋ฌด์—‡์ธ์ง€ ์‚ดํŽด๋ณด๊ณ , ์–ผ๋งˆ๋‚˜ ํŽธ๋ฆฌํ•˜๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ง์ ‘ ์‹ค์Šต์œผ๋กœ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.



Zero-ETL์ด๋ž€

Zero-ETL์ด๋ž€

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ณ ๊ฐ ์ฃผ๋ฌธ ๋ฐ์ดํ„ฐ๋ฅผ Aurora MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ํŒ๋งค ๋™ํ–ฅ์„ ํŒŒ์•…ํ•˜๊ณ , ์žฌ๊ณ  ๊ด€๋ฆฌ๋‚˜ ๋งˆ์ผ€ํŒ… ์ „๋žต์„ ์„ธ์šฐ๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค ์„œ๋น„์Šค์ธ Amazon Redshift๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ฒจ์•ผ ํ•˜๋Š”๋ฐ์š”,


๊ธฐ์กด์—๋Š” DMS, Glue์™€ ๊ฐ™์€ ์„œ๋น„์Šค๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๊ณ  ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ๋ณ€ํ™˜ํ•˜๊ณ  Redshift์— ๋กœ๋“œํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.


Zero-ETL์€ ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ตœ์†Œํ™”ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค.


AWS๊ฐ€ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ๋ฐ ๋กœ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ๋ณ„๋„์˜ ETL ๊ณผ์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋งŒํผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฑฐ์˜ ์‹ค์‹œ๊ฐ„์œผ๋กœ Redshift๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Zero-ETL์„ ์‚ฌ์šฉํ•˜๋Š” ๋น„์šฉ์€ ๋ฌด๋ฃŒ์ด๊ณ , ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง์ด๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•„์š”ํ•œ ํ…Œ์ด๋ธ”๋งŒ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด๋ณด๋‹ค ํ›จ์”ฌ ๋น„์šฉ์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



DynamoDB์™€ OpenSearch์˜ Zero-ETL

Aurora์™€ Redshift๋ฟ๋งŒ ์•„๋‹ˆ๋ผ DynamoDB์™€ Amazon OpenSearch ๊ฐ„์˜ Zero-ETL๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


DynamoDB๋Š” ์™„์ „ ๊ด€๋ฆฌํ˜• NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋น„์Šค๋กœ ์ฃผ๋กœ ์‹ค์‹œ๊ฐ„ ํŠธ๋žœ์žญ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.


๊ฐ€๊ฒฉ ๋Œ€๋น„ ์„ฑ๋Šฅ์ด ์ข‹์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด์ง€๋งŒ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜์ง€๋Š” ์•Š์•„์„œ ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด OpenSearch ์„œ๋น„์Šค์™€ ์—ฐ๋™ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š”๋ฐ์š”,


OpenSearch๋Š” Elasticsearch์™€ ํ˜ธํ™˜๋˜๋Š” ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ์—”์ง„์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ ๋ถ„์„, ๋ชจ๋‹ˆํ„ฐ๋ง, ์›น์‚ฌ์ดํŠธ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

AWS Lambda ๋กœ์ง ์ฝ”๋”ฉ ์—†์ด, OpenSearch Ingestion ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•ด ์ž๋™ํ™”๋œ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ๊ธฐ๋Šฅ ์‚ฌ์šฉ๊ฐ€๋Šฅ

๊ธฐ์กด์—๋Š” DynamoDB ํ…Œ์ด๋ธ”์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ OpenSearch๋กœ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๊ธฐ ์œ„ํ•ด AWS Lambda์˜ ๋กœ์ง์„ ์ง์ ‘ ์ฝ”๋”ฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ค์ •ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.


ํ˜„์žฌ๋Š” OpenSearch Ingestion ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•ด ์ž๋™ํ™”๋œ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋‘ ์„œ๋น„์Šค๋ฅผ ์—ฐ๋™ํ•ด์„œ DynamoDB์˜ ์ŠคํŠธ๋ฆผ ๋ฐ์ดํ„ฐ๋ฅผ OpenSearch๋กœ ์‹ค์‹œ๊ฐ„ ์ „์†กํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.



Zero-ETL ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• ์‹ค์Šต

1. ์ „์ œ ์กฐ๊ฑด

1. S3 ๋ฒ„ํ‚ท ์ƒ์„ฑ


2. OpenSearch ๋„๋ฉ”์ธ ์ƒ์„ฑ - ๋งํฌย ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ DynamoDB์™€ ์—ฐ๋™ํ•  OpenSearch ๋„๋ฉ”์ธ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

DynamoDB์™€ ์—ฐ๋™ํ•  OpenSearch ๋„๋ฉ”์ธ์„ ์ƒ์„ฑ

3. ๋‹ค์Œ๊ณผ ๊ฐ™์€ IAM ์—ญํ• ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.


2. DynamoDB ํ…Œ์ด๋ธ” ์ƒ์„ฑ

1. DynamoDB ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์‹œ์  ๋ณต๊ตฌ(PITR) ๋ฐ DynamoDB ์ŠคํŠธ๋ฆผ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.


2. ํŒŒ์ด์ฌ์„ ์‚ฌ์šฉํ•ด ProductCatalog ํ…Œ์ด๋ธ”์— ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. (์•„๋ž˜ ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด boto3๋ฅผ ์„ค์น˜ํ•˜๊ณ  AWS CLI ์ž๊ฒฉ์ฆ๋ช…์ด ์„ค์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

import boto 3

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('productCatalog')

def batch_write(items):
	with table.batch_writer() as batch:
		for item in items:
			batch.put_item(Item=item)

items = [
        {
		 "Id": 101,
            "๋„์„œ๋ช…": "To Kill a Mockingbird",
            "๋„์„œ๋ฒˆํ˜ธ": "978-0061120084",
            "์ €์ž": "Harper Lee",
            "๊ฐ€๊ฒฉ": 12000
        },
        {
		"Id": 102,
            "๋„์„œ๋ช…": "1984",
            "๋„์„œ๋ฒˆํ˜ธ": "978-0451524935",
            "์ €์ž": "George Orwell",
            "๊ฐ€๊ฒฉ": 15000
        },
        {
		"Id": 103,
            "๋„์„œ๋ช…": "The Great Gatsby",
            "๋„์„œ๋ฒˆํ˜ธ": "978-0743273565",
            "์ €์ž": "F. Scott Fitzgerald",
            "๊ฐ€๊ฒฉ": 20000
        }
    ]


batch_write(items)

3. Zero-ETL ํŒŒ์ดํ”„๋ผ์ธ ์ƒ์„ฑ

1. DynamoDB - [ํ†ตํ•ฉ] - ProductCatalog ํ…Œ์ด๋ธ” ์„ ํƒ - [์ƒ์„ฑ]์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

DynamoDB - [ํ†ตํ•ฉ] - ProductCatalog ํ…Œ์ด๋ธ” ์„ ํƒ - [์ƒ์„ฑ]

2. ์ œ์ผ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ์ด ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ ํ…œํ”Œ๋ฆฟ ์ž‘์„ฑ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  ํŒŒ์ดํ”„๋ผ์ธ ์„ค์ •์€ ์ด ํ•˜๋‚˜์˜ ํ…œํ”Œ๋ฆฟ์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๋Š”๋ฐ์š”, ๋ฆฌ์†Œ์Šค ARN ๋“ฑ์˜ ํ•„์ˆ˜๊ฐ’์„ ์ž…๋ ฅํ•˜๊ณ  [ํŒŒ์ดํ”„๋ผ์ธ ๊ฒ€์ฆ]์„ ํ†ตํ•ด์„œ ๊ตฌ์„ฑ์ด ์œ ํšจํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ ํ…œํ”Œ๋ฆฟ ์ž‘์„ฑ

์•„๋ž˜๋Š” ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ํ•„์ˆ˜๊ฐ’๊ณผ ๊ทธ์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. (๋””ํ…Œ์ผํ•œ ์„ค์ •์€ ์ฃผ์„์˜ REQUIRED๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.)

version: "2"
dynamodb-pipeline:
  source:
    dynamodb:
      acknowledgments: true
      tables:
        # DynamoDB ํ…Œ์ด๋ธ” ARN ์ž…๋ ฅ
        - table_arn: "<<arn:aws:dynamodb:us-east-1:123456789012:table/MyTable>>"
          stream:
            start_position: "LATEST"
          export:
            # ์ƒ์„ฑํ•œ S3 ๋ฒ„ํ‚ท๋ช…
            s3_bucket: "<<my-bucket>>"
            # S3 ๋ฒ„ํ‚ท์˜ ๋ฆฌ์ „
            s3_region: "<<us-east-1>>"
            s3_prefix: "ddb-to-opensearch-export/"
      aws:
         # ์ƒ์„ฑํ•œ IAM ์—ญํ• (dynamodb, s3 ์•ก์„ธ์Šค ๊ถŒํ•œ)
         sts_role_arn: "<<arn:aws:iam::123456789012:role/Example-Role>>"
         # AWS ๊ณ„์ • ๋ฆฌ์ „
         region: "<<us-east-1>>"
  sink:
    - opensearch:
        # OpenSearch ๋„๋ฉ”์ธ ์—”๋“œํฌ์ธํŠธ(IPv4)
        hosts: [ "<<https://search-mydomain-1a2a3a4a5a6a7a8a9a0a9a8a7a.us-east-1.es.amazonaws.com>>" ]
        index: "table-index"
        index_type: custom
        document_id: "${getMetadata(\"primary_key\")}"
        action: "${getMetadata(\"opensearch_action\")}"
        document_version: "${getMetadata(\"document_version\")}"
        document_version_type: "external"
        aws:
          # IAM ์—ญํ• (๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ)
          sts_role_arn: "<<arn:aws:iam::123456789012:role/Example-Role>>"
          # ์ƒ์„ฑํ•œ ๋„๋ฉ”์ธ ๋ฆฌ์ „
          region: "<<us-east-1>>"
          serverless: false
        # S3 DLQ๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์‹คํŒจํ•œ ์š”์ฒญ์„ ์บก์ฒ˜
        dlq:
          s3:
            # S3 ๋ฒ„ํ‚ท๋ช…
            bucket: "<<your-dlq-bucket-name>>"
            # ๋ฒ„ํ‚ท ๋ฆฌ์ „
            region: "<<us-east-1>>"
            # S3 ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋œ IAM ์—ญํ• 
            sts_role_arn: "<<arn:aws:iam::123456789012:role/Example-Role>>"

3. (์ฐธ๊ณ ) ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ƒํƒœ๊ฐ€ ํ™œ์„ฑํ™”๋˜๊ณ  ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘์„ ์‹œ์ž‘ํ•˜๋ฉด S3 ๋ฒ„ํ‚ท์— ddb-to-opensearch-export ์ ‘๋‘์‚ฌ ํด๋”๋ฅผ ์ƒ์„ฑํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ƒํƒœ๊ฐ€ ํ™œ์„ฑํ™” ๋ฐ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ์‹œ์ž‘์‹œ, S3 ๋ฒ„ํ‚ท์— ddb-to-opensearch-export ์ ‘๋‘์‚ฌ ํด๋” ์ƒ์„ฑ

4. OpenSearch ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ

1. ์ƒ์„ฑํ•œ ํŒŒ์ดํ”„๋ผ์ธ์˜ OpenSearch ๋Œ€์‹œ๋ณด๋“œ URL๋กœ ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.

์ƒ์„ฑํ•œ ํŒŒ์ดํ”„๋ผ์ธ์˜ OpenSearch ๋Œ€์‹œ๋ณด๋“œ URL๋กœ ์ ‘์†

2. OpenSearch์˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์„ฑํ•  ๋•Œ ProductCatalogย ํ…Œ์ด๋ธ”์„ table-index๋ผ๋Š” ์ธ๋ฑ์Šค๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. OpenSearch ๋Œ€์‹œ๋ณด๋“œ์˜ Dev Toolย ํ™”๋ฉด์—์„œ ์ด ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”๋กœ GET ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด โ€œGeroge Orwellโ€์ด๋ผ๋Š” โ€œ์ €์žโ€ ํ•„๋“œ์™€ ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

OpenSearch ๋Œ€์‹œ๋ณด๋“œ์˜ Dev Toolย ํ™”๋ฉด


๋งˆ๋ฌด๋ฆฌ

์‹ค์Šต๋™์•ˆ์— ๋ฐœ์ƒํ•œ OpenSearch ์„œ๋ฒ„๋ฆฌ์Šค์˜ ๋น„์šฉ์„ ๊ณ ๋ คํ•˜๋ฉด ๋ฐ์ดํ„ฐ ๊ทœ๋ชจ๊ฐ€ ์ƒ๋‹นํžˆ ์ปค์•ผ ๋น„์šฉ ํšจ์œจ์ ์ธ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.


๋‹ค๋งŒ, ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” 2023๋…„ 11์›”์— ์ถœ์‹œ๋œ Zero-ETL ๊ธฐ๋Šฅ์„ ์–ด๋–ป๊ฒŒ ๊ตฌ์ถ•ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์•˜๊ณ , ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ณผ์ • ์—†์ด ๋ฐ์ดํ„ฐ ์ธ์‚ฌ์ดํŠธ๋ฅผ ๋„์ถœํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด Use case ๋“ค์ด ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.


AWS์˜ ๋‹ค์–‘ํ•œ Zero-ETL ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์‹œ๋ ค๋ฉด ๋งํฌ๋ฅผ, DynamoDB์™€ OpenSearch์˜ ํŒŒ์ดํ”„๋ผ์ธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

SmileShark Logo

์Šค๋งˆ์ผ์ƒคํฌ๋Š” 
AWS ํ”„๋ฆฌ๋ฏธ์–ด ํŒŒํŠธ๋„ˆ์ด๋ฉฐ
AI MSP ์„ธ์ƒ์„ ๋งŒ๋“ค์–ด ๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

์ž์‚ฐ 2premier tier.png
ISMS-P.webp

์ธ์ฆ๋ฒ”์œ„  |  ํด๋ผ์šฐ๋“œ ๋ฉ”๋‹ˆ์ง€๋“œ ์„œ๋น„์Šค ์šด์˜           Cloud MSP

โ€‹์œ ํšจ๊ธฐ๊ฐ„  |  2026-03-05 ~ 2029-03-04     (์‹ฌ์‚ฌ ๋ฐ›์ง€ ์•Š์€ ๋ฌผ๋ฆฌ์  ์ธํ”„๋ผ ๋ฐ SaaS ์„œ๋น„์Šค ์ธํ”„๋ผ ์˜์—ญ ์ œ์™ธ)

์Šค๋งˆ์ผ์ƒคํฌ ์ฃผ์‹ํšŒ์‚ฌ  |  ์‚ฌ์—…์ž๋ฒˆํ˜ธ : 198-87-01516  |  ๋Œ€ํ‘œ์ด์‚ฌ : ์žฅ์ง„ํ™˜      ์„œ์šธ ๊ฐ•๋‚จ๊ตฌ ํ…Œํ—ค๋ž€๋กœ44๊ธธ 5, 8์ธต (๋Œ€์•„๋นŒ๋”ฉ)  |  ๋Œ€ํ‘œ์ „ํ™” : 070-5001-2205 

 |  ์ด๋ฉ”์ผ : contact@smileshark.kr

  • LinkedIn
  • Youtube
  • Facebook
ยฉCopyright
bottom of page