[AWS] ๐ŸŒฅ๏ธ Terraform์œผ๋กœ AWS EC2 ์ธ์Šคํ„ด์Šค ์ƒ์„ฑํ•˜๊ธฐ โ˜๏ธ

๋น„์ „ยท2025๋…„ 4์›” 18์ผ
0

AWS ์‹ค์Šต

๋ชฉ๋ก ๋ณด๊ธฐ
54/54

๐Ÿ”‘ AWS ์ž๊ฒฉ ์ฆ๋ช… ์„ค์ •

์ด์ „ ํฌ์ŠคํŒ…์—์„œ Terraform์„ local์— ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด AWS์™€ ์—ฐ๋™์„ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด ์ž๊ฒฉ ์ฆ๋ช…์€ AWS ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์•ก์„ธ์Šค ํ‚ค์™€ ๋น„๋ฐ€ ํ‚ค๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

AWS CLI๋กœ ์ž๊ฒฉ ์ฆ๋ช… ์„ค์ •ํ•˜๊ธฐ

๋จผ์ € AWS CLI๋ฅผ ์„ค์น˜ํ•˜๊ณ , ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์ž๊ฒฉ ์ฆ๋ช…์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

aws configure

์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด AWS Access Key ID, Secret Access Key, ๊ธฐ๋ณธ ๋ฆฌ์ „ ๋“ฑ์„ ์ž…๋ ฅํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๋œน๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

### ์˜ˆ์‹œ ###
AWS Access Key ID [None]: YOUR_AWS_ACCESS_KEY
AWS Secret Access Key [None]: YOUR_AWS_SECRET_KEY
Default region name [None]: us-west-2  # ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋ฆฌ์ „ ์„ ํƒ
Default output format [None]: json

์—ฌ๊ธฐ์„œ KEY๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. AWS ์ฝ˜์†” -> ๋ณด์•ˆ ์ž๊ฒฉ์ฆ๋ช…(์šฐ์ธก ์ƒ๋‹จ ํ”„๋กœํ•„) -> Access Keys ์„น์…˜ -> "Create access key" ๋ฒ„ํŠผ ํด๋ฆญ -> AWS CLI ์—ฐ๋™์šฉ

  • ํ‚ค๋ฅผ ์ฒ˜์Œ ์ƒ์„ฑํ•  ๋•Œ๋งŒ Secret Access Key๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
  • ๋ฐ˜๋“œ์‹œ ๋ฉ”๋ชจํ•˜๊ฑฐ๋‚˜ .csv๋กœ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์œผ์„ธ์š”
  • ๋ฃจํŠธ ์‚ฌ์šฉ์ž ๋ณด๋‹ค๋Š” ๊ถŒํ•œ์ด ์ œํ•œ์ ์ธ IAM์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค(๋น„์šฉ ํญํƒ„ ๋ฐฉ์ง€)

๐Ÿ“ Terraform ์„ค์ • ํŒŒ์ผ ์ž‘์„ฑ

EC2์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ Terraform ์„ค์ • ํŒŒ์ผ์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ €๋Š” main.tf๋ผ๋Š” ์ด๋ฆ„์˜ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ์ด ํŒŒ์ผ์— AWS EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐฐํฌํ•˜๋Š” ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

main.tf ํŒŒ์ผ ์ž‘์„ฑํ•˜๊ธฐ

๋‹ค์Œ์€ main.tf ํŒŒ์ผ์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์—์„œ๋Š” AWS ์ œ๊ณต์ž ์„ค์ •๊ณผ ํ•จ๊ป˜ EC2 ์ธ์Šคํ„ด์Šค ์ƒ์„ฑํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

# Terraform์˜ AWS ์ œ๊ณต์ž ์„ค์ •
provider "aws" {
	region = "us-west-2" #์›ํ•˜๋Š” ๋ฆฌ์ „์œผ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
}

# EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ์œ„ํ•œ ๋ฆฌ์†Œ์Šค ์„ค์ •
resource "aws_instance" "example" {
	ami		= "ami-0892d3c7ee96c0bf7" # ์‚ฌ์šฉํ•  AMI ID๋ฅผ ์„ ํƒํ•˜์„ธ์š” 
    instance_type = "t2.micro" # EC2 ์ธ์Šคํ„ด์Šค ์œ ํ˜•
    
    tags = {
    	Name = "myEC2Instance"
    }
    
    # EC2์˜ ๋ณด์•ˆ ๊ทธ๋ฃน ์„ค์ • (๊ธฐ๋ณธ์ ์ธ SSH ํฌํŠธ 22 ์—ด๊ธฐ)
    security_groups = ["default"]
    
    # ํ‚ค ํŽ˜์–ด ์„ค์ • (EC2์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ SSH ํ‚ค ํ•„์š”)
    key_name = [์ž์‹ ์˜ ํ‚ค ํŽ˜์–ด ์ด๋ฆ„]
}

๐Ÿš€ Terraform ๋ช…๋ น์–ด ์‹คํ–‰

์ด์ œ EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด Terraform์„ ์‹คํ–‰ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์•„๋ž˜ ๋‹จ๊ณ„์— ๋”ฐ๋ผ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด ๋ด…์‹œ๋‹ค.

1. Terraform ์ดˆ๊ธฐํ™”

๋จผ์ € Terraform ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

terraform init

2. ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ๊ณ„ํš ํ™•์ธ

terraform plan ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ณ„ํš์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ช…๋ น์–ด๋Š” ์‹ค์ œ๋กœ ์–ด๋–ค ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

terraform plan

3. EC2 ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ๊ณ„ํš์ด ๊ดœ์ฐฎ๋‹ค๋ฉด, ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ์‹ค์ œ๋กœ EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์–ด ์‹คํ–‰ํ›„ "yes" ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

terraform apply

์„ฑ๊ณต !

4. ์ธํ”„๋ผ ์‚ญ์ œํ•˜๊ธฐ

terraform destroy

๋งˆ๋ฌด๋ฆฌ

์ฒ˜์Œ์—๋Š” "์ฝ”๋“œ ํ•œ ์ค„๋งŒ ์ž…๋ ฅํ•˜๋ฉด EC2๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค"๋Š” ๋ง์„ ๋“ค์—ˆ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ํฌ๊ณ  ์ž‘์€ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๋“ค์ด ์ž์ฃผ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ์‹ค์Šต ์šฉ๋„๋กœ๋Š” ์ˆ˜๋™์œผ๋กœ EC2๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฅผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜, ์ธํ”„๋ผ๋ฅผ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด Terraform์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์ฒด๊ณ„์ ์ด๊ณ  ํ™•์žฅ์„ฑ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.

์ „์ฒด ํ๋ฆ„

  • Terraform ์„ค์น˜
  • AWS CLI์™€ ์—ฐ๋™ (์ธ์ฆ ์ •๋ณด ์„ค์ •)
  • main.tf ์ž‘์„ฑ (HCL ์–ธ์–ด๋กœ EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ์ •์˜)
  • terraform init โ†’ plan โ†’ apply โ†’ destroy๋กœ ์ธํ”„๋ผ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ œ๊ฑฐ
profile
์•„๋Š” ๋งŒํผ ๋ณด์ธ๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€