๐Ÿ’ญ Minji's Archive

[2SeC] Terraform? OpenSearch?

December 04, 2025

Terraform

  • IaC ๋„๊ตฌ๋กœ, ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ธํ”„๋ผ๋ฅผ ์ •์˜ํ•˜๊ณ  ํ”„๋กœ๋น„์ €๋‹ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

1. ์ฃผ์š” ๊ฐœ๋…

  • Provider: Terraform์ด ํด๋ผ์šฐ๋“œ(AWS, Azure ๋“ฑ) ๋˜๋Š” ์„œ๋น„์Šค API์™€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ. ์˜ˆ๋ฅผ ๋“ค์–ด AWS ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด aws Provider๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•จ.
  • Resource: ์‹ค์ œ๋กœ ์ƒ์„ฑํ•  ์ธํ”„๋ผ ์ง€์› (์˜ˆ: aws_instance, aws_vpc, opensearch_domain ๋“ฑ)
  • State: Terraform์ด ๊ด€๋ฆฌํ•˜๋Š” ์‹ค์ œ ์ธํ”„๋ผ์˜ ์ตœ์‹  ์ƒํƒœ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ํŒŒ์ผ (๊ธฐ๋ณธ์ ์œผ๋กœ terraform.tfstate)
  • Remote State: ํ˜‘์—…๊ณผ ์•ˆ์ •์ ์ธ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด S3์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์Šคํ† ๋ฆฌ์ง€์— ์ƒํƒœ ํŒŒ์ผ์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹(Backend ์„ค์ •)์„ ์‚ฌ์šฉํ•จ. Terraform์ด ์ธํ”„๋ผ๋ฅผ ์ƒ์„ฑ/๋ณ€๊ฒฝํ•  ๋•Œ ์ด ์ƒํƒœ ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์—ฌ ํ˜„์žฌ ์ฝ”๋“œ์™€ ์‹ค์ œ ์ธํ”„๋ผ์˜ ์ฐจ์ด์  ํŒŒ์•…ํ•จ.
  • Module: ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์žฌ์‚ฌ์šฉํ•  ์ธํ”„๋ผ ์ฝ”๋“œ๋ฅผ ํ•œ ๊ณณ์— ๋ชจ์•„์„œ ์ •์˜ํ•œ ๋‹จ์œ„. ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ํ‘œ์ค€ํ™”ํ•˜๋Š”๋ฐ ์œ ์šฉํ•จ.
  • HCL (HashiCorp Configuration Language): Terraform ๊ตฌ์„ฑ์„ ์ž‘์„ฑํ•˜๋Š” ์„ ์–ธ์  ์–ธ์–ด

2. ํ•ต์‹ฌ ๋ช…๋ น์–ด

Terraform์˜ ์ž‘์—… ํ๋ฆ„์€ ์ผ๋ฐ˜์ ์œผ๋กœ init -> plan -> apply ์ˆœ์„œ์ด๋‹ค.

(1) terraform init: ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ์ดˆ๊ธฐํ™” - ํ•„์š”ํ•œ Provider๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  Backend ์„ค์ • ์ค€๋น„ (2) terraform plan: ์‹คํ–‰ ๊ณ„ํš ํ™•์ธ - ์ž‘์„ฑํ•œ ์ฝ”๋“œ์™€ ํ˜„์žฌ State๋ฅผ ๋น„๊ตํ•˜์—ฌ ์–ด๋–ค ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ƒ๊ธธ์ง€ ๋ฏธ๋ฆฌ ์˜ˆ์ธก ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์คŒ. ์‹ค์ œ ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ์€ ์ผ์–ด๋‚˜์ง€ ์•Š์Œ. (3) terraform apply: ์ธํ”„๋ผ ์ ์šฉ - Plan์—์„œ ์ƒ์„ฑ๋œ ์‹คํ–‰ ๊ณ„ํš์— ๋”ฐ๋ผ ์‹ค์ œ ์ธํ”„๋ผ๋ฅผ ์ƒ์„ฑ/๋ณ€๊ฒฝํ•จ (4) terraform destroy: ์ธํ”„๋ผ ์‚ญ์ œ - Terraform์ด ๊ด€๋ฆฌํ•˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•จ (5) terraform validate: ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ - ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ๊ตฌ๋ฌธ์ด ์œ ํšจํ•œ์ง€ ๊ฒ€์‚ฌ.


OpenSearch

1. ์ฃผ์š” ๊ฐœ๋…

  • Cluster: OpenSearch ์ธ์Šคํ„ด์Šค๋“ค์˜ ์ง‘ํ•ฉ
  • Node: ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ๊ฒ€์ƒ‰, ์ธ๋ฑ์‹ฑ, ๋ฐ์ดํ„ฐ ์ €์žฅ์„ ๋‹ด๋‹นํ•˜๋Š” ์„œ๋ฒ„

    • Master Node: ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ(๋…ธ๋“œ ์ถ”๊ฐ€/์ œ๊ฑฐ, ์ธ๋ฑ์Šค ์ƒ์„ฑ/์‚ญ์ œ ๋“ฑ) ๋‹ด๋‹น
    • Data Node: ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ ๋ฐ ์ง‘๊ณ„ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•จ
  • Index: ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ, ๊ด€๋ จ๋œ ๋ฌธ์„œ๋“ค์„ ๋ชจ์•„๋‘” ๋…ผ๋ฆฌ์ ์ธ ์ปจํ…Œ์ด๋„ˆ. ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌํ•˜๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„.
  • Document: ์ธ๋ฑ์Šค์— ์ €์žฅ๋˜๋Š” ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ๋‹จ์œ„๋กœ JSON ํ˜•์‹์œผ๋กœ ์ €์žฅ๋จ
  • Shard: ์ธ๋ฑ์Šค๋ฅผ ์ˆ˜ํ‰ ๋ถ„ํ• ํ•œ ๋‹จ์œ„

    • Primary Shard: ๋ฌธ์„œ๊ฐ€ ์ €์žฅ๋˜๋Š” ์›๋ณธ ์ƒค๋“œ
    • Replica Shard: ํ”„๋ผ์ด๋จธ๋ฆฌ ์ƒค๋“œ์˜ ๋ณต์ œ๋ณธ์œผ๋กœ, ๊ฒ€์ƒ‰ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋Š˜๋ฆฌ๊ณ  ์žฅ์•  ๋ฐœ์ƒ ์‹œ ๋ฐ์ดํ„ฐ ์†์‹ค์„ ๋ฐฉ์ง€ํ•จ
  • OpenSearch Dashboards: OpenSearch์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๊ณ  ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ์›น ์ธํ„ฐํŽ˜์ด์Šค (Kibana)

2. ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ๊ธฐ๋Šฅ

  • ํ’€ ํ…์ŠคํŠธ ๊ฒ€์ƒ‰
  • ์—ญ ์ธ๋ฑ์Šค: ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋ฌธ์„œ์— ํฌํ•จ๋œ ๋ชจ๋“  ๋‹จ์–ด๋ฅผ ์ธ๋ฑ์‹ฑํ•˜๋Š” ๊ตฌ์กฐ
  • ์ง‘๊ณ„ (Aggregation): ๋ฐ์ดํ„ฐ์—์„œ ํ†ต๊ณ„ ๋ฐ ๋ฉ”ํŠธ๋ฆญ์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ธฐ๋Šฅ
  • ๋ฒกํ„ฐ ๊ฒ€์ƒ‰ (Vector Search/KNN): ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜ํ•ด ์˜๋ฏธ๋ก ์  ์œ ์‚ฌ์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ธฐ๋Šฅ (RAG์— ์‚ฌ์šฉ๋จ)

3. ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋ฐ ์šด์˜

  • ISM (Index State Management): ์ธ๋ฑ์Šค์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ(Hot/Warm/Cold ์Šคํ† ๋ฆฌ์ง€๋กœ ์ด๋™, ์‚ญ์ œ ๋“ฑ)๋ฅผ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ
  • Hot/UltraWarm/Cold Storage: ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๋นˆ๋„์— ๋”ฐ๋ผ ๋…ธ๋“œ ์œ ํ˜•์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋น„์šฉ ํšจ์œจ์„ฑ์„ ๋†’์ž„. (์ž์ฃผ ์‚ฌ์šฉ - Hot, ๊ฐ€๋” ์‚ฌ์šฉ - UltraWarm)
  • ๋ณด์•ˆ: OpenSearch๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ์ฆ, ๊ถŒํ•œ ๊ด€๋ฆฌ, ์ „์†ก ๊ณ„์ธต ๋ณด์•ˆ (TLS) ๋“ฑ์„ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ œ๊ณตํ•จ.

Terraform์„ ํ™œ์šฉํ•œ ์ธํ”„๋ผ ๊ตฌ์ถ• ๋‹จ๊ณ„๋ณ„ ์ •๋ฆฌ

์šฐ๋ฆฌ ํŒ€์˜ ์ธํ”„๋ผ ๊ตฌ์„ฑ๋„

1. ๋„คํŠธ์›Œํฌ ๋ฐ ๊ธฐ๋ฐ˜ ํ™˜๊ฒฝ ๊ตฌ์ถ• (VPC)

  • ๋„คํŠธ์›Œํฌ (VPC, Subnet) ์ƒ์„ฑ
  • ๋ณด์•ˆ๊ทธ๋ฃน ์ƒ์„ฑ: ๋ฐฉํ™”๋ฒฝ ์—ญํ• 
  • EC2 ์ƒ์„ฑ: Public/Private Subnet ๋ฐ ๋ณด์•ˆ ๊ทธ๋ฃน ์—ฐ๊ฒฐ

2. ๋กœ๊ทธ ์ˆ˜์ง‘ ๋ฐ ์ „์†ก ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•

  • Kinesis Stream ์ƒ์„ฑ: ๋ฐ์ดํ„ฐ์˜ ๋ฒ„ํผ๋ง ๋ฐ ๋‚ด๊ตฌ์„ฑ์„ ๋‹ด๋‹นํ•˜๋Š” ํ•ต์‹ฌ ์ŠคํŠธ๋ฆผ
  • ๊ถŒํ•œ ์„ค์ •(IAM): CloudWatch Logs๊ฐ€ Kinesis Stream์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋„๋ก, ๊ทธ๋ฆฌ๊ณ  ECS Fargate๊ฐ€ Kinesis์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ๊ถŒํ•œ ์ •์˜
  • CloudWatch Logs: EC2์—์„œ CloudWatch Agent๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ๊ฐ€ ์ˆ˜์ง‘๋˜๋Š” ์ €์žฅ์†Œ
  • Logs Subscription: CloudWatch Logs ๊ทธ๋ฃน๊ณผ Kinesis Data Stream์„ ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• 

3. ๋กœ๊ทธ ์ฒ˜๋ฆฌ ๋ฐ ๋ณ€ํ™˜

Kinesis์—์„œ ๋กœ๊ทธ๋ฅผ ์ฝ์–ด์™€ ๊ตฌ์กฐํ™”ํ•˜๊ณ (grok), ์œ„์น˜ ์ •๋ณด(geoip)๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋“ฑ์˜ ๊ฐ€๊ณต ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  OpenSearch๋กœ ์ „์†ก

  • Logstash ํ™˜๊ฒฝ (ECS Cluster): ์ปจํ…Œ์ด๋„ˆ(Logstash)๊ฐ€ ์‹คํ–‰๋  ํ™˜๊ฒฝ
  • Logstash ์ •์˜ (ECS Task Definition): Logstash ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€, CPU/๋ฉ”๋ชจ๋ฆฌ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜, Kinesis์—์„œ ์ฝ๊ณ  OpenSearch์— ์“ฐ๋Š” ๊ถŒํ•œ ๊ฐ€์ง„ IAM ์—ญํ•  ํ•„์š”
  • Logstash ์‹คํ–‰ (ECS Service): ์ •์˜๋œ Logstash TAsk๋ฅผ Fargate ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•˜๊ณ  ๊ด€๋ฆฌ. Logstash์˜ Input/Filter/Output ์„ค์ •์€ ๋ณดํ†ต ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— ํฌํ•จํ•˜๊ฑฐ๋‚˜ Task Definition์„ ํ†ตํ•ด ์ „๋‹ฌ

4. ๊ฒ€์ƒ‰ ์—”์ง„ ๋ฐ ์žฅ๊ธฐ ๋ณด๊ด€

  • OpenSearch Domain(OpenSearch Service): ๊ฒ€์ƒ‰ ์—”์ง„ ํด๋Ÿฌ์Šคํ„ฐ ์ž์ฒด. VPC, Subnet, ๋ณด์•ˆ ๊ทธ๋ฃน ์„ค์ • ๋ฐ ๋…ธ๋“œ ์œ ํ˜•(Hot/Ultra Warm/Cold)๋ฅผ ์ •์˜
  • OpenSearch Index(OpenSearch API): ์ธ๋ฑ์Šค ํ…œํ”Œ๋ฆฟ ๋“ฑ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ. OpenSearch ๋„๋ฉ”์ธ์ด ์ค€๋น„๋˜๋ฉด Logstash๊ฐ€ ์ž๋™์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Œ
  • ์ธ๋ฑ์Šค ๊ด€๋ฆฌ: ISM ์ •์˜
  • ์Šค๋ƒ…์ƒท S3: ์žฅ๊ธฐ ๋ณด๊ด€ ์œ„ํ•œ ๋ฐฑ์—… ์ €์žฅ์†Œ
  • ์Šค๋ƒ…์ƒท ์ •์ฑ… (OpenSearch API): OpenSearch๊ฐ€ S3 ๋ฒ„ํ‚ท์— ์Šค๋ƒ…์ƒท ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ถŒํ•œ ๋ถ€์—ฌ + ์ •์ฑ… ์„ค์ •