Home / Strands ํ”„๋กœ๋•์…˜ / ๐ŸŽฏ Strands ํ”„๋กœ๋•์…˜
Module

๐ŸŽฏ Strands ํ”„๋กœ๋•์…˜

์บ์‹ฑ, ์ŠคํŠธ๋ฆฌ๋ฐ, ๋ฐฐํฌ

โฑ 75๋ถ„ 97 / 189

Strands ํ”„๋กœ๋•์…˜

์บ์‹ฑ ยท ์ŠคํŠธ๋ฆฌ๋ฐ ยท ๋ฐฐํฌ

์—์ด์ „ํŠธ๋ฅผ ํ”„๋กœ๋•์…˜์— ์˜ฌ๋ฆฐ๋‹ค

ํ”„๋กฌํ”„ํŠธ ์บ์‹ฑยท์ŠคํŠธ๋ฆฌ๋ฐยท๋ฐฐํฌ ํƒ€๊ฒŸ โ€” ๋น„์šฉ๊ณผ ์†๋„ ์ตœ์ ํ™”

ํ”„๋กœ๋•์…˜ ์ „ํ™˜

๋น„์šฉ ยท ์†๋„ ยท ์ธํ”„๋ผ 3์ถ• ์ตœ์ ํ™”

PART 1 ยท ํ”„๋กœ๋•์…˜ ์ „ํ™˜

ํ”„๋กœ๋•์…˜ ์ „ํ™˜

PoC๋ฅผ ํ”„๋กœ๋•์…˜์œผ๋กœ ์˜ฌ๋ฆด ๋•Œ ๋งˆ์ฃผํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ์ตœ์ ํ™” ๊ณผ์ œ

๋น„์šฉ ยท ์†๋„ ยท ์ธํ”„๋ผ

PoC์—์„œ ํ”„๋กœ๋•์…˜์œผ๋กœ ์ „ํ™˜ํ•  ๋•Œ ๋น„์šฉยท์†๋„ยท์ธํ”„๋ผ ์„ธ ์ถ•์„ ํ•จ๊ป˜ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • ํ”„๋กฌํ”„ํŠธ ์บ์‹ฑ โ€” cache hit ์‹œ ์ž…๋ ฅ ํ† ํฐ 90% ์ ˆ๊ฐ
  • ์ŠคํŠธ๋ฆฌ๋ฐ โ€” TTFT(Time To First Token) ์ตœ์†Œํ™”
  • ๋ฐฐํฌ ํƒ€๊ฒŸ โ€” Lambda ยท Fargate ยท AgentCore Runtime
  • ๊ณต์‹ 15์ข… ํ”„๋กœ๋ฐ”์ด๋” โ€” ๋ฒค๋” ์ข…์† ์—†๋Š” ๋ฐฐํฌ ์ „๋žต
takeaway

์บ์‹ฑ์ด ๋น„์šฉ์„, ์ŠคํŠธ๋ฆฌ๋ฐ์ด ์†๋„๋ฅผ, ๋ฐฐํฌ ํƒ€๊ฒŸ์ด ์ธํ”„๋ผ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค โ€” ํŒŒํŠธ 2 ยท 3 ยท 4๊ฐ€ ์ถ• ํ•˜๋‚˜์”ฉ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

PART 1 ยท ํ”„๋กœ๋•์…˜ ์ „ํ™˜

ํ”„๋กœ๋•์…˜ ์ตœ์ ํ™” 3์ถ•

PoC์—์„œ ํ”„๋กœ๋•์…˜์œผ๋กœ ์ „ํ™˜ํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๋น„์šฉยท์†๋„ยท์ธํ”„๋ผ ๊ณผ์ œ

  1. 1
    ๋น„์šฉ ์ตœ์ ํ™”

    ํ”„๋กฌํ”„ํŠธ ์บ์‹ฑ์œผ๋กœ ๋ฐ˜๋ณต ํ† ํฐ ๋น„์šฉ 90% ์ ˆ๊ฐ. ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธยท๋„๊ตฌ ์ •์˜์ฒ˜๋Ÿผ ๋งค ํ˜ธ์ถœ ๋™์ผํ•œ prefix๋ฅผ ์บ์‹œํ•˜์—ฌ ์ž…๋ ฅ ํ† ํฐ ๊ณผ๊ธˆ ์ตœ์†Œํ™”.

  2. 2
    ์†๋„ ์ตœ์ ํ™”

    ์ŠคํŠธ๋ฆฌ๋ฐ์œผ๋กœ TTFT(Time To First Token)๋ฅผ ์ตœ์†Œํ™”. ์ „์ฒด ์‘๋‹ต ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ํ† ํฐ ๋‹จ์œ„๋กœ ์ฆ‰์‹œ ์ „๋‹ฌํ•˜์—ฌ ์ฒด๊ฐ ์ง€์—ฐ ์ œ๊ฑฐ.

  3. 3
    ์ธํ”„๋ผ ์ตœ์ ํ™”

    ์›Œํฌ๋กœ๋“œ ํŠน์„ฑ์— ๋งž๋Š” ๋ฐฐํฌ ํƒ€๊ฒŸ ์„ ํƒ. LambdaยทFargateยทAgentCore Runtime ์ค‘ ์ฝœ๋“œ์Šคํƒ€ํŠธยท๋น„์šฉยทํ™•์žฅ์„ฑ ๊ท ํ˜•์ ์„ ์ฐพ์•„ ์šด์˜ ๋ถ€๋‹ด ์ตœ์†Œํ™”.

takeaway

์บ์‹ฑ์€ ๋ฐ˜๋ณต prefix์˜ ์žฌ์ฒ˜๋ฆฌ๋ฅผ ์—†์• ๊ณ , ์ŠคํŠธ๋ฆฌ๋ฐ์€ ์ฒซ ํ† ํฐ์„ ์•ž๋‹น๊ธฐ๋ฉฐ, ๋ฐฐํฌ ํƒ€๊ฒŸ์€ ์›Œํฌ๋กœ๋“œ์— ๋งž๋Š” ๊ท ํ˜•์ ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

PART 1 ยท ํ”„๋กœ๋•์…˜ ์ „ํ™˜

ํ”„๋กœ๋•์…˜ ํ•ต์‹ฌ ์ง€ํ‘œ

์บ์‹ฑยท์ŠคํŠธ๋ฆฌ๋ฐยท๋ฉ€ํ‹ฐ ํ”„๋กœ๋ฐ”์ด๋”๊ฐ€ ๋งŒ๋“œ๋Š” ์ •๋Ÿ‰์  ๊ฐœ์„  ํšจ๊ณผ

90% ์บ์‹ฑ ๋น„์šฉ ์ ˆ๊ฐ โ€” cache hit ์‹œ ์ž…๋ ฅ ํ† ํฐ
TTFT โ†“ ์ŠคํŠธ๋ฆฌ๋ฐ โ€” ์ฒซ ํ† ํฐ ์ฆ‰์‹œ ์ „๋‹ฌ
15์ข… ๊ณต์‹ ํ”„๋กœ๋ฐ”์ด๋” โ€” Bedrock ยท Anthropic ยท OpenAI ๋“ฑ
PART 1 ยท ํ”„๋กœ๋•์…˜ ์ „ํ™˜

์ตœ์ ํ™” ์ถ•๋ณ„ ๋„๊ตฌ ๋งคํ•‘

๊ฐ ์ถ•์—์„œ Strands SDK๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ตฌ์ฒด์  ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ์ ์šฉ ๋Œ€์ƒ

์ตœ์ ํ™” ์ถ•๋ฉ”์ปค๋‹ˆ์ฆ˜์ ์šฉ ๋Œ€์ƒํšจ๊ณผ
๋น„์šฉPrompt Caching (cachePoint)์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ยท ๋„๊ตฌ ์ •์˜์ž…๋ ฅ ํ† ํฐ 90% ์ ˆ๊ฐ
๋น„์šฉcache_tools="default"๋„๊ตฌ ์Šคํ‚ค๋งˆ ์ „์ฒด๋„๊ตฌ ๋งŽ์„์ˆ˜๋ก ์ ˆ๊ฐ ํญ ์ฆ๊ฐ€
์†๋„AsyncIterator ์ŠคํŠธ๋ฆฌ๋ฐ๋ชจ๋“  ๋ชจ๋ธ ์‘๋‹ต์ฒซ ํ† ํฐ ์ง€์—ฐ ์ตœ์†Œํ™”
์†๋„Callback HandlerUI ์—…๋ฐ์ดํŠธ ยท ๋กœ๊น…์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ์ฒ˜๋ฆฌ
์ธํ”„๋ผLambda ๋ฐฐํฌ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋‹จ๋ฐœ ํ˜ธ์ถœ์ œ๋กœ ์œ ํœด ๋น„์šฉ
์ธํ”„๋ผFargate / AgentCore์žฅ์‹œ๊ฐ„ ์„ธ์…˜ ยท ๋ฉ€ํ‹ฐํ„ด์•ˆ์ • ์—ฐ๊ฒฐ ยท ์˜คํ† ์Šค์ผ€์ผ
takeaway

๋น„์šฉ ์ถ•์€ ์บ์‹ฑ ์˜ต์…˜ ๋‘ ๊ฐ€์ง€, ์†๋„ ์ถ•์€ ์ŠคํŠธ๋ฆฌ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ๋‘ ๊ฐ€์ง€๋กœ ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค โ€” ์ธํ”„๋ผ ์ถ•๋งŒ ์ฝ”๋“œ ๋ฐ–์˜ ๋ฐฐํฌ ๊ฒฐ์ •์ž…๋‹ˆ๋‹ค.

PART 1 ยท ํ”„๋กœ๋•์…˜ ์ „ํ™˜

ํ˜ธ์ถœ ๋‹จ์œ„ ๋ชจ๋ธ ๋ผ์šฐํŒ…

๊ฐ™์€ ์—์ด์ „ํŠธ์—์„œ ์š”์ฒญ๋ณ„๋กœ ๋‹ค๋ฅธ ๋ชจ๋ธ ์ง€์ • โ€” ๊ฒฝ๋Ÿ‰ ์ž‘์—…์€ ์‹ผ ๋ชจ๋ธ, ๋ณต์žกํ•œ ์ž‘์—…๋งŒ ๋น„์‹ผ ๋ชจ๋ธ

ํ•ต์‹ฌ ํฌ์ธํŠธ

agent(prompt, model=)
ํ˜ธ์ถœ ์‹œ์ ์— ๋ชจ๋ธ ์˜ค๋ฒ„๋ผ์ด๋“œ โ€” ์—์ด์ „ํŠธ ์žฌ์ƒ์„ฑ ์—†์ด ์š”์ฒญ๋ณ„ ์ง€์ • (v1.50 ์ดํ›„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
๊ธฐ๋ณธ ๋ชจ๋ธ ์œ ์ง€
model= ์—†๋Š” ํ˜ธ์ถœ์€ Agent ์ƒ์„ฑ ์‹œ ์ง€์ •ํ•œ ๋ชจ๋ธ ๊ทธ๋Œ€๋กœ
๋งฅ๋ฝ ๊ณต์œ 
๊ฐ™์€ ์—์ด์ „ํŠธ์˜ messages[]๋ฅผ ์ด์–ด ์”€ โ€” ๋ชจ๋ธ๋งŒ ๋ฐ”๋€Œ๊ณ  ๋Œ€ํ™”๋Š” ์œ ์ง€
๋น„์šฉ ์ตœ์ ํ™”
๋ถ„๋ฅ˜ยท์š”์•ฝ ๊ฐ™์€ ๊ฒฝ๋Ÿ‰ ์š”์ฒญ์„ ์ €๊ฐ€ ๋ชจ๋ธ๋กœ ๋ผ์šฐํŒ… โ€” ์บ์‹ฑ๊ณผ ๊ฒน์ณ ์“ฐ๋Š” ๋ณ„๊ฐœ์˜ ์ ˆ๊ฐ ์ถ•

์ฝ”๋“œ

python
from strands import Agent
from strands.models import BedrockModel

cheap = BedrockModel(model_id="us.anthropic.claude-haiku-4-5")
smart = BedrockModel(model_id="us.anthropic.claude-sonnet-4-6")

# ๊ธฐ๋ณธ ๋ชจ๋ธ์€ smart โ€” toolsยทsystem_prompt๋Š” ํ•˜๋‚˜๋กœ ์œ ์ง€
agent = Agent(model=smart, tools=[search_docs])

# ๊ฒฝ๋Ÿ‰ ์ž‘์—… โ€” ์ด ํ˜ธ์ถœ๋งŒ ์‹ผ ๋ชจ๋ธ๋กœ ๋ผ์šฐํŒ…
agent("์ด ๋ฌธ์˜๋ฅผ ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ๋ถ„๋ฅ˜ํ•ด์ค˜", model=cheap)

# ๋ณต์žกํ•œ ์ž‘์—… โ€” ๊ธฐ๋ณธ ๋ชจ๋ธ ๊ทธ๋Œ€๋กœ (๊ฐ™์€ ๋Œ€ํ™” ๋งฅ๋ฝ ๊ณต์œ )
agent("๋ถ„๋ฅ˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋Œ€์‘ ๋ฐฉ์•ˆ์„ ์„ค๊ณ„ํ•ด์ค˜")

ํ”„๋กฌํ”„ํŠธ ์บ์‹ฑ

SystemContentBlock ยท cache_tools ยท ๋น„์šฉ 90% ์ ˆ๊ฐ

PART 2 ยท ํ”„๋กฌํ”„ํŠธ ์บ์‹ฑ

ํ”„๋กฌํ”„ํŠธ ์บ์‹ฑ

๋งค ํ˜ธ์ถœ ๋ฐ˜๋ณต๋˜๋Š” prefix๋ฅผ ์บ์‹œํ•ด ์ž…๋ ฅ ํ† ํฐ ๋น„์šฉ์„ ์ ˆ๊ฐํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜

ํ”„๋กฌํ”„ํŠธ ์บ์‹ฑ

์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธยท๋„๊ตฌ ์ •์˜์ฒ˜๋Ÿผ ๋งค ํ˜ธ์ถœ ๋™์ผํ•œ prefix๋ฅผ ์บ์‹œํ•˜์—ฌ ์ž…๋ ฅ ํ† ํฐ ๊ณผ๊ธˆ์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

  • cache_tools="default" โ€” ๋„๊ตฌ ์ •์˜ ์ „์ฒด ์บ์‹œ (5๋ถ„ TTL)
  • cache_config=CacheConfig(strategy="auto") โ€” ๋ฉ€ํ‹ฐํ„ด ๋ฉ”์‹œ์ง€ ์ž๋™ ์บ์‹ฑ
  • ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ๋ช…์‹œ ์บ์‹ฑ โ€” SystemContentBlock์˜ cachePoint ๋งˆ์ปค
  • cache hit โ€” ์บ์‹œ ์ฝ๊ธฐ ๋น„์šฉ์€ ์ž…๋ ฅ ํ† ํฐ์˜ 10%
takeaway

์ฒซ ํ˜ธ์ถœ์€ cache write ๋น„์šฉ์ด ์ถ”๊ฐ€๋˜์ง€๋งŒ, ์ดํ›„ hit๋ถ€ํ„ฐ๋Š” prefix ์žฌ์ฒ˜๋ฆฌ ์—†์ด ์ ˆ๊ฐ๋œ ๋น„์šฉ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

PART 2 ยท ํ”„๋กฌํ”„ํŠธ ์บ์‹ฑ

cache_tools๋กœ ๋„๊ตฌ ์ •์˜ ์บ์‹ฑ

๋„๊ตฌ ์ •์˜๋Š” ํ•œ ์ค„ ์˜ต์…˜ โ€” ๋ฉ€ํ‹ฐํ„ด ์ž๋™(CacheConfig)ยท์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ๋ช…์‹œ(cachePoint)๊นŒ์ง€ ๋Œ€์ƒ๋ณ„ ์„ ์–ธ

python
from strands import Agent
from strands.models import BedrockModel, CacheConfig
from strands.types.content import SystemContentBlock

model = BedrockModel(
    model_id="us.anthropic.claude-sonnet-4-6",
    cache_tools="default",  # ๋„๊ตฌ ์ •์˜ ์ „์ฒด๋ฅผ ์บ์‹œ (5๋ถ„ TTL)
    # ๋ฉ€ํ‹ฐํ„ด ๋ฉ”์‹œ์ง€ ์ž๋™ ์บ์‹ฑ โ€” ๋งˆ์ง€๋ง‰ user ๋ฉ”์‹œ์ง€ ๋์— ์บ์‹œ ํฌ์ธํŠธ ์ž๋™ ๋ฐฐ์น˜
    cache_config=CacheConfig(strategy="auto"),
)

agent = Agent(
    model=model,
    # ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ๋ช…์‹œ ์บ์‹ฑ โ€” cachePoint ๋งˆ์ปค๊นŒ์ง€๊ฐ€ ์บ์‹œ prefix
    system_prompt=[
        SystemContentBlock(text="""You are a production data analyst.
    You have access to SQL databases, S3 data lakes, and monitoring dashboards.
    Always validate queries before execution and explain your reasoning."""),
        SystemContentBlock(cachePoint={"type": "default"}),
    ],
    tools=[query_database, read_s3, check_metrics, generate_report],
)

# ์ฒซ ํ˜ธ์ถœ: cache write (์•ฝ๊ฐ„์˜ ์ถ”๊ฐ€ ๋น„์šฉ)
# ์ดํ›„ ํ˜ธ์ถœ: cache hit โ†’ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ + ๋„๊ตฌ ์ •์˜ ๋น„์šฉ 90% ์ ˆ๊ฐ
result = agent("์ง€๋‚œ์ฃผ ๋งค์ถœ ๋ฆฌํฌํŠธ๋ฅผ ์ƒ์„ฑํ•ด์ค˜")
PART 2 ยท ํ”„๋กฌํ”„ํŠธ ์บ์‹ฑ

์บ์‹ฑ ๋™์ž‘ ์›๋ฆฌ

Cache Point ๋งˆ์ปค ๊ธฐ์ค€์œผ๋กœ prefix ์ผ์น˜ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” hit/miss ํ๋ฆ„

  1. 1
    Cache Point ์„ ์–ธ

    SystemContentBlock์— cachePoint: { type: "default" }๋ฅผ ์‚ฝ์ž…. ์ด ๋งˆ์ปค๊นŒ์ง€์˜ ํ† ํฐ์ด ์บ์‹œ ํ‚ค์˜ prefix๊ฐ€ ๋จ.

  2. 2
    Prefix ํ•ด์‹ฑ

    ํ”„๋กœ๋ฐ”์ด๋”๊ฐ€ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ + ๋„๊ตฌ ์ •์˜๋ฅผ ํ•ด์‹ฑํ•˜์—ฌ ์บ์‹œ ํ‚ค ์ƒ์„ฑ. ๋™์ผ prefix๋ฉด ๊ฐ™์€ ํ‚ค๋กœ ๋งคํ•‘.

  3. 3
    Cache Hit ํŒ์ •

    TTL ๋‚ด์— ๋™์ผ ํ‚ค๊ฐ€ ์กด์žฌํ•˜๋ฉด hit โ€” ์บ์‹œ๋œ KV ์ƒํƒœ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ prefix ํ† ํฐ ์žฌ์ฒ˜๋ฆฌ ์ƒ๋žต.

  4. 4
    ๋น„์šฉ ์ •์‚ฐ

    Hit ์‹œ ์บ์‹œ ์ฝ๊ธฐ ๋น„์šฉ๋งŒ ๊ณผ๊ธˆ (์ผ๋ฐ˜ ์ž…๋ ฅ ํ† ํฐ์˜ 10%). Miss ์‹œ cache write ๋น„์šฉ 25% ์ถ”๊ฐ€ ํ›„ ๋‹ค์Œ ํ˜ธ์ถœ๋ถ€ํ„ฐ ์ ˆ๊ฐ.

takeaway

hit์ด๋ฉด ์บ์‹œ ์ฝ๊ธฐ ๋น„์šฉ 10%๋งŒ ๊ณผ๊ธˆ๋˜๊ณ , miss๋ฉด write ๋น„์šฉ 25%๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค โ€” TTL ์•ˆ์— ๊ฐ™์€ prefix๋กœ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์ ˆ๊ฐ์˜ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค.

PART 2 ยท ํ”„๋กฌํ”„ํŠธ ์บ์‹ฑ

์บ์‹ฑ ์กฐ๊ฑด ๋น„๊ต

Anthropic API ์ง์ ‘ ํ˜ธ์ถœ๊ณผ Bedrock ๊ฒฝ์œ  ์‹œ ์บ์‹ฑ ๋™์ž‘ ์ฐจ์ด

์กฐ๊ฑดAnthropic APIAmazon Bedrock
์ตœ์†Œ ํ† ํฐ1,024 ์ด์ƒ (Sonnet 4.6 ๊ธฐ์ค€)๋ชจ๋ธ๋ณ„ ์ตœ์†Œ ํ† ํฐ ์กด์žฌ (1,024/4,096 โ€” Bedrock ๋ฌธ์„œ ๊ธฐ์ค€)
TTL5๋ถ„ (์‚ฌ์šฉ ์‹œ ๊ฐฑ์‹ )5๋ถ„~1์‹œ๊ฐ„ (๋ชจ๋ธ๋ณ„ ์ƒ์ด)
cache_tools="default"โœ“ ์ง€์› (5๋ถ„ TTL)โœ“ ์ง€์›
cache_config (๋ฉ€ํ‹ฐํ„ด ๋ฉ”์‹œ์ง€ ์ž๋™)โœ“ CacheConfig(strategy="auto")โœ“ ๋™์ผ ์ธํ„ฐํŽ˜์ด์Šค
์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ (์ˆ˜๋™ cachePoint)โœ“ SystemContentBlockโœ“ ๋™์ผ ์ธํ„ฐํŽ˜์ด์Šค
Cache Write ๋น„์šฉ์ž…๋ ฅ ํ† ํฐ์˜ 25% ์ถ”๊ฐ€ (5๋ถ„ TTL ๊ธฐ์ค€ โ€” 1์‹œ๊ฐ„ TTL์€ +100%)์ž…๋ ฅ ํ† ํฐ์˜ 25% ์ถ”๊ฐ€ (5๋ถ„ TTL ๊ธฐ์ค€)
Cache Read ๋น„์šฉ์ž…๋ ฅ ํ† ํฐ์˜ 10%์ž…๋ ฅ ํ† ํฐ์˜ 10%
๊ต์ฐจ ์„ธ์…˜ ๊ณต์œ ๋™์ผ workspace ๋‚ด ๊ณต์œ  (2026-02 ๋ณ€๊ฒฝ)๋™์ผ ๊ณ„์ • ๋‚ด ๊ณต์œ 
takeaway

Strands ์บ์‹ฑ ์ธํ„ฐํŽ˜์ด์Šค๋Š” Anthropic API์™€ Bedrock์—์„œ ๋™์ผํ•ฉ๋‹ˆ๋‹ค โ€” ์ตœ์†Œ ํ† ํฐ๊ณผ TTL ๊ฐ™์€ ์บ์‹ฑ ์กฐ๊ฑด๋งŒ ํ”„๋กœ๋ฐ”์ด๋”๋ณ„๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ŠคํŠธ๋ฆฌ๋ฐ

AsyncIterator ยท Callback ยท SSE ยท Retry

PART 3 ยท ์ŠคํŠธ๋ฆฌ๋ฐ

์ŠคํŠธ๋ฆฌ๋ฐ

ํ† ํฐ ๋‹จ์œ„ ์ˆ˜์‹  ์ธํ„ฐํŽ˜์ด์Šค๋ถ€ํ„ฐ ๋ธŒ๋ผ์šฐ์ € ์ „๋‹ฌ๊นŒ์ง€์˜ ์‹ค์‹œ๊ฐ„ ๊ฒฝ๋กœ

์ŠคํŠธ๋ฆฌ๋ฐ

์ „์ฒด ์‘๋‹ต ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ƒ์„ฑ ์ฆ‰์‹œ ํ† ํฐ์„ ์ „๋‹ฌํ•˜์—ฌ ์ฒด๊ฐ ์ง€์—ฐ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

  • Callback Handler โ€” callable ํ•˜๋‚˜๋กœ ์ด๋ฒคํŠธ ์ˆ˜์‹ 
  • stream_async โ€” async for ๋ฃจํ”„์˜ AsyncIterator
  • SSE ํŒŒ์ดํ”„๋ผ์ธ โ€” Agent โ†’ Callback โ†’ Transport โ†’ ๋ธŒ๋ผ์šฐ์ €
  • TTFT ์ตœ์†Œํ™” โ€” ์ฒซ ํ† ํฐ ์ฆ‰์‹œ ํ‘œ์‹œ
takeaway

AsyncIterator์™€ Callback ์ด์ค‘ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ† ํฐ์„ ๋ฐ›๊ณ , SSE ํŒŒ์ดํ”„๋ผ์ธ์ด ๋ธŒ๋ผ์šฐ์ €๊นŒ์ง€ ์‹ค์‹œ๊ฐ„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

PART 3 ยท ์ŠคํŠธ๋ฆฌ๋ฐ

AsyncIterator + Callback ์ŠคํŠธ๋ฆฌ๋ฐ

ํ† ํฐ ๋‹จ์œ„ ์ˆ˜์‹ ์„ ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ์ธํ„ฐํŽ˜์ด์Šค โ€” ์ดํ„ฐ๋ ˆ์ดํ„ฐ์™€ ์ด๋ฒคํŠธ ์ฝœ๋ฐฑ

python
import asyncio
from strands import Agent

queue = asyncio.Queue()

# ๋ฐฉ๋ฒ• 1: Callback Handler โ€” callable ํ•˜๋‚˜๋กœ ์ด๋ฒคํŠธ ์ˆ˜์‹ 
def sse_handler(**kwargs):
    """ํ† ํฐ์„ SSE ํ˜•์‹์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์— ํ‘ธ์‹œ"""
    if "data" in kwargs:  # ํ…์ŠคํŠธ ๋ธํƒ€
        queue.put_nowait(f"data: {kwargs['data']}\n\n")
    tool_use = kwargs.get("current_tool_use")
    if tool_use:          # ๋„๊ตฌ ํ˜ธ์ถœ ์ด๋ฒคํŠธ
        queue.put_nowait(f"event: tool\ndata: {tool_use['name']}\n\n")

agent = Agent(callback_handler=sse_handler)

# ๋ฐฉ๋ฒ• 2: AsyncIterator โ€” async for ๋ฃจํ”„ (์ด๋ฒคํŠธ๋Š” dict)
async def stream_response(agent: Agent, prompt: str):
    async for event in agent.stream_async(prompt):
        if "data" in event:
            yield f"data: {event['data']}\n\n"
        elif event.get("current_tool_use"):
            name = event["current_tool_use"]["name"]
            yield f"event: tool\ndata: {name}\n\n"
    yield "data: [DONE]\n\n"
PART 3 ยท ์ŠคํŠธ๋ฆฌ๋ฐ

Polling vs Streaming ๋น„๊ต

์‘๋‹ต ์ˆ˜์‹  ๋ฐฉ์‹์— ๋”ฐ๋ฅธ ์ง€์—ฐยท๋ฆฌ์†Œ์ŠคยทUX ์ฐจ์ด

Polling (๋™๊ธฐ ๋Œ€๊ธฐ)

์ „์ฒด ์‘๋‹ต ์™„๋ฃŒ ํ›„ ๋ฐ˜ํ™˜

  • TTFT = ์ „์ฒด ์ƒ์„ฑ ์‹œ๊ฐ„ (์ˆ˜ ์ดˆ~์ˆ˜์‹ญ ์ดˆ)
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋นˆ ํ™”๋ฉด์—์„œ ๋Œ€๊ธฐ
  • ๊ตฌํ˜„ ๋‹จ์ˆœ โ€” request/response ํ•œ ์Œ
  • ๋„คํŠธ์›Œํฌ ํƒ€์ž„์•„์›ƒ ์œ„ํ—˜ (30์ดˆ+ ์‘๋‹ต)

Streaming (ํ† ํฐ ๋‹จ์œ„)

์ƒ์„ฑ ์ฆ‰์‹œ ํ† ํฐ ์ „๋‹ฌ

  • TTFT ์ตœ์†Œํ™” โ€” ์ฒซ ํ† ํฐ ์ฆ‰์‹œ ํ‘œ์‹œ
  • ํƒ€์ดํ•‘ ํšจ๊ณผ๋กœ ์ฒด๊ฐ ์ง€์—ฐ ์ œ๊ฑฐ
  • SSE/WebSocket ์—ฐ๊ฒฐ ๊ด€๋ฆฌ ํ•„์š”
  • ๊ธด ์‘๋‹ต๋„ ํƒ€์ž„์•„์›ƒ ์—†์ด ์•ˆ์ • ์ˆ˜์‹ 
takeaway

์ŠคํŠธ๋ฆฌ๋ฐ์€ SSE/WebSocket ์—ฐ๊ฒฐ ๊ด€๋ฆฌ ๋น„์šฉ์„ ์น˜๋ฅด๋Š” ๋Œ€์‹  ์ฒซ ํ† ํฐ ์ง€์—ฐ๊ณผ ํƒ€์ž„์•„์›ƒ ์œ„ํ—˜์„ ๋™์‹œ์— ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

PART 3 ยท ์ŠคํŠธ๋ฆฌ๋ฐ

SSE ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์กฐ

Agent์—์„œ ๋ธŒ๋ผ์šฐ์ €๊นŒ์ง€ ํ† ํฐ์ด ์ „๋‹ฌ๋˜๋Š” 4๋‹จ๊ณ„ ํ๋ฆ„

  1. 1
    Agent ์ถ”๋ก 

    Strands Agent๊ฐ€ ๋ชจ๋ธ API๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ชจ๋“œ๋กœ ํ˜ธ์ถœ. ๋ชจ๋ธ์ด ํ† ํฐ์„ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค chunk ์ด๋ฒคํŠธ ๋ฐœ์ƒ.

  2. 2
    Token Callback

    callback_handler๋กœ ์ „๋‹ฌํ•œ ํ•จ์ˆ˜๊ฐ€ "data" ํ‚ค์˜ ํ…์ŠคํŠธ ๋ธํƒ€๋ฅผ ์ˆ˜์‹ . SSE ํ˜•์‹(data: ...)์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‘๋‹ต ํ์— ์ ์žฌ.

  3. 3
    SSE Transport

    FastAPI StreamingResponse / Lambda Function URL์ด Content-Type: text/event-stream์œผ๋กœ ์ฒญํฌ ์ „์†ก. Keep-alive ์œ ์ง€.

  4. 4
    Client Render

    EventSource API๊ฐ€ ํ† ํฐ์„ ์ˆ˜์‹ ํ•  ๋•Œ๋งˆ๋‹ค DOM์— append. ํƒ€์ดํ•‘ ํšจ๊ณผ๋กœ ์‹ค์‹œ๊ฐ„ ํ‘œ์‹œ. ์—ฐ๊ฒฐ ๋Š๊น€ ์‹œ ์ž๋™ ์žฌ์—ฐ๊ฒฐ.

takeaway

๋„ค ๋‹จ๊ณ„ ์ค‘ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ callback ํ•จ์ˆ˜์™€ SSE ์—”๋“œํฌ์ธํŠธ๋ฟ์ž…๋‹ˆ๋‹ค โ€” ๋‚˜๋จธ์ง€๋Š” ๋ชจ๋ธ๊ณผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

PART 3 ยท ์ŠคํŠธ๋ฆฌ๋ฐ

SSE ์žฅ๋ฉด โ€” ํ† ํฐ์ด ํ๋ฅด๋Š” ํ™”๋ฉด

๊ฐ™์€ ์ˆœ๊ฐ„์˜ ์–‘์ชฝ ๋ชจ์Šต โ€” ์™€์ด์–ด์˜ ๋ธํƒ€ ์ด๋ฒคํŠธ์™€ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ถ€๋ถ„ ์ถœ๋ ฅ






์™€์ด์–ด โ€” GET /chat/stream


HTTP/1.1 200 OK

Content-Type: text/event-stream ยท keep-alive

event: tool

data: get_weather

data: ์„œ์šธ์€

data:  ์ง€๊ธˆ ๋ง‘๊ณ 

data:  ๊ธฐ์˜จ์€ 24โ–Š

data: [DONE]  โ† ์ƒ์„ฑ์ด ๋๋‚˜๋ฉด ๋งˆ์ง€๋ง‰ ์ด๋ฒคํŠธ






app.example.com/chat


์„œ์šธ ๋‚ ์”จ ์–ด๋•Œ?

๐Ÿ”ง ๋„๊ตฌ ํ˜ธ์ถœ โ€” get_weather

์„œ์šธ์€ ์ง€๊ธˆ ๋ง‘๊ณ  ๊ธฐ์˜จ์€ 24


EventSource๊ฐ€ ๋ธํƒ€๋ฅผ ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค DOM์— append โ€” ์ „์ฒด ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ฒซ ํ† ํฐ๋ถ€ํ„ฐ ์ฆ‰์‹œ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค (TTFT ์ตœ์†Œํ™”).



๋ฐฐํฌ ํƒ€๊ฒŸ ์„ ํƒ

Lambda vs Fargate vs AgentCore Runtime

PART 4 ยท ๋ฐฐํฌ ํƒ€๊ฒŸ ์„ ํƒ

๋ฐฐํฌ ํƒ€๊ฒŸ

์›Œํฌ๋กœ๋“œ ํŠน์„ฑ์— ๋งž์ถ˜ ์„ธ ๊ฐ€์ง€ ์ปดํ“จํŒ… ํƒ€๊ฒŸ์˜ ์„ ํƒ ๊ธฐ์ค€

Lambda ยท Fargate ยท AgentCore Runtime

์ฝœ๋“œ์Šคํƒ€ํŠธยท๋น„์šฉยทํ™•์žฅ์„ฑ ๊ท ํ˜•์ ์„ ์ฐพ์•„ ์›Œํฌ๋กœ๋“œ๋ณ„ ์ตœ์  ํƒ€๊ฒŸ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  • Lambda โ€” ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋‹จ๋ฐœ ํ˜ธ์ถœ, ์ œ๋กœ ์œ ํœด ๋น„์šฉ
  • Fargate โ€” ์žฅ์‹œ๊ฐ„ ์„ธ์…˜ ยท ๋ฉ€ํ‹ฐํ„ด, ํƒ€์ž„์•„์›ƒ ๋ฌด์ œํ•œ
  • AgentCore Runtime โ€” ๊ด€๋ฆฌํ˜• ์˜คํ† ์Šค์ผ€์ผ ยท ๋‚ด์žฅ ๊ด€์ธก์„ฑ
  • agentcore create โ†’ deploy โ€” CLI ๋ฐฐํฌ ์›Œํฌํ”Œ๋กœ์šฐ
takeaway

๋งŒ๋Šฅ ํƒ€๊ฒŸ์€ ์—†์Šต๋‹ˆ๋‹ค โ€” ์ฝœ๋“œ์Šคํƒ€ํŠธ ยท ๋น„์šฉ ๋ชจ๋ธ ยท ํ™•์žฅ์„ฑ 3์ถ•์œผ๋กœ ์›Œํฌ๋กœ๋“œ๋งˆ๋‹ค ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.

PART 4 ยท ๋ฐฐํฌ ํƒ€๊ฒŸ ์„ ํƒ

๋ฐฐํฌ ์˜ต์…˜ 3์ข…

Lambda๋Š” ๊ฒฝ๋Ÿ‰ ๋‹จ๋ฐœ, Fargate๋Š” ์žฅ์‹œ๊ฐ„ ์„ธ์…˜, AgentCore Runtime์€ ๊ด€๋ฆฌํ˜• โ€” ๊ฐ•์ ๊ณผ ์ œ์•ฝ์˜ ๋Œ€๋น„

AWS Lambda

์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋‹จ๋ฐœ ํ˜ธ์ถœ์— ์ตœ์ . 15๋ถ„ ํƒ€์ž„์•„์›ƒ ์ด๋‚ด์˜ ๊ฒฝ๋Ÿ‰ ์—์ด์ „ํŠธ์— ์ ํ•ฉ.

  • โœ“ ์ œ๋กœ ์œ ํœด ๋น„์šฉ โ€” ํ˜ธ์ถœ ์‹œ์—๋งŒ ๊ณผ๊ธˆ
  • โœ“ ์ž๋™ ์Šค์ผ€์ผ๋ง โ€” ๋™์‹œ์„ฑ ์ˆ˜์ฒœ ์ฆ‰์‹œ ํ™•์žฅ
  • โœ“ Function URL๋กœ SSE ์ŠคํŠธ๋ฆฌ๋ฐ ์ง€์›
  • โœ— ์ฝœ๋“œ์Šคํƒ€ํŠธ โ€” ๋ณดํ†ต 1์ดˆ ๋ฏธ๋งŒ์ด์ง€๋งŒ ๋ฌด๊ฑฐ์šด ์˜์กด์„ฑ ์‹œ ์ˆ˜ ์ดˆ
  • โœ— 15๋ถ„ ํƒ€์ž„์•„์›ƒ โ€” ์žฅ์‹œ๊ฐ„ ์—์ด์ „ํ‹ฑ ๋ฃจํ”„ ๋ถˆ๊ฐ€
  • โœ— ๋ฉ”๋ชจ๋ฆฌ 10GB ์ œํ•œ โ€” ๋Œ€ํ˜• ์ปจํ…์ŠคํŠธ ์ฒ˜๋ฆฌ ํ•œ๊ณ„

์–ธ์ œ โ€” ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ, ์งง์€ ๋‹จ์ผ ํ„ด ์—์ด์ „ํŠธ, API Gateway ๋’ค ๊ฒฝ๋Ÿ‰ ์ถ”๋ก 

AWS Fargate

์žฅ์‹œ๊ฐ„ ์„ธ์…˜๊ณผ ๋ฉ€ํ‹ฐํ„ด ๋Œ€ํ™”์— ์ ํ•ฉ. ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™˜๊ฒฝ ์™„์ „ ์ œ์–ด.

  • โœ“ ํƒ€์ž„์•„์›ƒ ๋ฌด์ œํ•œ โ€” ์ˆ˜ ์‹œ๊ฐ„ ์—์ด์ „ํ‹ฑ ๋ฃจํ”„ ๊ฐ€๋Šฅ
  • โœ“ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ ์™„์ „ ์ œ์–ด โ€” GPU ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • โœ“ ALB/NLB ์—ฐ๋™์œผ๋กœ WebSocket ์•ˆ์ • ์ง€์›
  • โœ— ์ตœ์†Œ 1 ํƒœ์Šคํฌ ์ƒ์‹œ ๊ณผ๊ธˆ (์œ ํœด ๋น„์šฉ ๋ฐœ์ƒ)
  • โœ— ์Šค์ผ€์ผ์•„์›ƒ ์ˆ˜์‹ญ ์ดˆ ์†Œ์š” โ€” ๊ธ‰๊ฒฉํ•œ ํŠธ๋ž˜ํ”ฝ ์ŠคํŒŒ์ดํฌ ๋Œ€์‘ ์ง€์—ฐ
  • โœ— ECS ํƒœ์Šคํฌ ์ •์˜ยท์„œ๋น„์Šค ์„ค์ • ๊ด€๋ฆฌ ํ•„์š”

์–ธ์ œ โ€” ๋ฉ€ํ‹ฐํ„ด ๋Œ€ํ™”ํ˜• ์—์ด์ „ํŠธ, ์žฅ์‹œ๊ฐ„ ์ฝ”๋“œ ์ƒ์„ฑ, GPU ํ•„์š” ์›Œํฌ๋กœ๋“œ

AgentCore Runtime

ํ”„๋ ˆ์ž„์›Œํฌ ๋ถˆ๋ฌธ ๊ด€๋ฆฌํ˜• ๋Ÿฐํƒ€์ž„. ๋ฐฐํฌยท์Šค์ผ€์ผยท๋ชจ๋‹ˆํ„ฐ๋ง์„ ์›์Šคํ†ฑ ์ œ๊ณต.

  • โœ“ ์—์ด์ „ํŠธ ํŠนํ™” ์˜คํ† ์Šค์ผ€์ผ โ€” ๋™์‹œ ์„ธ์…˜ ๊ธฐ๋ฐ˜ ํ™•์žฅ
  • โœ“ ๋‚ด์žฅ ๊ด€์ธก์„ฑ โ€” ํŠธ๋ ˆ์ด์Šคยท๋ฉ”ํŠธ๋ฆญยท๋กœ๊ทธ ์ž๋™ ์ˆ˜์ง‘
  • โœ“ ๋ฒ„์ „ยท์—”๋“œํฌ์ธํŠธ ๊ด€๋ฆฌ๋กœ ์•ˆ์ „ํ•œ ๋กค์•„์›ƒ
  • โœ— AgentCore ์ข…์† โ€” ํƒ€ ํด๋ผ์šฐ๋“œ ์ด์‹ ๋ถˆ๊ฐ€
  • โœ— ๋Ÿฐํƒ€์ž„ ์ œ์•ฝ โ€” Python 3.12+/Node 22, ARM64, ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ 2GB
  • โœ— ์‹ ๊ทœ ์„œ๋น„์Šค โ€” ๋ฆฌ์ „ ๊ฐ€์šฉ์„ฑ ์ œํ•œ์ 

์–ธ์ œ โ€” ํ”„๋กœ๋•์…˜ ์—์ด์ „ํŠธ ์ „์šฉ ์ธํ”„๋ผ, ์šด์˜ ๋ถ€๋‹ด ์ตœ์†Œํ™”, Strands ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐฐํฌ

takeaway

๊ฐˆ๋ฆผ๊ธธ์€ ์‹คํ–‰ ์‹œ๊ฐ„ ํ•œ๋„ ยท ์œ ํœด ๋น„์šฉ ยท ์šด์˜ ๋ถ€๋‹ด์ž…๋‹ˆ๋‹ค โ€” ์งง์€ ๋‹จ๋ฐœ์ด๋ฉด Lambda, ์žฅ์‹œ๊ฐ„ ์„ธ์…˜์ด๋ฉด Fargate, ์šด์˜ ์ตœ์†Œํ™”๋ฉด AgentCore Runtime์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

PART 4 ยท ๋ฐฐํฌ ํƒ€๊ฒŸ ์„ ํƒ

๋ฐฐํฌ ํƒ€๊ฒŸ ๋น„๊ตํ‘œ

์ฝœ๋“œ์Šคํƒ€ํŠธยท๋น„์šฉ ๋ชจ๋ธยทํ™•์žฅ์„ฑยท์šด์˜ ๋ถ€๋‹ด 4์ถ• ์ •๋Ÿ‰ ๋น„๊ต

ํ•ญ๋ชฉLambdaFargateAgentCore Runtime
์ฝœ๋“œ์Šคํƒ€ํŠธ100ms~1์ดˆ+ (ํ˜ธ์ถœ์˜ 1% ๋ฏธ๋งŒ, ์˜์กด์„ฑ ํฌ๊ธฐ์— ์ขŒ์šฐ)ํƒœ์Šคํฌ ํ”„๋กœ๋น„์ €๋‹ ์•ฝ 30์ดˆ์›œ ํ’€ ์œ ์ง€๋กœ ์ฝœ๋“œ์Šคํƒ€ํŠธ ์ตœ์†Œํ™”
์ตœ๋Œ€ ์‹คํ–‰ ์‹œ๊ฐ„15๋ถ„๋ฌด์ œํ•œ์„ธ์…˜ ์ตœ๋Œ€ 8์‹œ๊ฐ„
๋น„์šฉ ๋ชจ๋ธํ˜ธ์ถœ๋‹น ๊ณผ๊ธˆ (์œ ํœด ๋ฌด๋ฃŒ)ํƒœ์Šคํฌ ์‹œ๊ฐ„๋‹น ๊ณผ๊ธˆ์†Œ๋น„ ๊ธฐ๋ฐ˜ โ€” ํ™œ์„ฑ ์ฒ˜๋ฆฌ CPU + ๋ฉ”๋ชจ๋ฆฌ(GB-h), ์š”์ฒญ๋‹น ๊ณผ๊ธˆ ์—†์Œ
์Šค์ผ€์ผ ๋‹จ์œ„๋™์‹œ ์‹คํ–‰ 1,000 (๊ธฐ๋ณธ ์ฟผํ„ฐ, ์ƒํ–ฅ ๊ฐ€๋Šฅ)ํƒœ์Šคํฌ ์ˆ˜ (๋ถ„ ๋‹จ์œ„)์—์ด์ „ํŠธ ์ธ์Šคํ„ด์Šค (์ดˆ ๋‹จ์œ„)
์šด์˜ ๋ถ€๋‹ด๋‚ฎ์Œ (์„œ๋ฒ„๋ฆฌ์Šค)์ค‘๊ฐ„ (ECS ์„ค์ •)๋‚ฎ์Œ (๊ด€๋ฆฌํ˜•)
์ŠคํŠธ๋ฆฌ๋ฐFunction URL SSEALB + WebSocket๋„ค์ดํ‹ฐ๋ธŒ SSE/WS
๊ด€์ธก์„ฑCloudWatch + X-Ray ์ˆ˜๋™Container Insights๋‚ด์žฅ ํŠธ๋ ˆ์ด์Šคยท๋ฉ”ํŠธ๋ฆญ
takeaway

Lambda์˜ 15๋ถ„ ํ•œ๋„์™€ Fargate์˜ ์œ ํœด ๊ณผ๊ธˆ์ด ๊ฐ์ž์˜ ์•ฝ์ ์ž…๋‹ˆ๋‹ค โ€” AgentCore Runtime์€ ์†Œ๋น„ ๊ธฐ๋ฐ˜ ๊ณผ๊ธˆ๊ณผ ์„ธ์…˜ ์ตœ๋Œ€ 8์‹œ๊ฐ„์œผ๋กœ ๊ทธ ์‚ฌ์ด๋ฅผ ๋ฉ”์›๋‹ˆ๋‹ค.

PART 4 ยท ๋ฐฐํฌ ํƒ€๊ฒŸ ์„ ํƒ

AgentCore Runtime ๋ฐฐํฌ ์˜ˆ์‹œ

Strands ์—์ด์ „ํŠธ๋ฅผ AgentCore์— ๋ฐฐํฌํ•˜๋Š” ์ตœ์†Œ ์„ค์ •๊ณผ CLI ์›Œํฌํ”Œ๋กœ์šฐ

python
# app/MyProdAgent/main.py โ€” agentcore create๊ฐ€ ์ƒ์„ฑํ•œ ์Šค์บํด๋“œ๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ์ˆ˜์ •
from strands import Agent
from strands.models import BedrockModel
from bedrock_agentcore import BedrockAgentCoreApp

app = BedrockAgentCoreApp()

agent = Agent(
    model=BedrockModel(
        model_id="us.anthropic.claude-sonnet-4-6",
        cache_tools="default",
        streaming=True,
    ),
    system_prompt="You are a production assistant.",
    tools=[search_docs, query_db, send_notification],
)

# @app.entrypoint โ€” AgentCore Runtime์ด ํ˜ธ์ถœํ•˜๋Š” ์ง„์ž…์ 
@app.entrypoint
def handler(payload):
    result = agent(payload.get("prompt"))
    return {"result": str(result)}
# โ”€โ”€โ”€ CLI ๋ฐฐํฌ ์›Œํฌํ”Œ๋กœ์šฐ โ”€โ”€โ”€
# 1. agentcore create --name MyProdAgent โ€” ์Šค์บํด๋“œ ์ƒ์„ฑ(main.py + pyproject.toml)
# 2. ์ƒ์„ฑ๋œ app/MyProdAgent/main.py๋ฅผ ์œ„ ๋‚ด์šฉ์œผ๋กœ ์ˆ˜์ •
# 3. agentcore deploy โ€” ์ฝ”๋“œ ํŒจํ‚ค์ง• + ๋ฐฐํฌ(๋ฒ„์ „ยท์—”๋“œํฌ์ธํŠธ๋Š” Runtime์ด ๊ด€๋ฆฌ)
์ข‹์€ ์—์ด์ „ํŠธ๋Š” ๋น ๋ฅด๊ณ  ์ €๋ ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์บ์‹ฑ ยท ์ŠคํŠธ๋ฆฌ๋ฐ ยท ๋ฐฐํฌ โ€” ํ”„๋กœ๋•์…˜ ์—์ด์ „ํŠธ์˜ 3๋Œ€ ์š”์†Œ