[AWS] DynamoDB: Streams
Dynamo Streams๋ DynamoDB๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๊ณต๋๋ CDC ๊ธฐ๋ฐ ์คํธ๋ฆผ ์๋น์ค๋ค.
๋ฐ์ดํฐ๋ฅผ ๋ฐ์ด๋ฃ๊ณ consumeํ๋ Kinesis๋ Kafka ๊ฐ์ ์ญํ ์ ๊ธฐ๋ํ ์ ์๋ค. ํนํ Lambda์ ํตํฉํด์ ์ฌ์ฉํ๊ธฐ ์ฉ์ดํ๋ค.
๋ฐ์ดํฐ๊ฐ ์ค๋ณต์์ด ๋จ ํ๋ฒ๋ง ์ ์ก๋๋ ๊ฒ์ ๋ณด์ฅํ๊ณ , ์ค์ ์ฝ์
๋ ์์์ ๋ฐ๋ผ FIFO ํํ๋ก ๋์ํ๋ค.
Kafka์ ๊ฐ๋ณ๊ณ ์ ๋ ดํ ๋์ฒด์ฌ๋ก ์ฐ๊ธฐ์ ๊ด์ฐฎ๋ค.
๋น์ฉ
https://aws.amazon.com/ko/dynamodb/pricing/on-demand/
๋น์ฉ ๋จ์๋ DynamoDB์ ๊ฑฐ์ ๋์ผํ๊ณ , ์ถ๊ฐ ์๊ธ์ด ๋ฐ๋ก ๋ฐ์ํ์ง ์๋๋ค.
๊ทธ๋ฅ ๊ธฐ์กด ์ฝ๊ธฐ ์๊ธ๊ณผ ๋์ผํ๊ฒ ๋ธ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
ํ๋ฒ ์ง์ ์ฌ์ฉํด๋ณด์
Dynamo Stream ํ์ฑํ
๋จผ์ DynamoDB ํ ์ด๋ธ์ด ์์ด์ผ ํ๋ค.
์ ์ ํ ๋ ์๋๊ฐ๊ฒ ์จ๋๋งจ๋๋ก๋ง ๋ง๋ค์ด์ค๋ค.
"๋ด๋ณด๋ด๊ธฐ ๋ฐ ์คํธ๋ฆผ" ํญ์ ๋ณด๋ฉด
์คํธ๋ฆผ์ ํ์ฑํํ๋ ๋ถ๋ถ์ด ์๋ค. ์ด๊ฑธ ์ผ ๋ค.
์คํธ๋ฆผ ํธ๋ฆฌ๊ฑฐ์์ ์ด๋ค ๊ฐ์ ๋ฐ์์ง ์ ํ๋ค.
์ผ๋จ ํค๋ง ๋ฐ๋๋ก ํ๋ค.
๊ทธ๋ผ ์คํธ๋ฆผ ARN์ด ๋ง๋ค์ด์ง๋๋ฐ, ์ ๊ฑธ aws sdk๋ฅผ ํตํด ๋ฐ๋ก ์ฌ์ฉํ ์๋ ์๋ค.
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDBStreams.html
ํ์ง๋ง ์ฌ๊ธฐ์๋ Lambda ๊ธฐ๋ฐ์ผ๋ก ์ ๊ณต๋๋ ์๋ํ๋ ํตํฉ๋ง ์ฌ์ฉํด๋ณด๊ฒ ๋ค.
Lambda๋ก ํธ๋ฆฌ๊ฑฐ ๋ฑ๋ก
๋จผ์ ํธ๋ฆฌ๊ฑฐ์ ์ฌ์ฉํ Lambda ํจ์๋ฅผ ํ๋ ๋ง๋ค์ด์ค๋ค.
์ด๊ฒ ๋ฉ์์ง๋ฅผ ์ ์ก๋ฐ์์ ์ฒ๋ฆฌํ๋ ์ญํ ์ ๋งก๊ฒ ๋ ๊ฒ์ด๋ค.
์ผ๋จ์ ๋ก๊ทธ๋ง ์ฐ์๋ค.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Action": [
"dynamodb:GetRecords",
"dynamodb:GetShardIterator",
"dynamodb:DescribeStream",
"dynamodb:ListStreams"
],
"Resource": "*"
}
]
}
Lambda ๊ถํ์ ์ด์ ๋ ์ฃผ๋ฉด ๋๋ค.
์ด์ ์ ๊ฑธ ํธ๋ฆฌ๊ฑฐ๋ก ๊ฑธ๋ฉด ๋๋ค. Dynamo Stream ํ๋จ์ผ๋ก ์ด๋ํด์

ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ง๋ค์ด์ค๋ค.
๋ฐฐ์น ํฌ๊ธฐ๋ ํ๋ฒ์ ์ต๋ ๋ช๊ฐ์ฉ์ ๋ฐ์์ง๋ฅผ ์ ํ๋ ์ต์
์ด๋ค.
๊ทธ๋ผ ์ด๋ ๊ฒ ์ฐ๋๋ ๊ฒ์ด๊ณ
Dynamo ํ
์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์ฝ์
, ์์ , ์ญ์ ๋ ๋๋ง๋ค ๋ฐ์ํด์ ๋ฉ์ธ์ง๋ฅผ ์ ์กํ๊ฒ ๋๋ค.
๋์ถฉ ํ๋ ๋ฃ์ด๋ดค๋ค.
๊ทธ๋ผ ์ํํ์ธ๋ ํด์ฃผ๋๋ฐ
์์ ๋ณด๋ฉด ์ฝ์
์ ๋ณด์ ๋ํ ์ด๋ฒคํธ๊ฐ ์ฐํ์์์ ๋ณผ ์ ์๋ค.
ํค๋ง ๋ฐ๋ ๊ฒ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ํค๊ฐ๋ง ๋์ด์๋ค. ์ ๊ฑฐ ์กฐํํด์ ์ ์ฒ๋ฆฌํ๋ฉด ๋๋ค.
์คํธ๋ฆผ ํ์ ์ ๋ค๋ฅธ๊ฑธ๋ก ์์ฑํ๋ค๋ฉด


์ด๋ฐ ๋๋์ผ๋ก ์จ๋ค. ์ด๊ฑด ์ด์ ์ํ์ ํ์ฌ ์ํ๊ฐ ๋ค ๋์์ ์ถ๊ฐ ์กฐํ ์์ด๋ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
์ฌ์๋
Dynamo Stream์ ์คํํ Lambda๊ฐ ์คํจํ๋ฉด ์คํจ ์ํ๋ก ๊ฐ์ฃผํ๊ณ ์ฑ๊ณตํ ๋๊น์ง ์ฌ์๋๋ฅผ ํ๋ค.
์คํ ๋ก๊ทธ ๋ณด๋๊น ์ฒ์์๋ ์ด๋จ์๋ก ๋น ๋ฅด๊ฒ ์ฌ์๋๋ฅผ ํ๋ค๊ฐ ๋ช๋ฒ ์ด์ ์คํจํ๋ฉด ๊ธด ๊ฐ๊ฒฉ์ผ๋ก ์ฌ์๋๋ฅผ ํ๋๋ผ
ํธ๋ฆฌ๊ฑฐ ์ค์ ๋ณ๊ฒฝ
Lambda์ ํธ๋ฆฌ๊ฑฐ ํญ์ผ๋ก ์ด๋ํ๋ฉด Dynamo<>Lambda ๊ฐ ์ํธ์์ฉ ์ค์ ์ ํ์ธํ๊ฑฐ๋ ์ ์ดํ ์ ์๋ค.

๋ฐฐ์น ์ต์
์ ๋ณ๊ฒฝํ๊ฑฐ๋
์ฌ์๋ ๊ฐ์ ๋ช๊ฐ์ง ์ต์
์ ์กฐ์ ํ ์๋ ์๋ค.
์ด๊ฒ ์์ ํ๋ก์ธ์ค๊ฐ ์คํจํ๋ฉด ๊ทธ๊ฒ ์ฑ๊ณตํ ๋๊น์ง ๊ณ์ retry๋ฅผ ํ๋ฉด์ ์ดํ ์ฒ๋ฆฌ๋ฅผ ๋ธ๋ฝํ๊ธฐ ๋๋ฌธ์, ์ฌ์๋๋ฅผ usecase์ ๋ฐ๋ผ ์กฐ์ ํ๋๊ฒ ์ค์ํ๋ค.
Retry attempts๋ ์ต๋ ์ฌ์๋ ํ์๋ค. ๊ธฐ๋ณธ๊ฐ -1๋ ๊ณ์ ์๋ํ๋๊ฑฐ๋ค.
On-failure destination๋ ์ฌ์๋๊ฐ ๋๋๊ณ ์ต์ข
์ ์ผ๋ก ์คํจํ์๋ ๋ฉ์ธ์ง๋ฅผ ์ด๋๋ก ๋ณด๋ผ์ง๋ฅผ ์ง์ ํ๋ค. ๋ณดํต SNS๋ SQS๋ก ๋ณด๋ผ ์ ์๋ค.
Split batch on error๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๋ฐฐ์น๋ฅผ ๋ ์๊ฒ ๋๋ ์ ์ฌ์๋ํ๋ ์ต์
์ด๋ค.
๋ฐฐ์น ๋จ์๊ฐ ๋๋ฌด ๋ง์์ ์ฑ๋ฅ์ ๋ฌธ์ ๋ก ์ค๋ฅ๊ฐ ์๊ธธ๋ ๊ฝค ํจ๊ณผ์ ์ผ๋ก ๋์ํ ์ ์๋ ๊ธฐ๋ฅ์ด๋ค.
Concurrent batches per shard๋ ํ ์ค๋์์ ๋์์ ๋ช๊ฐ์ ๋ฐฐ์น๋ฅผ ๋๋ฆด์ง๋ฅผ ๊ฒฐ์ ํ๋ค. ๋ํดํธ๋ 1์ด๋ฏ๋ก ํ๋ฒ์ ํ๋์ ๋ฐฐ์น๋ง ๋๋ฆฐ๋ค.
๋์์ ์คํ๋์ด๋ ๋๊ณ ์์๊ฐ ๊ผฌ์ฌ๋ ๋๋ค๋ฉด ์ ๊ฑธ ๋์ด๋๊ฒ ์ฑ๋ฅ์ ์ ๋ฆฌํ ๊ฒ์ด๋ค.
์ฐธ์กฐ
https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/Streams.html
https://stackoverflow.com/questions/38571922/difference-between-kinesis-stream-and-dynamodb-streams
https://stackoverflow.com/questions/48676604/dynamodb-stream-in-ordering-processing
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html
https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html