AWS ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ

์ƒ์„ฑํ˜• AI๋กœ ์‹คํ˜„ํ•˜๋Š” ์žฅ์•  ๋Œ€์‘๋ถ€ํ„ฐ ์ง€์‹ ์ž์‚ฐํ™”๊นŒ์ง€: Amazon Bedrock, Slack ๊ทธ๋ฆฌ๊ณ  Atlassian Confluence ํ†ตํ•ฉ ์ง€๋Šฅํ˜• ์‹œ์Šคํ…œ

๋ฐฐ๊ฒฝ ๋ฐ ๋ฌธ์ œ ์ •์˜

ํ˜„๋Œ€์˜ IT ์ธํ”„๋ผ ํ™˜๊ฒฝ์€ ๊ทธ ๊ทœ๋ชจ์™€ ๋ณต์žก์„ฑ์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์•„ํ‚คํ…์ฒ˜์˜ ๋„์ž…์ด๋‚˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™•์‚ฐ์œผ๋กœ ๊ธฐ์—…์˜ IT ์šด์˜ํŒ€์ด ๋Œ€์‘ํ•ด์•ผ ํ•  ์˜์—ญ์€ ์ง€์†์ ์œผ๋กœ ํ™•์žฅ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์‹œ์Šคํ…œ ์ „๋ฐ˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ, ๋ฉ”ํŠธ๋ฆญ ๊ทธ๋ฆฌ๊ณ  ๋ฉ”์‹œ์ง€๋“ค์„ ํšจ๊ณผ์ ์œผ๋กœ ๋ถ„์„ํ•˜๊ณ  ์‹ ์†ํ•˜๊ฒŒ ๋Œ€์‘ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ๊ณผ์ œ๋กœ ๋– ์˜ค๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์‹ ์†ํ•œ ์žฅ์•  ๋Œ€์‘์˜ ํ•„์š”์„ฑ
    ํŠนํžˆ ์šด์˜์ค‘์ธ ์‹œ์Šคํ…œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, IT์šด์˜ํŒ€์€ ํ•ด๋‹น ์›์ธ์„ ์‹ ์†ํžˆ ํŒŒ์•…ํ•˜๊ณ  ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์‹œ์Šคํ…œ ๊ทœ๋ชจ ๊ทธ๋ฆฌ๊ณ  ์•„ํ‚คํ…์ฒ˜ ๋ณต์žก์„ฑ์œผ๋กœ ์ธํ•ด ์ฆ๊ฐ€๋œ ์ •๋ณด๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๋ฐœ์ƒ์‹œ ๋น ๋ฅด๊ฒŒ ๊ทผ๋ณธ ์›์ธ์„ ์‹๋ณ„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋‹ค์–‘ํ•œ ์—ฐ๊ด€ ์†”๋ฃจ์…˜์„ ์šด์˜ํ•œ๋‹ค๋ฉด IT์šด์˜ํŒ€์˜ ๋ถ€๋‹ด์€ ๋”์šฑ ๊ฐ€์ค‘๋ฉ๋‹ˆ๋‹ค.
  2. ์ง€์‹์˜ ์ž์‚ฐํ™” ํ•„์š”์„ฑ
    ๋˜ํ•œ ์žฅ์• ๊ฐ€ ํ•ด๊ฒฐ๋œ ์ดํ›„์—๋„ ๋™์ผํ•œ ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ๊ณผ๊ฑฐ์˜ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ๋ณด๋‹ค ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด IT์šด์˜ํŒ€์˜ ์ถ•์ ๋œ ์žฅ์•  ๋Œ€์‘ ๊ฒฝํ—˜๊ณผ ํ•ด๊ฒฐ ๋…ธํ•˜์šฐ๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•œ ์ž์‚ฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ์ •๋ณด๋ฅผ ์ž˜ ์š”์•ฝ๋œ ๋‚ด์šฉ์œผ๋กœ ์ •๋ฆฌํ•˜์—ฌ ์ถ”ํ›„ ์žฅ์•  ์‹œ ํ™œ์šฉํ•œ๋‹ค๋ฉด ์žฅ์• ์˜ ๋นˆ๋„๊ฐ€ ๋†’์€ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ๊ฐœ์„  ๊ทธ๋ฆฌ๊ณ  ์—…๋ฌด์˜ ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ ์†”๋ฃจ์…˜: ์ƒ์„ฑํ˜• AI ๊ธฐ๋ฐ˜ ๋ฌธ์ œ ๋ถ„์„ ๋ฐ ํ™œ์šฉ

์ด ๋ธ”๋กœ๊ทธ์—์„œ๋Š” ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด AWS์˜ ์ƒ์„ฑํ˜• AI์„œ๋น„์Šค์™€ ๊ธฐ์—…์—์„œ ์ฃผ๋กœ ํ™œ์šฉ์ค‘์ธ ํ˜‘์—… ๋„๊ตฌ์ธ Slack, Atlassian Confluence๋ฅผ ํ†ตํ•ฉํ•œ ์ƒ์„ฑํ˜• AI ๊ธฐ๋ฐ˜ ํด๋ผ์šฐ๋“œ ์šด์˜ ์ง€์› ์†”๋ฃจ์…˜์„ ์†Œ๊ฐœํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์ด ์†”๋ฃจ์…˜์€ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ด 3๊ฐœ์˜ ์ฃผ์š”ํ•œ ํ๋ฆ„์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Figure 1. ์†”๋ฃจ์…˜ ํ”„๋กœ์„ธ์Šค

1. Slack์—์„œ์˜ ํ˜‘์—… ๋ฐ ๋ฌธ์ œ ํ•ด๊ฒฐ(โ‘ ,โ‘ก,โ‘ข,โ‘ฃ,โ‘ค)
IT์šด์˜ํŒ€์€ Slack์„ Amazon Bedrock Agents์™€ ์—ฐ๊ณ„ํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ Amazon CloudWatch Logs ๋กœ ์ˆ˜์ง‘๋˜๋Š” ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ 1์ฐจ ์‹๋ณ„ ๋ฐ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ AWS Lambda๋ฅผ ํ†ตํ•ด Amazon Bedrock ์—๊ฒŒ ์š”์ฒญํ•˜๊ณ  Amazon Bedrock Agents Connector ๋กœ ์ถ”๊ฐ€ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์„ ๋…ผ์˜ํ•˜๋ฉด์„œ ํŒ€์›๋“ค๊ณผ์˜ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ถ„์„ํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ๋ถ„์„ ๋œ ๋ฌธ์ œ๋ฅผ ์š”์•ฝ ํ›„ ๊ฒŒ์‹œ๊ธ€ ์ƒ์„ฑ(โ‘ฅ)
๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋ฉด, Slack Channel ๋‚ด ์ „์ฒด ํ•ด๊ฒฐ๊ณผ์ •์„ AWS Lambda๋ฅผ ํ†ตํ•ด Amazon Bedrock Agents๋กœ ์ „๋‹ฌ๋˜์–ด ์š”์•ฝ๋ณธ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด ์š”์•ฝ์€ AWS Lambda๋กœ Atlassian Confluence ์— ์ž๋™ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์ง€์†์ ์ธ ํ•™์Šต ๋ฐ ๊ฐœ์„ ํ™œ์šฉ(โ‘ฆ)
์ƒ์„ฑ๋œ ์š”์•ฝ์€ Amazon Bedrock Knowledge Bases์— ์ถ”๊ฐ€๋˜์–ด ํ–ฅํ›„ ์œ ์‚ฌํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ–ฅํ›„ ์ด ์†”๋ฃจ์…˜์€ ์ง€์†์ ์œผ๋กœ ๋ฌธ์„œํ™”๋œ ์ •๋ณด๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์ ์  ๋” ์ •๊ตํ•œ ๋ถ„์„๊ณผ ์ œ์•ˆ์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋Œ€ํšจ๊ณผ

์ด ์†”๋ฃจ์…˜์€ IT ์šด์˜ํŒ€์˜ ์—…๋ฌด ํšจ์œจ์„ฑ์„ ๋†’์ด๋Š”๋ฐ ์ดˆ์ ์„ ๋‘์—ˆ๊ณ  AWS์˜ ์ƒ์„ฑํ˜• AI์„œ๋น„์Šค, ์„œ๋ฒ„๋ฆฌ์Šค ์ปดํ“จํŒ… ๊ทธ๋ฆฌ๊ณ  ํ˜‘์—… ๋„๊ตฌ๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ฒŒ ๋˜๋Š” IT์šด์˜ํŒ€์ด ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ๋Œ€์‘์„ ์ž๋™ํ™”ํ•˜๊ณ  ๊ณผ๊ฑฐ์˜ ์žฅ์•  ์ฒ˜๋ฆฌ ์ด๋ ฅ๊ณผ ํ•ด๊ฒฐ ๋…ธํ•˜์šฐ๋“ค์„ ํŒ€์˜ Knowledge Basesํ™” ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ LLM์ด ๋‹ค์‹œ ์ฐธ์กฐํ•˜์—ฌ ์ถ”ํ›„ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ํ™œ์šฉํ•จ์œผ๋กœ์จ, ๋ณด๋‹ค ์‹ ์†ํ•˜๊ณ  ์šด์˜ํ™˜๊ฒฝ์— ๋งž๋Š” ์ž๋™ํ™”๋œ ์žฅ์•  ๋Œ€์‘์ด ๊ฐ€๋Šฅํ•ด์งˆ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์‚ฌ๋ก€ 1 : ์šด์˜์ค‘ ์ˆ˜์‹ ๋˜๋Š” Error Message์— ๋Œ€ํ•œ ๋น ๋ฅธ ๋ถ„์„

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ๋ณด์•ˆ, ๋„คํŠธ์›Œํฌ ๋“ฑ IT์šด์˜์ž์—๊ฒŒ ์ˆ˜์‹ ๋˜๋Š” ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ Error Message๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ถ„์„ํ•ด ์ฃผ๊ณ  ์ถ”๊ฐ€์ ์œผ๋กœ ์–ด๋–ค ์กฐ์น˜๋ฅผ ํ•ด์•ผ ํ• ์ง€ ๋Œ€์‘์„ ์œ„ํ•œ ๊ถŒ๊ณ  ๋˜๋Š” ๊ฐ€์ด๋“œ๋ฅผ ํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์ด ์†”๋ฃจ์…˜์„ ํ™œ์šฉํ•˜์—ฌ Slack์œผ๋กœ ์ˆ˜์‹ ๋ฐ›์€ Error Message(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ๋ณด์•ˆ ๊ด€๋ จ)์— ๋Œ€ํ•ด ๋ถ„์„ํ•œ ์ƒ˜ํ”Œ์ž…๋‹ˆ๋‹ค.

Figure 2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ WAF ๊ด€๋ จ ๋ฌธ์ œ ๋ถ„์„

์‚ฌ์šฉ ์‚ฌ๋ก€ 2 : Knowledge Bases ๋ฅผ ํ†ตํ•œ ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ ๋ถ„์„ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ ์ œ์‹œ

๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Slack๋‚ด AWS Chatbot์„ ์—ฐ๊ฒฐํ•˜๊ณ  Amazon Bedrock Agent Connector๋กœ ์ถ”๊ฐ€์ ์ธ ๋ถ„์„์„ LLM์—๊ฒŒ ์š”์ฒญํ•˜๋ฉด, Amazon Bedrock Knowledge Bases๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ์„ ๋ถ„์„ํ•˜๊ณ  ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์„ ๋น ๋ฅด๊ฒŒ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ž˜ ๋ชจ๋ฅด๋Š” ๋ถ„์•ผ์˜ ์ธ์‹œ๋˜ํŠธ ์ฒ˜๋ฆฌ๋‚˜ ์—…๋ฌด๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ์ดˆ๋ณด ์šด์˜์ž์—๊ฒŒ  ๋Œ€์‘ ๋Šฅ๋ ฅ์„ ์‹ฌ์–ด์ค„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

Figure 3. Amazon Bedrock Agents Connector๋ฅผ ํ†ตํ•œ ๋ชจ๋ธ๊ณผ์˜ Interaction

์‚ฌ์šฉ ์‚ฌ๋ก€ 3 : ๋ถ„์„์ด ์™„๋ฃŒ๋œ ๋‚ด์šฉ์„ ์ž์‚ฐํ™”

์œ„์™€ ๊ฐ™์ด ๋ถ„์„๋œ ๋‚ด์šฉ์„ LLM์„ ํ†ตํ•ด์„œ ์š”์•ฝํ•จ๊ณผ ๋™์‹œ์— ์‚ฌ๋‚ด Atlassian Confluence ์— ์†์‰ฝ๊ฒŒ Reporting ํ•˜์—ฌ ํ–ฅํ›„ ์šด์˜์„ ์œ„ํ•œ ์ž์‚ฐ์œผ๋กœ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

Figure 4. ๋ถ„์„๋œ ๋‚ด์šฉ์„ ์š”์•ฝ ํ›„ Atlassian Confluence์— ๊ฒŒ์‹œ๊ธ€ ์ž๋™ ์ƒ์„ฑ

์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ํ๋ฆ„

์ด ์†”๋ฃจ์…˜์˜ ์ „์ฒด ์•„ํ‚คํ…์ฒ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์œผ๋ฉฐ ํ๋ฆ„์€ ํŠน์ • ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๋ช… ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์‹œ๋‚˜๋ฆฌ์˜ค: AWS ํ™˜๊ฒฝ์—์„œ B2C ์‡ผํ•‘๋ชฐ์„ ์šด์˜์ค‘์ธ ๊ธฐ์—…์˜ IT์šด์˜ํŒ€์€ 10๋ช…์˜ ๋‹ด๋‹น์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, Slack์˜ #Issue-all ์ฑ„๋„์„ ํ†ตํ•ด์„œ ์šด์˜ ๊ด€๋ฆฌ๋˜๋Š” ์ธํ”„๋ผ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹  ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํŒ€์˜ wiki(Confluence) ์—์„œ ์ž‘์—…๋‚ด์—ญ๊ณผ ์žฅ์• ๊ด€๋ฆฌ ๋ฐ ํšŒ๊ณ ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Figure 5. ์ „์ฒด ์†”๋ฃจ์…˜ ์•„ํ‚คํ…์ฒ˜์™€ ๋™์ž‘ ์„ค๋ช…

๋‹จ๊ณ„ 1: Knowledge Bases ๊ตฌ์„ฑ

IT์šด์˜ํŒ€(Cloud Operator)์€ ๊ธฐ์กด Atlassian Confluence์— ์ž‘์„ฑํ•˜๋Š” ์ž‘์—…๋‚ด์—ญ, ์šด์˜์ค‘์˜ ์žฅ์•  ๋Œ€์‘ ํžˆ์Šคํ† ๋ฆฌ ๋“ฑ์„ ์ž‘์„ฑํ•˜๊ณ ,  AWS ์„œ๋น„์Šค์— ๋Œ€ํ•œ FAQ๋‚˜ ์ฃผ์š” ์„œ๋น„์Šค Docs ๋“ฑ์„ Amazon S3์— ์ ์žฌํ•ฉ๋‹ˆ๋‹ค.

๋‹จ๊ณ„ 2:  ๋กœ๊ทธ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์•Œ๋ฆผ ์ „์†ก

์šด์˜ํŒ€์˜ ํ˜‘์—…๋„๊ตฌ๋กœ ์ „๋‹ฌ๋˜๋Š” Message๋Š” Amazon CloudWatch, APM, ๋ณด์•ˆ ์†”๋ฃจ์…˜ ๋“ฑ ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค. (์ด ๋ธ”๋กœ๊ทธ์—์„œ๋Š” Amazon CloudWatch Logs ๋กœ ํ•œ์ •ํ•˜์—ฌ ์„ค๋ช…) Amazon CloudWatch Logs๋Š” log groups filter๋ฅผ ํ†ตํ•ด Application Resources ๋กœ ๋ถ€ํ„ฐ์˜ ๋กœ๊ทธ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • filter์— ํ•ด๋‹นํ•˜๋Š” Message๊ฐ€ ๋ฐœ์ƒ ์‹œ AWS Lambda๋Š” Slack ์˜ #Issue-all ์ฑ„๋„๋กœ ์•Œ๋ฆผ์„ ์ „์†กํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
(์ด ๋ธ”๋กœ๊ทธ์—์„œ๋Š” Amazon CloudWatch Logs์—์„œ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ • Error๋ฅผ ์˜ˆ์‹œ๋กœ ์„ค๋ช…)

AWS Lambda๋Š” ์•„๋ž˜์™€ ์—๋Ÿฌ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  Slack์œผ๋กœ ์›๋ฌธ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
(Function: message-to-slack)

[ERROR]"An error occurred (ClientException) when calling the RegisterTaskDefinition operation: Invalid 'cpu' setting for task."

Figure 6. Error Message ์ˆ˜์‹  ๋‹ด๋‹น์ž ํ™•์ธ

์ˆ˜์‹ ๋ฐ›์€ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•ด โ€œWatch/To bedrock agent/Reportingโ€œ 3๊ฐ€์ง€ ๋ฒ„ํŠผ์ด ์ฃผ์–ด์ง€๊ฒŒ ๋˜๋ฉฐ, ํŒ€์›์ค‘ ๋จผ์ € Watch๋ฅผ ์„ ํƒ ์‹œ Thread์—๋Š” โ€œxx๋‹˜์ด Watching ์ค‘ ์ž…๋‹ˆ๋‹ค.โ€ ์ด๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๋‹ฌ๋ฆฌ๋ฉฐ ํŒ€์›๋“ค์€ ๋™๋ฃŒ๊ฐ€ ์ด์Šˆ๋ฅผ ํ™•์ธ์ค‘์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ๊ณ„ 3:  ์ด์Šˆ ๋ถ„์„

1์ฐจ ๋ถ„์„์„ ์œ„ํ•ด To Bedrock Agent ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ด Error Message๋Š” Slack๊ณผ ์—ฐ๋™๋œ AWS Chatbot Connector๋ฅผ ํ†ตํ•ด์„œ Amazon Bedrock Agents์— ๋กœ๊ทธ ๋ถ„์„์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

Figure 7. Amazon Bedrock Agents ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ Error Message 1์ฐจ ๋ถ„์„

๊ทธ ๋ฐ–์—๋„ Slack์˜ Thread ๋‚ด์—์„œ AWS Chatbot๊ณผ ์—ฐ๊ฒฐ๋œ Amazon Bedrock Agent Connector๋ฅผ ํ†ตํ•ด ์ถ”๊ฐ€์ ์œผ๋กœ  โ€œ@aws ask connector name โ€ฆโ€๊ณผ ๊ฐ™์ด Amazon Bedrock Agents ์— Alias ๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ๋Œ€ํ™”๋ฅผ ํ†ตํ•ด ์™„์„ฑ๋„ ์žˆ๋Š” ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ด ๋‚˜๊ฐ‘๋‹ˆ๋‹ค.

Figure 8. Amazon Bedrock Knowledge Bases ๋ฅผ ํ†ตํ•ดError Message 2์ฐจ ๋ถ„์„

์ด ๊ณผ์ •์—์„œ Amazon Bedrock Knowledge bases์— ์—ฐ๋™๋œ Amazon S3 (AWS FAQ Docs๊ณผ ๊ฐ์ข… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ์†”๋ฃจ์…˜ ๊ด€๋ จ ํ”Œ๋ ˆ์ด๋ถ)์™€ ์‚ฌ๋‚ด ์žฅ์•  ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ์ •๋ฆฌ๋œ Wiki(Atlassian Confluence Workspace)๊ฐ€ RAG์— ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋‹จ๊ณ„ 4:  ๋ถ„์„๋‚ด์šฉ์˜ ๋“ฑ๋ก ๋ฐ ์ž์‚ฐํ™”

Slack Thread์—  ๋ˆ„์ ๋œ ๋Œ€ํ™”๋‚ด์šฉ๊ณผ ์ž‘์—… ํžˆ์Šคํ† ๋ฆฌ ๊ทธ๋ฆฌ๊ณ  Amazon Bedrock Agents ๋ฅผ ํ†ตํ•ด ๋ถ„์„ํ•œ ๋‚ด์šฉ์„ ์ž์‚ฐํ™” ํ•˜๊ธฐ ์œ„ํ•ด Reporting ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์„œ Atlassian Confluence ์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก๋œ ๊ฒฐ๊ณผ๋Š” ํ•ด๋‹น ๋ฌธ์ œ์— ๋Œ€ํ•œ ์›์ธ/ํ•ด๊ฒฐ์—ฌ๋ถ€/์ฐธ์—ฌ์ž/ํ•ด๊ฒฐ๊ณผ์ •์œผ๋กœ ์š”์•ฝ๋˜์–ด ํŒ€์˜ Atlassian Confluence์— ๊ฒŒ์‹œ๊ธ€๋กœ ์ƒ์„ฑ ๋ฉ๋‹ˆ๋‹ค.

Figure 9. ๋ถ„์„์ด ์™„๋ฃŒ๋˜๊ณ  ์ž์‚ฐํ™”๋ฅผ ์œ„ํ•œ Reporting ์‹œ Atlassian Confluence์— ์š”์•ฝ ๋“ฑ๋ก

์ด Reporting ๋œ ์ •๋ณด๋Š” Amazon Bedrock Agents์— ์˜ํ•ด ํŒ€์„ ์œ„ํ•œ Knowledge bases๋กœ ์žฌํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ ์žฅ์• ๋Œ€์‘์„ ์œ„ํ•œ Amazon Bedrock Knowledge bases์— ๋‹ค์‹œ ์ด ํ•ด๊ฒฐ ๊ณผ์ •์ด Sync ๋˜๋ฉด์„œ ์ถ”ํ›„์— ์œ ์‚ฌ ์ด์Šˆํ•ด๊ฒฐ์„ ์œ„ํ•œ ๊ฐ€์ด๋“œ ์—ญํ• ์„ ํ•˜๋Š” ์ž์‚ฐ ํ˜•ํƒœ๋กœ ์šด์˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Figure 10. Atlassian Confluence ์— ๋“ฑ๋ก๋œ ์žฅ์• ์— ๋Œ€ํ•œ ์š”์•ฝ ๋ณด๊ณ ์„œ

์ด๋Ÿฌํ•œ ํ˜•ํƒœ์˜ ๋ฆฌํฌํŒ… ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋ชจ์•„์„œ Weekly, Monthly ํ˜•ํƒœ๋กœ ์š”์•ฝํ•˜๊ณ  ๋ถ„์„ ํ•œ๋‹ค๋ฉด ์ข€ ๋” ์ž๋™ํ™” ๋œ ์žฅ์•  ๋ถ„์„์ด๋‚˜ ์šฐ๋ฆฌ ํšŒ์‚ฌ๊ฐ€ ์šด์˜์ค‘์ธ ์ฃผ์š” ์„œ๋น„์Šค์— ๋ฐœ์ƒํ•˜๋Š” ์žฅ์•  Trend ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ์šฉ๋„๋กœ๋„ ํ™œ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜ ๊ตฌ์„ฑ ์š”์†Œ:

๋ณธ ๋ฌธ์„œ์—์„œ ๋‹ค๋ฃจ๋Š” ์„œ๋น„์Šค์™€ ์—ญํ• ์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

  1. Amazon Bedrock: Amazon Bedrock์€ AWS์˜ ์ƒ์„ฑํ˜• AI ์„œ๋น„์Šค๋กœ, Claude, AI21 Labs์˜ Jurassic-2, AWS Titan๊ณผ ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ(LLM)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ ๋ถ„์„, ๋ฌธ์ œ ์›์ธ ํŒŒ์•…, ํ•ด๊ฒฐ ๋ฐฉ์•ˆ ์ œ์•ˆ, ์ž๋™ ์š”์•ฝ ์ƒ์„ฑ ๋“ฑ ๋‹ค์–‘ํ•œ AI ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. Agents for Amazon Bedrock: ์›Œํฌํ”Œ๋กœ๋ฅผ ๊ฐ„์†Œํ™”ํ•˜๊ณ  ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์„ ์ž๋™ํ™”๋ฉฐ ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋ฉฐ, ํšจ์œจ์ ์œผ๋กœ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  3. Amazon Bedrock Knowledge Bases: Amazon Bedrock์˜ ํŒŒ์šด๋ฐ์ด์…˜ ๋ชจ๋ธ(FM)์„ ํšŒ์‚ฌ ๋ฐ์ดํ„ฐ์— ์•ˆ์ „ํ•˜๊ฒŒ ์—ฐ๊ฒฐํ•˜์—ฌ ๊ฒ€์ƒ‰ ์ฆ๊ฐ• ์ƒ์„ฑ(RAG)์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•˜๋ฉด ์ง€์†์ ์œผ๋กœ FM์„ ์žฌํ›ˆ๋ จํ•  ํ•„์š” ์—†์ด ๊ด€๋ จ์„ฑ์ด ๋†’๊ณ  ์ƒํ™ฉ์— ๋งž๋Š” ์ •ํ™•ํ•œ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์šด์˜ํŒ€์˜ ๊ฒฝํ—˜๊ณผ ๊ณผ๊ฑฐ ๋ฌธ์ œ ํ•ด๊ฒฐ ์‚ฌ๋ก€๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ์ €์žฅํ•˜์—ฌ LLM์—๊ฒŒ ํ•™์Šต ์ž๋ฃŒ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‘๋‹ต์€ ์ง€์†์ ์œผ๋กœ ๊ฐœ์„ ๋˜๊ณ  ๋” ๋‚˜์€ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. RAG(Retrieval Augmented Generation) ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ , ๊ธฐ์ดˆ ๋ชจ๋ธ์˜ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋ณด๊ฐ•ํ•˜์—ฌ ๋ณด๋‹ค ์ •ํ™•ํ•˜๊ณ  ๊ด€๋ จ์„ฑ ๋†’์€ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋„๋ก ๋•์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” RAG ์˜ ๊ธฐ๋ณธ์ ์ธ ๋‹จ๊ณ„๋ฅผ ์†Œ๊ฐœ ํ•ฉ๋‹ˆ๋‹ค.
    1. ๋‹จ๊ณ„: ๋ฐ์ดํ„ฐ ์†Œ์Šค์—์„œ ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ์™€ ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    2. ๋‹จ๊ณ„: ์‚ฌ์šฉ์ž ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ์ ์ ˆํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๊ธฐ์ดˆ ๋ชจ๋ธ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋ณด๊ฐ•ํ•ฉ๋‹ˆ๋‹ค.
    3. ๋‹จ๊ณ„: ๊ฒ€์ƒ‰๋œ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž์—ฐ์–ด ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ง์ ‘ ์ธ์šฉ๋ฌธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค
  4. AWS Lambda :์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ปดํ“จํŒ… ์„œ๋น„์Šค์ด๋ฉฐ, ์ด ์†”๋ฃจ์…˜์—์„œ๋Š” ์„œ๋ฒ„๋ฆฌ์Šค ์ปดํ“จํŒ… ํ™˜๊ฒฝ์—์„œ ๊ฐ์ข… ๋กœ๊ทธ ๋ฐ์ดํ„ฐ ์ˆ˜์‹  ๋ฐ Slack ๋‚ด Event ์ˆ˜ํ–‰๊ณผ ๋Œ€ํ™”์ค‘์ธ Thread์— ๋Œ€ํ•ด Prompt๋ฅผ ํ†ตํ•ด Atlassian Confluence ๋กœ์˜ Reporting ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ Atlassian Confluence๋Š” ์ง€์†์ ์ธ ์žฅ์•  ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋ฉฐ ํ–ฅํ›„ ์ž์‚ฐ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  5. AWS Chatbot: AWS Chatbot์€ Microsoft Teams, Slack๊ณผ ๊ฐ™์€ ํ˜‘์—… ๋„๊ตฌ์™€ AWS ๋ฆฌ์†Œ์Šค๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, 2024๋…„ 9์›” 17์ผ์— ์ถœ์‹œ๋œ Slack๊ณผ Agents for Amazon Bedrock ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ ๊ธฐ๋Šฅ์€ ์šด์˜ํŒ€์ด Slack ๋‚ด์—์„œ ์ง์ ‘ LLM๊ณผ์˜ ๋Œ€ํ™”๋ฅผ ํ†ตํ•ด ์žฅ์•  ๋Œ€์‘๊ณผ ํ•ด๊ฒฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  6. AWS Secrets Manager : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ ์ธ์ฆ, OAuth ํ† ํฐ, API ํ‚ค ๋ฐ ๊ธฐํƒ€ ์•”ํ˜ธ๋ฅผ ๊ด€๋ฆฌ, ๊ฒ€์ƒ‰, ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ธ”๋กœ๊ทธ์—์„œ๋Š” AWS Lambda๊ฐ€ ์ˆ˜ํ–‰ํ•  Task์— ํ•„์š”ํ•œ ํ˜‘์—…๋„๊ตฌ์˜ ์ธ์ฆ ์ •๋ณด๋“ค๋ฅผ Secrets ์œผ๋กœ ์ €์žฅํ•˜๊ณ  AWS Lambda์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ํ™œ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  7. Slack :์šด์˜ํŒ€์ด ์ต์ˆ™ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ํ˜‘์—… ๋„๊ตฌ๋กœ Message ์ „๋‹ฌ์šฉ Bot๊ณผ ์—ฐ๋™ํ•˜๊ณ AWS Chatbot๊ณผ ํ†ตํ•ฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ Agents connector ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  8. Atlassian Confluence : ํŒ€์ด ํ”„๋กœ์ ํŠธ๋‚˜ ์•„์ด๋””์–ด๋ฅผ ํ†ตํ•ด ์ž‘์—…์„ ์ฒด๊ณ„์ ์œผ๋กœ ์กฐ์งํ•˜๊ณ  ๊ณต์œ ํ•˜์—ฌ ๋ชจ๋“  ํŒ€์›์ด ํ˜‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์ด๋ฉฐ, ํŒ€์˜ ์ง€์†์ ์ธ Knowledge Bases์œผ๋กœ ํ™œ์šฉ ๋ฉ๋‹ˆ๋‹ค.

๊ตฌํ˜„ ๋ฐฉ์•ˆ

์ด ๋ธ”๋กœ๊ทธ์— ์†Œ๊ฐœํ•ด ๋“œ๋ฆฐ ์†”๋ฃจ์…˜์— ํ•„์š”ํ•œ ์„œ๋น„์Šค๋ฅผ ์†Œ๊ฐœํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

1. Pr-erequisites:

๋ณธ ๋ฌธ์„œ์— ์‚ฌ์šฉ๋˜๋Š” ์„œ๋น„์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์œผ๋ฉฐ ์‚ฌ์ „์— ์ค€๋น„๊ฐ€ ํ•„์š” ํ•ฉ๋‹ˆ๋‹ค.
์•„๋ž˜์˜ 3๊ฐ€์ง€๋Š” ์‚ฌ์ „์— ์ค€๋น„๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ๊ฐ ์ธ์ฆ ์ •๋ณด๋“ค์„ ํ†ตํ•ด ์ƒํ˜ธ๊ฐ„ API ์—ฐ๋™์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • AWS Account ์ค€๋น„ํ•˜๊ธฐ
    • Amazon S3: IT์šด์˜ํŒ€์ด ํ™œ์šฉํ•  ๊ธฐ์ˆ  FAQ, ํŒ€๋‚ด ์„œ๋น„์Šค API, ์žฅ์•  ์ด๋ ฅ ๊ฐ™์€ ๋ฌธ์„œ๋“ค์„ ์ ์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด Amazon S3๋Š” Amazon Bedrock Knowledge Bases ๊ฐ€ ์ฐธ์กฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • Slack ์ฑ„๋„ ์ƒ์„ฑ
    • AWS Lambda์™€ ์—ฐ๋™์„ ์œ„ํ•œ Workspace ID, Channel ID, Bot Token ๋“ฑ์˜ ์ •๋ณด๋ฅผ ํ™•๋ณดํ•ด ๋‘ก๋‹ˆ๋‹ค.
  • Atlassian Confluence ๋ฐ ๊ณต๊ฐ„์ƒ์„ฑ
    • AWS Lambda์™€ ์•ˆ์ „ํ•œ API์—ฐ๋™์„ ์œ„ํ•œ Administer Personal Access Tokens, URL ์ •๋ณด ๋“ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

2. Amazon Bedrock Knowledge Bases ์ค€๋น„:

๋จผ์ € Amazon Bedrock Knowledge Bases ๋ฅผ ์ƒ์„ฑํ•ด ๋ด…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Data Source Type์€ Amazon S3์™€ Atlassian Confluence ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด Data Source ๋Š” ๋™์‹œ์— ์„ ํƒ์ด ์•ˆ ๋˜๋ฏ€๋กœ ๋จผ์ € Amazon S3๋ฅผ ์„ ํƒํ•˜์—ฌ Amazon Bedrock Knowledge Bases ์ƒ์„ฑ์„ ์™„๋ฃŒํ•œ ๋’ค์— Atlassian Confluence ๋ฅผ ์ถ”๊ฐ€๋กœ ์„ ํƒํ•˜์‹œ๊ธฐ๋ฅผ ๊ถŒ์žฅ ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

Atlassian Confluence ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Atlassian Account์˜ APIํ† ํฐ ๋ฉ”๋‰ด์—์„œ APIํ† ํฐ์„ ๋ฏธ๋ฆฌ  ์ƒ์„ฑํ•˜๊ณ , Domain ์ •๋ณด๋„ ํ™•๋ณดํ•ด ๋‘ก๋‹ˆ๋‹ค.

์œ„์™€๊ฐ™์ด Atlassian Account์—์„œ APIํ† ํฐ์„ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ์ •๋ณด๋ฅผ AWS Secret Manger์— ์ €์žฅํ•œ ๋’ค ๊ทธ ARN์„ Data Source ๋ฅผ ์„ค์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ์€ Atlassian Confluence ๋ฅผ ์ถ”๊ฐ€ ์„ ํƒํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

์„ค์ •์—์„œ๋Š” Authentication method ๋กœ Basic Authentication ์„ ์„ ํƒ ํ›„ ์ธ์ฆ์„ ์œ„ํ•ด ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋‘” AWS Secrets Manager Secret ์˜ ARN์„ ๋“ฑ๋กํ•˜์—ฌ Amazon Bedrock Knowledge Bases ์™€ Atlassian Confluence ๊ฐ„์˜ ์•ˆ์ „ํ•œ ์—ฐ๊ฒฐ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ƒ์„ฑ๋œ Amazon Bedrock Knowledge Bases ์˜ Data Source ์ธ Atlassian Confluence ์˜ ์ธ์ฆ์ •๋ณด๋Š” ์ถ”ํ›„ AWS Lambda ์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ๋“ฑ๋กํ•˜์—ฌ ์‚ฌ์šฉ ๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ Amazon Bedrock Knowledge Bases ์—๋Š” Data Source ๊ฐ€ 2๊ฐœ ์—ฐ๊ฒฐ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ Data Source ์— ๋Œ€ํ•œ ์ˆœ์ฐจ์  ๊ฐœ๋ณ„ ๋™๊ธฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ Amazon Knowledge Bases ์ค€๋น„๋ฅผ ์™„๋ฃŒ ํ•ฉ๋‹ˆ๋‹ค.

3. Amazon Bedrock Agents ์ƒ์„ฑ:

๋‹ค์Œ์€ Amazon Bedrock ์„ ํ˜ธ์ถœํ•  Amazon Bedrock Agents ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ™”๋ฉด์ž…๋‹ˆ๋‹ค. Amazon Bedrock ์„ ํ†ตํ•ด ์‚ฌ์šฉํ•  Foundation Model์„ ์„ ํƒ(Anthropic Claude 3.5 Sonnet v1)ํ•˜๊ณ  Agent ์˜ ์—ญํ• , ์ˆ˜ํ–‰ํ•  ์ž‘์—…๊ณผ ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ๋ช…ํ™•ํžˆ ์ •์˜ํ•ด ์ค๋‹ˆ๋‹ค. ์ €๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ง€์‹œ์‚ฌํ•ญ์„ ๋ถ€์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ช…ํ™•ํ•œ ์ง€์‹œ ์‚ฌํ•ญ์€ ์—์ด์ „ํŠธ์˜ ์—ญํ• , ํ–‰๋™ ๋ฐฉ์นจ, ๊ธฐ์ˆ ์  ์ œํ•œ ๋“ฑ์„ ํฌํ•จํ•˜์—ฌ ์—์ด์ „ํŠธ๊ฐ€ ์‚ฌ์šฉ์ž์™€ ํšจ๊ณผ์ ์œผ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ€œYou are an Agent supporting IT operators running the AWS cloud. If you receive questions about aws cloud in general from IT operators on slack, you should first check the S3 and Confluence wikis linked to Bedrock's knowledge base, and answer them accurately by summarizing them through Claude LLM selected by Bedrock. Of course, you must answer them in Korean. In summary, you are an agent for smooth communication between Slack and Bedrock. I'd like you to do your best to find and attach relevant URLs with evidence for the messages you receive. And please provide a solution as close to the correct answer as possible to resolve this issue."

์ด๋ ‡๊ฒŒ Agent ์ƒ์„ฑ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•œ Amazon Bedrock Knowledge Bases ์™€ ์—ฐ๊ฒฐ์‹œ์ผœ ์ค๋‹ˆ๋‹ค.

์ด Agent๋Š” ์ด์ œ ์•ž์„œ ์„ ํƒํ•œ FM๋ชจ๋ธ๊ณผ Amazon Bedrock Knowledge Bases ์˜ Data Source ์ธ Amazon S3์™€ Atlassian Confluence๋ฅผ ํ™œ์šฉํ•ด์„œ IT์šด์˜ํŒ€ ์งˆ์˜์— ๋Œ€ํ•ด ๋Œ€์‘ํ•   ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Agent ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค๋ฉด ์œ„์™€ ๊ฐ™์ด Alias๋„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด Alias๋Š” ์ถ”ํ›„ Slack์— ๋ฐฐํฌ๋œ AWS Chatbot์—์„œ Agent Connector๋กœ Amazon Bedrock ์„ ํ˜ธ์ถœํ•  ๋•Œ ํ™œ์šฉ ๋ฉ๋‹ˆ๋‹ค.

4. ๋กœ๊ทธ ์ˆ˜์ง‘์šฉ Lambda Function ์ƒ์„ฑ:

์•„๋ž˜์˜ AWS Lambda ์ฝ”๋“œ(message-to-slack)๋Š” Python ์œผ๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ์œผ๋ฉฐ, Slack API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์ฑ„๋„์— ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • Slack ๋ฉ”์‹œ์ง€ ์ „์†ก: ๋ฉ”์‹œ์ง€์—๋Š” ์˜ค๋ฅ˜ ๋‚ด์šฉ๊ณผ ํ•จ๊ป˜ User Interactive ์„ ์œ„ํ•œ ๋ฒ„ํŠผ์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด, ์ถ”๊ฐ€์ ์ธ ์กฐ์น˜๋ฅผ ์ทจํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
import boto3
import os
import json
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
from botocore.exceptions import ClientError

def get_secret():
   secret_name = os.getenv('SLACK_TOKEN_SECRET')
   region_name = os.getenv('REGION')

   # Create a Secrets Manager client
   session = boto3.session.Session()
   client = session.client(
      service_name='secretsmanager',
      region_name=region_name
   )

   try:
      get_secret_value_response = client.get_secret_value(
         SecretId=secret_name
      )
   except ClientError as e:
      raise e

   secret_string = get_secret_value_response['SecretString']
   secret_dict = json.loads(secret_string)
   
   return secret_dict["slack_token"]

def lambda_handler(event, context):
   client = WebClient(token=get_secret())
  
  # Error Message๋ฅผ ๋ฐœ์ƒํ•˜๊ธฐ ์œ„ํ•œ Test Code 
   message_text = "An error occurred (ClientException) when calling the RegisterTaskDefinition operation: Invalid 'cpu' setting for task."
  
   try:
      result = client.chat_postMessage(
         channel="bora", 
         text=message_text,
         blocks=[
            {
               "type": "section",
               "block_id": "error_text",
               "text": {
                  "type": "mrkdwn",
                  "text": "*Error Message* : " + message_text
               }
            },
            {
               "type": "section",
               "text": {
                  "type": "mrkdwn",
                  "text": ">:robot_face: ์•„๋ž˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด LLM์„ ํ†ตํ•ด ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค."
               }
            },
            {
               "type": "actions",
               "elements": [
                  {
                     "type": "button",
                     "text": {
                        "type": "plain_text",
                        "emoji": True,
                        "text": "Watch"
                     },
                     "style": "danger",
                     "value": "click_watch"
                  },
                  {
                     "type": "button",
                     "text": {
                        "type": "plain_text",
                        "emoji": True,
                        "text": "To bedrock agent"
                     },
                     "style": "primary",
                     "value": "click_agent"
                  },
                  {
                     "type": "button",
                     "text": {
                        "type": "plain_text",
                        "emoji": True,
                        "text": "Reporting"
                     },
                     "value": "click_reporting"
                  }
               ]
            }
         ]
      )
      print(result)

   except SlackApiError as e:
      print(f"Error posting message: {e}")

5. AWS Chatbot์„ ์ƒ์„ฑํ•˜๊ณ  Slack๊ณผ ์—ฐ๋™:

AWS Chatbot ์€ Amazon Chime ์ด๋‚˜ Slack๊ณผ ์—ฐ๋™ํ•˜์—ฌ ์—…๋ฌด ์ž๋™ํ™”๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค ์ž…๋‹ˆ๋‹ค. ์ตœ๊ทผ์—๋Š” Slack ๊ณผ ์—ฐ๋™ํ•œ AWS Chatbot๊ณผ Amazon Bedrock Agents์™€์˜ ํ†ตํ•ฉ์„ ๊ธฐ์ ์œผ๋กœ ๋”์šฑ ์†์‰ฝ๊ฒŒ Slack๋ฟ๋งŒ์•„๋‹ˆ๋ผ Microsoft Teams ์ฑ„ํŒ… ์ฑ„๋„์—์„œ ์ง์ ‘ Amazon Bedrock Agent์™€ ์ƒํ˜ธ์ž‘์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์กด์— ๋น„ํ•ด ํ›จ์”ฌ ์‹ฌํ”Œํ•˜๊ฒŒ Amazon Bedrock๊ณผ์˜ ์—ฐ๋™์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ธ”๋กœ๊ทธ์—์„œ๋Š” AWS Chatbot์„ ์ƒ์„ฑํ•˜์—ฌ Slack Channel์— ๋ฐฐํฌํ•˜๊ณ  Guardrail policies  2๊ฐœ(ReadOnlyAccess, AmazonBedrockFullAccess)๋ฅผ ์ถ”๊ฐ€ํ•œ ๋‚ด์šฉ์„ ๊ณต์œ  ๋“œ๋ฆฌ๋ฉฐ ์ž์„ธํ•œ ์„ค์ •๋ฐฉ๋ฒ•์€ Amazon Bedrock ์—์ด์ „ํŠธ ์—ฐ๊ฒฐ ์„ค๋ช…์„œ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Slack์˜ Channel์—์„œ Amazon Bedrock Agents ๊ฐ€ Amazon Bedrock ์˜ FM(Foundation Model)์„ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ตœ์ดˆ 1ํšŒ Connector ์„ค์ •์ด ํ•„์š” ํ•˜๋ฉฐ ๊ทธ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์„ค์ •์ด ์™„๋ฃŒ ๋˜์—ˆ๋‹ค๋ฉด ์ดํ›„ Slack์—์„œ Amazon Bedrock Agents ๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
@aws ask โ€œconnector ์ด๋ฆ„โ€ ์‚ฌ์šฉ์ž ์งˆ๋ฌธ!!

6.  Lambda์™€ ํ†ตํ•ฉํ•  API GW ์ƒ์„ฑ:

์ด์ œ Slack Channel์—์„œ ๋ถ„์„ํ•œ ๋‚ด์šฉ์„ ์š”์•ฝํ•˜์—ฌ Atlassian Confluence ๋กœ Reporting ํ•˜๊ธฐ ์œ„ํ•œ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” AWS Lambda ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ Amazon API Gateway์™€ ํ†ตํ•ฉํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, Slack Channel์—์„œ ๋ฒ„ํŠผ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š” Reporting ์š”์ฒญ์„ AWS Lambda ํ•จ์ˆ˜๋กœ ๋ผ์šฐํŒ…ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

Amazon API Gateway์—์„œ ์‚ฌ์šฉํ•˜๋Š” Mapping Templates์€ ์š”์ฒญ ๋˜๋Š” ์‘๋‹ต์˜ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋‹ค๋ฅธ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” Amazon API Gateway๊ฐ€ AWS Lambda ํ•จ์ˆ˜์™€ ๊ฐ™์€ AWS ์„œ๋น„์Šค์™€ ํ†ตํ•ฉ๋  ๋•Œ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์กฐ์ •ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.  Mapping Templates ์—ญํ•  ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ด๋Š” ์š”์ฒญ์˜ ํŽ˜์ด๋กœ๋“œ๋ฅผ AWS Lambda ํ•จ์ˆ˜๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜, ๋ฐ˜๋Œ€๋กœ AWS Lambda ํ•จ์ˆ˜์˜ ์‘๋‹ต์„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ํŒŒ๋ผ๋ฏธํ„ฐ ๋งคํ•‘: ๊ฒฝ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ, ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง ํŒŒ๋ผ๋ฏธํ„ฐ, ํ—ค๋” ํŒŒ๋ผ๋ฏธํ„ฐ ๋“ฑ์„ Amazon API Gateway์˜ ์š”์ฒญ ๋ฉ”์„œ๋“œ์— ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Slack์—์„œ๋Š” Amazon API Gateway์˜Endpoint ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๊ทธ์— ํ†ตํ•ฉ๋œ AWS Lambda๋Š” ์ด Invoke URL ์„ ํŠธ๋ฆฌ๊ฑฐ๋กœ ํ•จ์ˆ˜๊ฐ€ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

7. Slack ์„ค์ •ํ•˜๊ธฐ:

์ตœ์ดˆ AWS Lambda๋กœ ๋ถ€ํ„ฐ Slack Channel ๋กœ ์ˆ˜์‹ ๋˜๋Š” ์›๋ณธ Error Message ์— ๋Œ€ํ•ด 3๊ฐ€์ง€ Action[Watching | To Bedrock Agent | Reporting] ์„ ๋‹ด๋‹น์ž๊ฐ€ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ์—ญํ• ์„ ์ œ๊ณตํ•˜๋Š” Slack App ์„ ํ•˜๋‚˜ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด App์€ Slack์—์„œ ๊ฐ ๋ฒ„ํŠผ์„ ์„ ํƒํ•˜๋ฉด ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•ด ์ฃผ๋ฉฐ, ์ฆ‰์‹œ ๊ฒฐ๊ณผ๋ฅผ Thread ์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

์ด Slack App์€ Atlassian Confluence Reporting ์š”์ฒญ๋„ ๋‹ด๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด Slack App ์„ค์ •ํ™”๋ฉด์—์„œ Interactivity Request URL ์„ ์ง€์ •ํ•ด ์ค๋‹ˆ๋‹ค. ๊ธฐ์žฌํ•  URL์€ ์œ„์—์„œ Amazon API Gateway ์™€ ํ†ตํ•ฉ๋œ Amazon API Gateway์˜Endpoint ์ž…๋‹ˆ๋‹ค.

Slack App์€ Slack ๋‚ด์—์„œ์˜ ์‚ฌ์šฉ์ž ๋ฒ„ํŠผ Action ์— ๋Œ€ํ•ด Reporting ์š”์ฒญ๋„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•ด์„œ Slack App์˜ OAuth Token ๊ฐ’์ด ํ•„์š”ํ•œ๋ฐ ์ด ๋ธ”๋กœ๊ทธ์—์„œ๋Š” AWS Lambda์—์„œ ์•ˆ์ „ํ•œ API ์—ฐ๋™์„ ์œ„ํ•ด Slack OAuth Token, Atlassian Confluence API Key์™€ URL์ •๋ณด, Amazon Bedrock Agents์™€ Alias๊นŒ์ง€ AWS Secret Manager ์— ์ €์žฅ ํ–ˆ์œผ๋ฉฐ

AWS Lambda์—์„œ๋Š” ์—ฌ๊ธฐ์— ์ €์žฅ๋œ ws/chatops/secret ๊ฐ’์„ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•˜์—ฌ ๋ณด์•ˆ์— ์œ ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

Slack ์˜ OAuth Token์„ ๋ฐœ๊ธ‰ํ•˜๊ณ  Permission scopes ์„ ์ž˜ ์„ค์ •ํ•ด ์ค˜์•ผ Slack App๊ณผ User๊ฐ„์˜ ์›ํ™œํ•œ ๋Œ€ํ™”๊ฐ€ ๊ฐ€๋Šฅ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ธ”๋กœ๊ทธ์—์„œ ์†Œ๊ฐœํ•˜๋Š” ๊ตฌ์„ฑ์—์„  ์•„๋ž˜์˜ ์˜ต์…˜๋“ค์„ ์ถ”๊ฐ€ํ–ˆ์œผ๋‹ˆ ์ฐธ๊ณ  ํ•˜์„ธ์š”.
assistant:write, channels:history , channels:read, channels:write.topic, chat:write, chat:write.public, groups:history, groups:write, im:history, incoming-webhook, mpim:history

8. Confluence Reporting์šฉ Lambda Function:

์ด AWS Lambda ์ฝ”๋“œ(gw-to-slack)๋Š” AWS Lambda ํ™˜๊ฒฝ์—์„œ Slack๊ณผ Atlassian Confluence, ๊ทธ๋ฆฌ๊ณ  AWS Bedrock Agents๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

  • ์‹ค์‹œ๊ฐ„ ์˜ค๋ฅ˜ ์•Œ๋ฆผ ๋ฐ ๋ถ„์„: Slack์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์•Œ๋ฆฌ๊ณ , AWS Bedrock Agents๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ˜‘์—… ๋ฐ ๋ฌธ์„œํ™” ์ง€์›: ๋ถ„์„๋œ ๊ฒฐ๊ณผ๋ฅผ Atlassian Confluence์— ๋ฌธ์„œํ™”ํ•˜์—ฌ ํŒ€์›๋“ค๊ณผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ˜‘์—…์„ ๊ฐ•ํ™”ํ•˜๊ณ  ์ •๋ณด์˜ ์ค‘์•™ ์ง‘์ค‘ํ™” ๊ทธ๋ฆฌ๊ณ  ๋ถ„์„๋œ ๋‚ด์šฉ์„ ์—…๋ฐ์ดํŠธ ํ•˜๋ฉฐ ์ž์‚ฐํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • get_secret() ํ•จ์ˆ˜๋Š” AWS Secrets Manager์—์„œ Slack ํ† ํฐ, Atlassian Confluence API ํ‚ค ๋“ฑ ํ•„์š”ํ•œ Secrets value๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • get_user_name() ํ•จ์ˆ˜๋Š” Slack API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ID๋กœ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ด๋Š” ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜๋ณต ํ˜ธ์ถœ์„ ์ค„์ž…๋‹ˆ๋‹ค.
  • send_slack_message() ํ•จ์ˆ˜๋Š” ์ง€์ •๋œ ์ฑ„๋„์— ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋Š” Slack API์˜postMessage ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
  • create_confluence_page() ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ ๋‚ด์šฉ์„ Atlassian Confluence์— ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋กœ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋Š”๋ฐ Atlassian Confluence API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • invoke_bedrock_agent() ํ•จ์ˆ˜๋Š” AWS Bedrock Agent๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ error_message๋ฅผ ๋ถ„์„ํ•˜๊ฑฐ๋‚˜ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค.
import json
import logging
import os
import boto3
import botocore
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
import requests
from datetime import datetime
from atlassian import Confluence
from botocore.exceptions import ClientError
import time
import hmac
import hashlib
from http.server import BaseHTTPRequestHandler, HTTPServer

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def get_secret(secret):
    secret_name = os.getenv('SLACK_TOKEN_SECRET')
    region_name = os.getenv('REGION')

    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
        region_name=region_name
    )

    try:
        get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
        )
    except ClientError as e:
        raise e

    secret_string = get_secret_value_response['SecretString']
    secret_dict = json.loads(secret_string)

    return secret_dict[secret]

OAUTH_TOKEN = get_secret('slack_token')
WIKI_URL = get_secret('wiki_url')
WIKI_API_KEY = get_secret('wiki_api_key')
WIKI_USER = get_secret('wiki_user')
AGENT_ID = get_secret('bedrock_agent')
ALIAS_ID = get_secret('bedrock_agent_alias')

SLACK_HEADERS = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {OAUTH_TOKEN}"
}
session = boto3.Session()
   

def get_user_name(user_id, user_name_cache):
    if user_id not in user_name_cache:
        response = requests.get(f"https://slack.com/api/users.info?user={user_id}", headers=SLACK_HEADERS)
        user_info = response.json()
        user_name_cache[user_id] = user_info.get("user", {}).get("name", user_id)
    return user_name_cache[user_id]

def send_slack_message(channel, text, thread_ts=None):
    message = {"channel": channel, "text": text, "thread_ts": thread_ts}
    requests.post("https://slack.com/api/chat.postMessage", headers=SLACK_HEADERS, json=message)

def create_confluence_page(content):
    confluence = Confluence(url=WIKI_URL, username=WIKI_USER, password=WIKI_API_KEY)
    response = confluence.create_page(
        space="WinningGen",
        title=f"slack reporting - {datetime.now().strftime('%Y.%m.%d %H:%M')}",
        body="(AWS Bedrock์— ์˜ํ•ด ์š”์•ฝ ์ž‘์„ฑ๋œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.)<br><br>" + content.replace("\n", "<br>"),
        parent_id="2129937"
    )
    return response.get("id")

def invoke_bedrock_agent(input_text, analysis_type, session_id):
    print("session_id : ", session_id)
    prompts = {
        'analysis': "Please analyze the following error. All conversations should be in Korean: ",
        'summary': "Summarize the following conversation. Include information about the cause, status of the solution, and involved participants: "
    }
    client = session.client('bedrock-agent-runtime', region_name='ap-northeast-2', config=botocore.config.Config(read_timeout=900, connect_timeout=900, retries={"max_attempts": 0}))
    try:
        response = client.invoke_agent(
            agentAliasId=ALIAS_ID,
            agentId=AGENT_ID,
            sessionId=session_id,
            inputText=prompts[analysis_type] + input_text
        )
        return ''.join(event["chunk"]["bytes"].decode() for event in response.get("completion", []))
    except Exception as e:
        logger.error(f"Error invoking Bedrock agent: {e}")
        return f"Error invoking Bedrock agent: {str(e)}"

def get_comments_thread(channel_id, thread_ts):
    response = requests.get("https://slack.com/api/conversations.replies", headers=SLACK_HEADERS, params={"channel": channel_id, "ts": thread_ts})
    replies = response.json().get("messages", [])
    user_name_cache = {}
    replies_text = "\n".join(
        f"{get_user_name(reply.get('user'), user_name_cache)}: {reply.get('text')}" for reply in replies if reply.get("text") and reply.get("user")
    )
    try:
        bedrock_response = invoke_bedrock_agent(replies_text, 'summary', thread_ts)
        page_id = create_confluence_page(bedrock_response)
        send_slack_message(channel_id, f"Report๊ฐ€ ๋“ฑ๋ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.\n{WIKI_URL}/spaces/WinningGen/pages/{page_id}", thread_ts)
        return {"result": bedrock_response}
    except SlackApiError as e:
        logger.error(f"Slack API error: {e.response['error']}")
        return {"result": "Slack reply failed"}

def lambda_handler(event, context):
    print(event)
    bt_value = event['actions'][0]['value']
    thread_ts = event["message"]["ts"]
    channel_id = event["channel"]["id"]
    print("thread_ts : ", thread_ts)
    print("channel_id : ", channel_id)

    if bt_value == "click_watch":
        send_slack_message(channel_id, f"<@{event['user']['username']}> ๋‹˜์ด Watching ์ค‘ ์ž…๋‹ˆ๋‹ค.", thread_ts)
    elif bt_value == "click_agent":
        error_message = next(
            (block['text']['text'] for block in event["message"]["blocks"] if block.get('block_id') == 'error_text'), 
            None
        )
        send_slack_message(channel_id, f"์ €๋Š” Error MSG๋ฅผ ์ „๋‹ฌํ•˜๋Š” AWS ChatBot ์ž…๋‹ˆ๋‹ค. ", thread_ts)
        send_slack_message(channel_id, f"<@aws> ask bora "+"์—๊ฒŒ ์ด ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ๋ถ„์„์„ ์š”์ฒญํ• ๊ฒŒ\n" + f"*MSG ์›๋ฌธ*:\n{error_message}", thread_ts)
        send_slack_message(channel_id, "๋ถ„์„์ค‘์ด๋‹ˆ ์ž ์‹œ๋งŒ ๊ธฐ๋‹ค๋ ค์ฃผ์„ธ์š”.", thread_ts)        

    elif bt_value == "click_reporting":
        send_slack_message(channel_id, "Reporting ์ƒ์„ฑ ์ค‘์ž…๋‹ˆ๋‹ค. ์ž ์‹œ๋งŒ ๊ธฐ๋‹ค๋ ค์ฃผ์„ธ์š”.", thread_ts)
        get_comments_thread(channel_id, thread_ts)

๋งˆ๋ฌด๋ฆฌ

์ง€๊ธˆ๊นŒ์ง€ Amazon Bedrock ๊ณผ Claude 3.5 Sonnet ๋ชจ๋ธ ๊ทธ๋ฆฌ๊ณ  ์—ฐ๊ด€๋œ ์„œ๋น„์Šค์ธ Amazon Bedrock Agents, Amazon Bedrock Knowledge bases์™€ Slack์˜ ํ†ตํ•ฉ์€ IT ์šด์˜ํŒ€์ด ์ง๋ฉดํ•œ ์ฃผ์š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์žˆ์–ด ์‹ ์†ํ•œ ๋„๊ตฌ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ์‹ค์‹œ๊ฐ„ ์˜ค๋ฅ˜ ๋ถ„์„๊ณผ ๋Œ€์‘, ํšจ์œจ์ ์ธ ํ˜‘์—… ํ™˜๊ฒฝ์„ ํ†ตํ•œ ํžˆ์Šคํ† ๋ฆฌ์˜ ์ž์‚ฐํ™”๋ฅผ ์ž๋™ํ™” ํ•˜๋ฉฐ ์—…๋ฌด์˜ ์ƒ์‚ฐ์„ฑ๊ณผ ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ด ๋ธ”๋กœ๊ทธ์—์„œ ๊ณต์œ ๋“œ๋ฆฐ ๋‚ด์šฉ์€ ์•„์ง ์ž‘์€ ์ผ๋ถ€๋ถ„์ด์ง€๋งŒ ์•ž์œผ๋กœ ์ƒ์„ฑํ˜•AI ๊ธฐ์ˆ ์ด ๋”์šฑ ๋ฐœ์ „ํ•จ์— ๋”ฐ๋ผ, IT์šด์˜์„ ์œ„ํ•œ ์†”๋ฃจ์…˜์€ ๊ณ„์† ํ™•์žฅํ•ด ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒ์„ฑํ˜• AI๊ธฐ๋ฐ˜์˜ ํด๋ผ์šฐ๋“œ ์šด์˜์„ ํ†ตํ•ด์„œ IT ์šด์˜ํŒ€์€ ๋” ๋ณต์žกํ•˜๊ณ  ์ „๋žต์ ์ธ ๊ณผ์ œ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋ฐ”๋กœ AWS Bedrock๊ณผ AWS Chatbot์„ ๊ธฐ์—…์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค์–‘ํ•œ ํ˜‘์—… ๋„๊ตฌ๋“ค๊ณผ ํ™œ์šฉํ•˜์—ฌ ํด๋ผ์šฐ๋“œ ์šด์˜ ํ™˜๊ฒฝ์„ ๋ณ€ํ™”์‹œ์ผœ ๋ณด์„ธ์š”.

๋˜ํ•œ ์†”๋ฃจ์…˜์— ์‚ฌ์šฉ๋˜๋Š” AWS์˜ ์„œ๋น„์Šค๋“ค์˜ ์ž์„ธํ•œ ์ž๋ฃŒ์™€ ํ™œ์šฉ์‚ฌ๋ก€๋ฅผ ์ฐธ๊ณ ํ•ด ๋ณด์„ธ์š”.

Jonghyuok Kim

Jonghyuok Kim

๊น€์ข…ํ˜ Solutions Architect๋Š” AWS์—์„œ ์ œ์กฐ, ๋ฆฌํ…Œ์ผ, CPG ์‚ฐ์—…์˜ ๊ณ ๊ฐ๋ถ„๋“ค๊ณผ ํ•จ๊ป˜ ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ์—์„œ์˜ ๋งŽ์€ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ณ ๊ฐ๋ถ„๋“ค์˜ Workload์— ๋Œ€ํ•œ AWS Cloud๋„์ž… ์—ฌ์ • ๋ฐ ์ตœ์ ํ™”์— ๋„์›€์„ ๋“œ๋ฆฌ๊ณ  ์žˆ์œผ๋ฉฐ, ์ตœ๊ทผ์—๋Š” AWS IoT๊ธฐ๋ฐ˜์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ๊ธฐ์ˆ ์˜ ํ™•์‚ฐ์— ๊ธฐ์—ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.