Secret Vault

Secret Vault

AI Provider API 킀와 μ„œλ“œνŒŒν‹° μ„œλΉ„μŠ€ 토큰(예: SendGrid, Telegram, SMTP)을 AiTalk λ°μ΄ν„°λ² μ΄μŠ€ λŒ€μ‹  μ‚¬μš©μžμ˜ AWS Lambda에 μ €μž₯ν•©λ‹ˆλ‹€. ν™œμ„±ν™”ν•˜λ©΄ 킀와 토큰이 λŸ°νƒ€μž„μ— Lambdaμ—μ„œ 직접 κ°€μ Έμ˜€λ©°, 우리 μ„œλ²„μ—λŠ” 아무것도 μ €μž₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.


μž‘λ™ 방식

일반 λͺ¨λ“œ:
  AiTalk μ„œλ²„ ──(DBμ—μ„œ API ν‚€ 쑰회)──→ OpenAI / Claude / λ“±

Secret Vault λͺ¨λ“œ:
  AiTalk μ„œλ²„ ──(ν‚€ μš”μ²­)──→ μ‚¬μš©μž AWS Lambda ──(ν‚€ λ°˜ν™˜)──→ AiTalk이 1회 μ‚¬μš© ν›„
                                                               λ©”λͺ¨λ¦¬μ—μ„œ μ‚­μ œ

Secret Vault ν™œμ„±ν™” μ‹œ:

  • AI Provider API 킀와 μ„œλ“œνŒŒν‹° μ„œλΉ„μŠ€ 토큰(SendGrid, Telegram, SMTP λ“±)은 μ‚¬μš©μžμ˜ AWS Lambda ν™˜κ²½λ³€μˆ˜μ—λ§Œ μ €μž₯λ©λ‹ˆλ‹€

  • AiTalk은 λŸ°νƒ€μž„μ— 킀와 토큰을 κ°€μ Έμ™€μ„œ API ν˜ΈμΆœμ— μ‚¬μš©ν•œ ν›„ μ¦‰μ‹œ μ‚­μ œν•©λ‹ˆλ‹€

  • Lambda에 μ ‘κ·Όν•  수 μ—†μœΌλ©΄ API 호좜이 μ‹€νŒ¨ν•©λ‹ˆλ‹€ β€” λ°μ΄ν„°λ² μ΄μŠ€λ‘œ ν΄λ°±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ (λ³΄μ•ˆ 섀계)

  • OAuth μ—°κ²°(예: Google Drive)은 항상 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€ (μžλ™ 토큰 κ°±μ‹  ν•„μš”)


사전 μš”κ΅¬μ‚¬ν•­

  • AWS 계정 (프리 ν‹°μ–΄λ‘œ μΆ©λΆ„)

  • AWS μ½˜μ†” κΈ°λ³Έ μ‚¬μš©λ²• μˆ™μ§€

λΉ„μš©: AWS LambdaλŠ” μ›” 100만 건 무료 μš”μ²­μ„ ν¬ν•¨ν•©λ‹ˆλ‹€ (영ꡬ 프리 ν‹°μ–΄). λŒ€λΆ€λΆ„μ˜ μ‚¬μš©μžλŠ” Secret Vault λΉ„μš©μ΄ μ›” $0μž…λ‹ˆλ‹€.


μ„€μ • κ°€μ΄λ“œ

1단계: AWS Lambda ν•¨μˆ˜ 생성

  1. AWS Lambda μ½˜μ†”arrow-up-right에 λ‘œκ·ΈμΈν•©λ‹ˆλ‹€

  2. ν•¨μˆ˜ 생성을 ν΄λ¦­ν•©λ‹ˆλ‹€

  3. μƒˆλ‘œ μž‘μ„±μ„ μ„ νƒν•©λ‹ˆλ‹€

  4. μ„€μ •:

    • ν•¨μˆ˜ 이름: aitalk-secret-vault (μ›ν•˜λŠ” 이름 μ‚¬μš© κ°€λŠ₯)

    • λŸ°νƒ€μž„: Node.js 20.x

    • μ•„ν‚€ν…μ²˜: x86_64

  5. ν•¨μˆ˜ 생성을 ν΄λ¦­ν•©λ‹ˆλ‹€

2단계: ν…œν”Œλ¦Ώ μ½”λ“œ 배포

  1. AiTalkμ—μ„œ μ„€μ • > λ³΄μ•ˆμœΌλ‘œ μ΄λ™ν•©λ‹ˆλ‹€

  2. Lambda ν…œν”Œλ¦Ώ λ‹€μš΄λ‘œλ“œλ₯Ό ν΄λ¦­ν•˜μ—¬ secret-vault-lambda.js νŒŒμΌμ„ λ°›μŠ΅λ‹ˆλ‹€

  3. AWS Lambda μ½˜μ†”μ—μ„œ μ½”λ“œ νƒ­μœΌλ‘œ μ΄λ™ν•©λ‹ˆλ‹€

  4. κΈ°λ³Έ μ½”λ“œλ₯Ό λ‹€μš΄λ‘œλ“œν•œ ν…œν”Œλ¦Ώμ˜ λ‚΄μš©μœΌλ‘œ κ΅μ²΄ν•©λ‹ˆλ‹€

  5. Deployλ₯Ό ν΄λ¦­ν•©λ‹ˆλ‹€

3단계: ν•¨μˆ˜ URL ν™œμ„±ν™”

  1. ꡬ성 νƒ­ β†’ ν•¨μˆ˜ URL둜 μ΄λ™ν•©λ‹ˆλ‹€

  2. ν•¨μˆ˜ URL 생성을 ν΄λ¦­ν•©λ‹ˆλ‹€

  3. 인증 μœ ν˜•: NONE (인증은 Bearer ν† ν°μœΌλ‘œ 처리)

  4. μ €μž₯을 ν΄λ¦­ν•©λ‹ˆλ‹€

μ€‘μš”: "κΆŒν•œ λˆ„λ½" κ²½κ³ 

μ €μž₯ ν›„ λ‹€μŒκ³Ό 같은 κ²½κ³ κ°€ λ‚˜νƒ€λ‚  수 μžˆμŠ΅λ‹ˆλ‹€: "Your function URL auth type is NONE, but is missing permissions required for public access."

ν•΄κ²° 방법:

  1. ν•¨μˆ˜ URL νŽ˜μ΄μ§€μ—μ„œ Edit 클릭

  2. μ•„λž˜λ‘œ μŠ€ν¬λ‘€ν•˜μ—¬ View policy statement 확인 β€” 정책에 lambda:InvokeFunctionUrlκ³Ό lambda:InvokeFunction이 Principal: "*"둜 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ 확인

  3. λ‹€μ‹œ Save 클릭

  4. κ²½κ³ κ°€ λ‹€μŒμœΌλ‘œ λ³€κ²½λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€: "Your function URL is public. Anyone with the URL can access your function."

이것은 μ •μƒμž…λ‹ˆλ‹€ β€” λ³΄μ•ˆμ€ AWS IAM이 μ•„λ‹Œ Lambda μ½”λ“œμ˜ Bearer ν† ν°μœΌλ‘œ μ²˜λ¦¬λ©λ‹ˆλ‹€.

  1. μƒμ„±λœ ν•¨μˆ˜ URL을 λ³΅μ‚¬ν•©λ‹ˆλ‹€ (예: https://xxxxxxxxxx.lambda-url.eu-west-1.on.aws/)

4단계: μ‹œν¬λ¦Ώμ„ ν™˜κ²½λ³€μˆ˜λ‘œ μΆ”κ°€

  1. ꡬ성 νƒ­ β†’ ν™˜κ²½ λ³€μˆ˜λ‘œ μ΄λ™ν•©λ‹ˆλ‹€

  2. νŽΈμ§‘μ„ ν΄λ¦­ν•©λ‹ˆλ‹€

  3. AiTalk μ„€μ •μ˜ Vault ν‚€ μ°Έμ‘° ν…Œμ΄λΈ”μ— ν‘œμ‹œλœ μ •ν™•ν•œ ν‚€ μ΄λ¦„μœΌλ‘œ μ‹œν¬λ¦Ώμ„ μΆ”κ°€ν•©λ‹ˆλ‹€:

ν‚€ 이름
κ°’
μ„€λͺ…

AUTH_TOKEN

(5λ‹¨κ³„μ—μ„œ 생성)

인증 토큰

ai_provider_openai_api_key

sk-xxxxxxxx...

OpenAI API ν‚€

ai_provider_anthropic_api_key

sk-ant-xxxxxxxx...

Claude API ν‚€

ai_provider_google_api_key

AIzaxxxxxxxx...

Gemini API ν‚€

wf_conn_{connectionId}_token

(μ‚¬μš©μž 토큰)

Workflow μ—°κ²° 토큰

bot_channel_{channelId}_token

(μ‚¬μš©μž 토큰)

Bot 채널 토큰

Workflow μ—°κ²° 및 Bot μ±„λ„μ˜ μ •ν™•ν•œ ν‚€ 이름은 μ„€μ • > λ³΄μ•ˆ > Vault ν‚€ μ°Έμ‘°μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

  1. μ €μž₯을 ν΄λ¦­ν•©λ‹ˆλ‹€

5단계: AiTalk을 Lambda에 μ—°κ²°

  1. AiTalkμ—μ„œ μ„€μ • > λ³΄μ•ˆμœΌλ‘œ μ΄λ™ν•©λ‹ˆλ‹€

  2. Lambda ν•¨μˆ˜ URL을 λΆ™μ—¬λ„£μŠ΅λ‹ˆλ‹€

  3. μƒˆ 토큰 생성을 ν΄λ¦­ν•˜κ³  토큰을 λ³΅μ‚¬ν•©λ‹ˆλ‹€

  4. Lambda ν™˜κ²½ λ³€μˆ˜λ‘œ λŒμ•„κ°€μ„œ AUTH_TOKEN을 이 ν† ν°μœΌλ‘œ μ„€μ •ν•©λ‹ˆλ‹€

  5. μ—°κ²° ν…ŒμŠ€νŠΈλ₯Ό ν΄λ¦­ν•˜μ—¬ ν™•μΈν•©λ‹ˆλ‹€

  6. μ €μž₯ 및 ν™œμ„±ν™”λ₯Ό ν΄λ¦­ν•©λ‹ˆλ‹€


Vault ν‚€ μ°Έμ‘°

Lambda ν™˜κ²½λ³€μˆ˜μ— μ‚¬μš©ν•˜λŠ” ν‚€ 이름은 μ •ν™•νžˆ μΌμΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. λͺ¨λ“  ν‚€ 이름은 μ„€μ • > λ³΄μ•ˆ > Vault ν‚€ μ°Έμ‘°μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

AI Provider ν‚€

Provider
ν‚€ 이름

OpenAI

ai_provider_openai_api_key

Anthropic (Claude)

ai_provider_anthropic_api_key

Google (Gemini)

ai_provider_google_api_key

DeepSeek

ai_provider_deepseek_api_key

Grok

ai_provider_grok_api_key

Workflow μ—°κ²° 토큰

ν˜•μ‹: wf_conn_{connectionId}_token

μ˜ˆμ‹œ:

  • wf_conn_cm1abc123def_token (Telegram μ—°κ²°)

  • wf_conn_cm2xyz789ghi_token (SendGrid μ—°κ²°)

Bot 채널 토큰

ν˜•μ‹: bot_channel_{channelId}_token

Slack λ΄‡μ˜ 경우 두 개의 ν‚€κ°€ ν•„μš”ν•©λ‹ˆλ‹€:

  • bot_channel_{channelId}_slack_bot_token

  • bot_channel_{channelId}_slack_signing_secret


Secret Vault λΉ„ν™œμ„±ν™”

  1. μ„€μ • > λ³΄μ•ˆμœΌλ‘œ μ΄λ™ν•©λ‹ˆλ‹€

  2. λΉ„ν™œμ„±ν™”λ₯Ό ν΄λ¦­ν•©λ‹ˆλ‹€

  3. AiTalk이 λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯된 μ•”ν˜Έν™” ν‚€λ₯Ό λ‹€μ‹œ μ‚¬μš©ν•©λ‹ˆλ‹€

Vault ν™œμ„±ν™” μ‹œ λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯된 ν‚€λŠ” μ‚­μ œλ˜μ§€ μ•ŠμœΌλ―€λ‘œ, μ–Έμ œλ“  λ‹€μ‹œ μ „ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


문제 ν•΄κ²°

문제
ν•΄κ²° 방법

ν…ŒμŠ€νŠΈ μ‹œ "μ—°κ²° μ‹€νŒ¨"

Lambda ν•¨μˆ˜ URL이 μ˜¬λ°”λ₯΄κ³  ν•¨μˆ˜κ°€ λ°°ν¬λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜μ„Έμš”

"Unauthorized" 였λ₯˜

Lambda의 AUTH_TOKEN이 AiTalk의 토큰과 μΌμΉ˜ν•˜λŠ”μ§€ ν™•μΈν•˜μ„Έμš”

"ν‚€λ₯Ό 찾을 수 μ—†μŒ" 였λ₯˜

Lambda ν™˜κ²½λ³€μˆ˜μ˜ ν‚€ 이름이 μ •ν™•νžˆ μΌμΉ˜ν•˜λŠ”μ§€ ν™•μΈν•˜μ„Έμš” (λŒ€μ†Œλ¬Έμž ꡬ뢄)

ν™œμ„±ν™” ν›„ AI μ±„νŒ… μ•ˆ 됨

Lambda에 ν•„μš”ν•œ λͺ¨λ“  API ν‚€ ν™˜κ²½λ³€μˆ˜κ°€ μ„€μ •λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜μ„Έμš”

ν™œμ„±ν™” ν›„ Workflow μ‹€νŒ¨

Lambda에 λͺ¨λ“  Workflow μ—°κ²° 토큰이 μΆ”κ°€λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜μ„Έμš”


λ³΄μ•ˆ 참고사항

  • Bearer 토큰이 AiTalkκ³Ό Lambda κ°„μ˜ μš”μ²­μ„ μΈμ¦ν•©λ‹ˆλ‹€

  • μ‚¬μš©μžμ˜ AWS κ³„μ •λ§Œ Lambda ν™˜κ²½λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€

  • AiTalk은 Lambdaμ—μ„œ κ°€μ Έμ˜¨ μ‹œν¬λ¦Ώμ„ μ €μž₯, 기둝 λ˜λŠ” μΊμ‹œν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€

  • μ΅œλŒ€ λ³΄μ•ˆμ„ μœ„ν•΄ AWS IAM μ •μ±…μœΌλ‘œ Lambda 접근을 μ œν•œν•˜μ„Έμš”

Last updated