๊ณ ๊ฐ€์šฉ์„ฑ(High Availability) AWS Lambda ์„œ๋ฒ„ ๊ตฌ์ถ•

youngki
  • #aws lambda
  • #timeout
  • #runtime crash
  • #high availability
  • #fromm

๋“ค์–ด๊ฐ€๋ฉฐ

๋…ธ๋จธ์Šค๋Š” latency๊ฐ€ ์ค‘์š”ํ•œ ์„œ๋น„์Šค๋Š” ECS Fargate๋กœ ์šด์˜ํ•˜์ง€๋งŒ, ๋งŽ์€ ์„œ๋น„์Šค๋ฅผ AWS Lambda๋กœ ์šด์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
AWS Lambda ๋ฐฐํฌ ๊ด€๋ฆฌ๋Š” serverless framework๊ณผ github actions์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

AWS Lambda๋Š” ์„œ๋ฒ„๋ฆฌ์Šค ์ปดํ“จํŒ…์˜ ํ•ต์‹ฌ ์žฅ์ ๋“ค์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

ํ•˜์ง€๋งŒ AWS Lambda์—๋Š” ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ค์šด ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ํ•จ์ˆ˜๊ฐ€ ์–ธ์ œ ์ข…๋ฃŒ๋ ์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

์ •์ƒ์ ์ธ ์ฒ˜๋ฆฌ ์™„๋ฃŒ ํ›„ ์–ธ์ œ ์ข…๋ฃŒ๋ ์ง€ ๋ชจ๋ฅด๋Š” ๊ฒƒ์€ ๊ทธ๋ ‡๋‹ค ์น˜๋”๋ผ๋„,
(์ •์ƒ์ ์ธ ์ข…๋ฃŒ๋„ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉด, redis์˜ ๋ถ€๋‹ด์„ ์ค„์—ฌ์ค„ ์ˆ˜ ์žˆ๋Š” swap out ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.),
๋น„์ •์ƒ์ ์ธ ์ข…๋ฃŒ๋Š” ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๋Š” ์ž…์žฅ์—์„œ ๊ฐ„๊ณผํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

AWS ๋Š” Lambda Failures ์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtime-environment.html
์ €ํฌ๋Š” ์ด ๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์–ด๋–ป๊ฒŒ ๊ณ ๊ฐ€์šฉ์„ฑ AWS Lambda ์„œ๋น„์Šค๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์†Œ๊ฐœํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

Lambda Failures

1. Timeout

AWS Lambda ํ•จ์ˆ˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 3์ดˆ์˜ ํƒ€์ž„์•„์›ƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์ตœ๋Œ€ 15๋ถ„๊นŒ์ง€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํƒ€์ž„์•„์›ƒ์ด ๋ฐœ์ƒํ•˜๋ฉด Lambda ํ•จ์ˆ˜๋Š” ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๋ฉฐ, ์ด๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ ์†์‹ค์ด๋‚˜ ์„œ๋น„์Šค ์ค‘๋‹จ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Lambda ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ•  ๋•Œ, request event์— ๋”ฐ๋ผ, ์ ์ ˆํ•œ ํƒ€์ž„์•„์›ƒ ๊ฐ’์„ ์„ค์ •ํ•˜์ง€๋งŒ,
์ดํ›„ ์ ์ง„์ ์œผ๋กœ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค ๋ถ€ํ•˜์—์„œ ํƒ€์ž„์•„์›ƒ์˜ ๋ฐœ์ƒ์—ฌ๋ถ€๋ฅผ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ ํƒ€์ž„์•„์›ƒ์— ์ฃผ๋ชฉํ•˜๊ฒŒ ๋œ ์ด์œ ๋Š”, ์ด๊ฒƒ์ด DB ๊ณผ๋ถ€ํ•˜์˜ ์‚ฌ์ „ ์ง•ํ›„๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
ํŠธ๋ž˜ํ”ฝ์ด ์ฆ๊ฐ€ํ•  ๋•Œ Lambda๋Š” ํ™•์žฅ์— ์ œ์•ฝ์ด ์—†์ง€๋งŒ, DB๋Š” Lambda ๋งŒํผ ๋™์  ํŠน์„ฑ์ด ์ข‹์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ํƒ€์ž„์•„์›ƒ์ด ๋ฐœ๊ฒฌ๋˜๋ฉด ํ•ด๋‹น ์„œ๋น„์Šค์˜ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ๊ฒ€ํ† ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

2. Runtime Crash

์ €ํฌ ํŒ€์—์„œ ๊ฐœ๋ฐœ์‹œ, ์ž์ฃผ ํ•˜๋Š” ์‹ค์ˆ˜ ์ค‘์— ํ•˜๋‚˜๊ฐ€, TypeOrmModule.forFeature()์— Entity๋ฅผ ๋“ฑ๋กํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿด ๊ฒฝ์šฐ, ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Lambda ์‹œ์ž‘ ์‹œ ์—”ํ‹ฐํ‹ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์ง€ ๋ชปํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ํฌ๋ž˜์‹œ์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

TypeORMError: Entity metadata for <Table>#<Relation> was not found. Check if you specified a correct entity object and if it's connected in the connection options.
at /var/task/src/<WorkSpace>/lambda.js:205408:19
at Array.forEach (<anonymous>)
at EntityMetadataBuilder.computeInverseProperties (/var/task/src/<WorkSpace>/lambda.js:205405:34)
at /var/task/src/<WorkSpace>/lambda.js:204908:58
at Array.forEach (<anonymous>)
at EntityMetadataBuilder.build (/var/task/src/<WorkSpace>/lambda.js:204908:25)
at ConnectionMetadataBuilder.buildEntityMetadatas (/var/task/src/<WorkSpace>/lambda.js:205797:150)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async DataSource.buildMetadatas (/var/task/src/<WorkSpace>/lambda.js:207373:33)
at async DataSource.initialize (/var/task/src/<WorkSpace>/lambda.js:207083:11)

๊ทธ๋ฆฌ๊ณ , ์–ผ๋งˆ์ „ ํฐ Object ์ธ์ง€ ๋ชจ๋ฅด๊ณ , logger๋กœ ์ถœ๋ ฅํ•˜๋‹ค๊ฐ€, OOM(Out Of Memory) ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
์„œ๋น„์Šค ๋’ท๋‹จ์—์„œ ๋„๋Š” Batch Lambda๋ผ, CS๋ฅผ ๋ฐ›๊ณ ์„œ ์•Œ๊ฒŒ๋œ ์žฅ์• ์˜€์Šต๋‹ˆ๋‹ค.

<--- Last few GCs --->
[2:0x558c38855fa0]    22535 ms: Scavenge 892.7 (937.2) -> 892.5 (938.0) MB, 18.35 / 0.00 ms  (average mu = 0.900, current mu = 0.768) allocation failure;
[2:0x558c38855fa0]    22559 ms: Scavenge 893.6 (938.0) -> 893.3 (943.0) MB, 3.13 / 0.00 ms  (average mu = 0.900, current mu = 0.768) allocation failure;
[2:0x558c38855fa0]    22876 ms: Mark-Compact 896.4 (943.0) -> 895.7 (946.2) MB, 273.55 / 0.00 ms  (average mu = 0.798, current mu = 0.432) allocation failure; scavenge might not succeed
<--- JS stacktrace --->
FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
----- Native stack trace -----
1: 0x558c13879cf3 node::OOMErrorHandler(char const*, v8::OOMDetails const&) [/var/lang/bin/node]
2: 0x558c13c452cd v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, v8::OOMDetails const&) [/var/lang/bin/node]
3: 0x558c13c45699 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, v8::OOMDetails const&) [/var/lang/bin/node]
4: 0x558c13ebe25a  [/var/lang/bin/node]
5: 0x558c13ed8c2e v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/var/lang/bin/node]
6: 0x558c13ea88f2 v8::internal::HeapAllocator::AllocateRawWithLightRetrySlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [/var/lang/bin/node]
7: 0x558c13ea9f74 v8::internal::HeapAllocator::AllocateRawWithRetryOrFailSlowPath(int, v8::internal::AllocationType, v8::internal::AllocationOrigin, v8::internal::AllocationAlignment) [/var/lang/bin/node]
8: 0x558c13e8305b v8::internal::Factory::AllocateRaw(int, v8::internal::AllocationType, v8::internal::AllocationAlignment) [/var/lang/bin/node]
9: 0x558c13e6af23 v8::internal::FactoryBase<v8::internal::Factory>::AllocateRawWithImmortalMap(int, v8::internal::AllocationType, v8::internal::Map, v8::internal::AllocationAlignment) [/var/lang/bin/node]
10: 0x558c13e6db26 v8::internal::FactoryBase<v8::internal::Factory>::NewRawOneByteString(int, v8::internal::AllocationType) [/var/lang/bin/node]
11: 0x558c143bc88d v8::internal::IncrementalStringBuilder::Extend() [/var/lang/bin/node]
12: 0x558c14020ea8 v8::internal::JsonStringifier::SerializeString(v8::internal::Handle<v8::internal::String>) [/var/lang/bin/node]
13: 0x558c1402201a v8::internal::JsonStringifier::Result v8::internal::JsonStringifier::Serialize_<true>(v8::internal::Handle<v8::internal::Object>, bool, v8::internal::Handle<v8::internal::Object>) [/var/lang/bin/node]
14: 0x558c14026a91 v8::internal::JsonStringifier::Result v8::internal::JsonStringifier::Serialize_<false>(v8::internal::Handle<v8::internal::Object>, bool, v8::internal::Handle<v8::internal::Object>) [/var/lang/bin/node]
15: 0x558c14023ecd v8::internal::JsonStringifier::Result v8::internal::JsonStringifier::Serialize_<true>(v8::internal::Handle<v8::internal::Object>, bool, v8::internal::Handle<v8::internal::Object>) [/var/lang/bin/node]
16: 0x558c140248cf v8::internal::JsonStringifier::SerializeJSReceiverSlow(v8::internal::Handle<v8::internal::JSReceiver>) [/var/lang/bin/node]
17: 0x558c1402619a v8::internal::JsonStringifier::Result v8::internal::JsonStringifier::Serialize_<false>(v8::internal::Handle<v8::internal::Object>, bool, v8::internal::Handle<v8::internal::Object>) [/var/lang/bin/node]
18: 0x558c14027949 v8::internal::JsonStringify(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>) [/var/lang/bin/node]
19: 0x558c13cf015d v8::internal::Builtin_JsonStringify(int, unsigned long*, v8::internal::Isolate*) [/var/lang/bin/node]
20: 0x558c148091b6  [/var/lang/bin/node]
END RequestId: f7bd706c-3c22-44f2-a687-5192a09f71c3
REPORT RequestId: f7bd706c-3c22-44f2-a687-5192a09f71c3	Duration: 27627.15 ms	Billed Duration: 27628 ms	Memory Size: 1024 MB	Max Memory Used: 1024 MB	Init Duration: 1330.79 ms	Status: error	Error Type: Runtime.ExitError
XRAY TraceId: 1-685cb8e4-6ec7902913ad62f42e821e12	SegmentId: fe04f33977304521	Sampled: true 

์ด Log Metric ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์ด ๊ตฌ์ถ•๋˜๊ธฐ ์ „์—๋Š” ์ธ์ง€ํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๋Ÿฐํƒ€์ž„ ํฌ๋ž˜์‰ฌ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ญ
API Cache์— null ๊ฐ’์„ ์ €์žฅํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•œ ๋Ÿฐํƒ€์ž„ ํฌ๋ž˜์‰ฌ์ž…๋‹ˆ๋‹ค.

2025-07-17T09:08:32.363Z	49917c08-5711-4d3a-a945-80cb6ad821f7	ERROR	Unhandled Promise Rejection 	{
    "errorType": "Runtime.UnhandledPromiseRejection",
    "errorMessage": "Error: \"null\" is not a cacheable value",
    "reason": {
        "errorType": "Error",
        "errorMessage": "\"null\" is not a cacheable value",
        "stack": [
            "Error: \"null\" is not a cacheable value",
            "    at /var/task/src/arti/lambda.js:369323:25",
            "    at new Promise (<anonymous>)",
            "    at Object.set (/var/task/src/arti/lambda.js:369311:18)",
            "    at Object.set (/var/task/src/arti/lambda.js:281628:43)",
            "    at Object.next (/var/task/src/arti/lambda.js:282191:37)",
            "    at /var/task/src/arti/lambda.js:30379:78",
            "    at OperatorSubscriber2._this._next (/var/task/src/arti/lambda.js:25392:13)",
            "    at OperatorSubscriber2.Subscriber2.next (/var/task/src/arti/lambda.js:24521:16)",
            "    at /var/task/src/arti/lambda.js:26805:24",
            "    at OperatorSubscriber2._this._next (/var/task/src/arti/lambda.js:25392:13)"
        ]
    },
    "promise": {},
    "stack": [
        "Runtime.UnhandledPromiseRejection: Error: \"null\" is not a cacheable value",
        "    at process.<anonymous> (file:///var/runtime/index.mjs:1326:17)",
        "    at process.emit (node:events:524:28)",
        "    at process.emit (/var/task/src/arti/lambda.js:2227:25)",
        "    at emitUnhandledRejection (node:internal/process/promises:250:13)",
        "    at throwUnhandledRejectionsMode (node:internal/process/promises:385:19)",
        "    at processPromiseRejections (node:internal/process/promises:470:17)",
        "    at processTicksAndRejections (node:internal/process/task_queues:96:32)"
    ]
}

REPORT RequestId: 49917c08-5711-4d3a-a945-80cb6ad821f7	Duration: 534.29 ms	Billed Duration: 535 ms	Memory Size: 512 MB	Max Memory Used: 246 MB	Status: error	Error Type: Runtime.ExitError
XRAY TraceId: 1-6878bd8f-19a92cbd3ea1be424772578d	SegmentId: 3bd62ade4f027f28	Sampled: true	

๊ตฌํ˜„

https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtime-environment.html ์—์„œ๋Š” ์ด 4๊ฐ€์ง€์˜ Lambda Failures๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

Example CloudWatch Logs log output (runtime or extension crash) - old style
START RequestId: c3252230-c73d-49f6-8844-968c01d1e2e1 Version: $LATEST
RequestId: c3252230-c73d-49f6-8844-968c01d1e2e1 Error: Runtime exited without providing a reason
Runtime.ExitError
END RequestId: c3252230-c73d-49f6-8844-968c01d1e2e1
REPORT RequestId: c3252230-c73d-49f6-8844-968c01d1e2e1 Duration: 933.59 ms Billed Duration: 934 ms Memory Size: 128 MB Max Memory Used: 9 MB
Example CloudWatch Logs log output (function timeout) - old style
START RequestId: b70435cc-261c-4438-b9b6-efe4c8f04b21 Version: $LATEST
2024-03-04T17:22:38.033Z b70435cc-261c-4438-b9b6-efe4c8f04b21 Task timed out after 3.00 seconds
END RequestId: b70435cc-261c-4438-b9b6-efe4c8f04b21
REPORT RequestId: b70435cc-261c-4438-b9b6-efe4c8f04b21 Duration: 3004.92 ms Billed Duration: 3000 ms Memory Size: 128 MB Max Memory Used: 33 MB Init Duration: 111.23 ms
The new format for CloudWatch logs includes an additional statusfield in the REPORT line. In the case of a runtime or extension crash, the REPORT line also includes a field ErrorType.
Example CloudWatch Logs log output (runtime or extension crash) - new style
START RequestId: 5b866fb1-7154-4af6-8078-6ef6ca4c2ddd Version: $LATEST
END RequestId: 5b866fb1-7154-4af6-8078-6ef6ca4c2ddd
REPORT RequestId: 5b866fb1-7154-4af6-8078-6ef6ca4c2ddd Duration: 133.61 ms Billed Duration: 133 ms Memory Size: 128 MB Max Memory Used: 31 MB Init Duration: 80.00 ms Status: error Error Type: Runtime.ExitError
Example CloudWatch Logs log output (function timeout) - new style
START RequestId: 527cb862-4f5e-49a9-9ae4-a7edc90f0fda Version: $LATEST
END RequestId: 527cb862-4f5e-49a9-9ae4-a7edc90f0fda
REPORT RequestId: 527cb862-4f5e-49a9-9ae4-a7edc90f0fda Duration: 3016.78 ms Billed Duration: 3016 ms Memory Size: 128 MB Max Memory Used: 31 MB Init Duration: 84.00 ms Status: timeout

Log Filter Strings

์œ„ 4๊ฐ€์ง€์˜ Lambda Failures์—์„œ, ์ €ํฌ๋Š” ์•„๋ž˜ ํ‘œ์˜ ๋ฌธ์ž์—ด์„ ๊ธฐ์ค€์œผ๋กœ CloudWatch Logs์—์„œ ํ•„ํ„ฐ๋งํ•˜์—ฌ, ์•Œ๋ฆผ์„ ๋ฐ›๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

styleTimeoutRuntime Crash
oldTask timed out afterError: Runtime exited without providing a reason
newStatus: timeoutStatus: error, Error Type: Runtime.ExitError

์•„ํ‚คํ…์ณ

CloudWatch Metric โ†’ CloudWatch Alarm โ†’ SNS โ†’ Lambda (์Šฌ๋ž™ ์žฅ์•  ์ฑ„๋„๋กœ ์•Œ๋ฆผ)

aws-cloudwatch-logs.png

slack.png

์ €ํฌ๋Š” aws-sdk๋ฅผ ์ด์šฉํ•˜์—ฌ, CloudWatch Logs์— Metric Filter์™€ Metric Alarm์„ ๋“ฑ๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

import { CloudWatchLogsClient, PutMetricFilterCommand } from '@aws-sdk/client-cloudwatch-logs';
import { CloudWatchClient, PutMetricAlarmCommand } from '@aws-sdk/client-cloudwatch';

๊ธฐ์กด์— ๋งŒ๋“ค์–ด์ง„ Lambda๋Š” DescribeLogGroupsCommand ๋ฅผ ํ†ตํ•ด, Metric Filter์™€ Metric Alarm์„ ๋“ฑ๋ก ์‹œ์ผœ์ฃผ๊ณ ,

import { CloudWatchLogsClient, DescribeLogGroupsCommand } from '@aws-sdk/client-cloudwatch-logs';

์ƒˆ๋กœ ๋งŒ๋“ค์–ด์งˆ Lambda๋Š” CreateLogGroup ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด, Metric Filter์™€ Metric Alarm์„ ๋“ฑ๋ก ์‹œ์ผœ์ค๋‹ˆ๋‹ค.

    CreateMetric:
        handler: src/create_metric/lambda.handler
        events:
            - eventBridge:
                  pattern:
                      source:
                          - aws.logs
                      detail-type:
                          - AWS API Call via CloudTrail
                      detail:
                          eventSource:
                              - logs.amazonaws.com
                          eventName:
                              - CreateLogGroup

๋งˆ์น˜๋ฉฐ

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

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

โ† ๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

Art Changes Life

๋…ธ๋จธ์Šค์™€ ํ•จ๊ป˜ ์—”ํ„ฐํ…Œํฌ ์‚ฐ์—…์„ ํ˜์‹ ํ•ด๋‚˜๊ฐˆ ๋ฉค๋ฒ„๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

์ฑ„์šฉ ์ค‘์ธ ๊ณต๊ณ  ๋ณด๊ธฐ