hahn

[Terraform]Mutable, Immutable 본문

클라우드/Terraform

[Terraform]Mutable, Immutable

hahn 2024. 8. 6. 09:45
728x90
반응형

terraform에는 변경 가능한 속성과 불가능한 속성이 있다.

 

 

변경 가능(Mutable) 속성

 

aws_instance 기준

  • instance_type
  • key_name
  • subnet_id
  • tags
  • security_groups
  • user_data
  • associate_public_ip_address

aws_vpc 기준

  • cidr_block
  • enable_dns_support
  • enable_dns_hostnames
  • tags

 

aws_s3_bucket

  • acl
  • tags
  • versioning
  • logging
  • website
  • cors_rule
  • lifecycle_rule
  • replication_configuration

aws_iam_user

  • name
  • path
  • tags
  • permissions_boundary
  • force_destroy

 

provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_security_group" "example" {
  vpc_id = "vpc-XXXXXXXXXXXXXX"
  name   = "example-security-group"

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

resource "aws_instance" "example" {
  ami           = "ami-XXXXXXXXXXXXXXX"
  instance_type = "t2.micro"

  subnet_id                 = "subnet-XXXXXXXXXXXXXX"
  vpc_security_group_ids    = [aws_security_group.example.id]
  associate_public_ip_address = true

}

 

 

 

위 코드를 apply하면

 

 

name이 없는 인스턴스가 생성된다

 

provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_security_group" "example" {
  vpc_id = "vpc-XXXXXXXXXXXXXX"
  name   = "example-security-group"

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

resource "aws_instance" "example" {
  ami           = "ami-XXXXXXXXXXXXXXX"
  instance_type = "t2.nano"

  subnet_id                 = "subnet-XXXXXXXXXXXXXX"
  vpc_security_group_ids    = [aws_security_group.example.id]
  associate_public_ip_address = true

  tags = {
    Name = "terraform-ec2"
  }
}

 

네임 태그를 추가하고, 인스턴스 타입을 t2.nano로 변경해봤다.

 

plan을 확인해보면

 

 

와 같이 변경될 사항이 표시된다.

 

apply 한다.

 

 

위와 같이 변경한 사항이 적용된걸 볼 수 있다.

 

변경 불가능(Immutable) 속성

resource "aws_instance" "example" {
  ami           = "ami-XXXXXXXXXXXXXXX"  # 불변 속성
  instance_type = "t2.nano"
  availability_zone = "us-west-2a"       # 불변 속성

  subnet_id                 = "subnet-XXXXXXXXXXXXXX"
  vpc_security_group_ids    = [aws_security_group.example.id]
  associate_public_ip_address = true

  tags = {
    Name = "terraform-ec2"
  }
}

resource "aws_vpc" "example" {
  cidr_block = "10.0.0.0/16"  # 불변 속성
  tags = {
    Name = "example-vpc"
  }
}

resource "aws_s3_bucket" "example" {
  bucket = "my-example-bucket"  # 불변 속성
  acl    = "private"
}

 

 

aws_instance

 

  • ami
  • availability_zone

aws_vpc

 

  • cidr_block

 

aws_s3_bucket

  • bucket

 

만약 아래와 같이 ami과 같은 불변 속성을 변경하려고 한다면

 

provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_security_group" "example" {
  vpc_id = "vpc-XXXXXXXXXXXXXX"
  name   = "example-security-group"

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

resource "aws_instance" "example" {
  ami           = "ami-056a29f2eddc40520"
  instance_type = "t2.micro"

  subnet_id                 = "subnet-XXXXXXXXXXXXXX"
  vpc_security_group_ids    = [aws_security_group.example.id]
  associate_public_ip_address = true

  tags = {
    Name = "terraform-ec2"
  }
}

 

 

 

기존 인스턴스는 삭제되고 새로운 인스턴스로 대체된다고 말해준다.

 

 

 

이와 같이 기존에 있던 인스턴스는 종료되고, 새로운 인스턴스가 생성된 것을 확인할 수 있다.

728x90
반응형

'클라우드 > Terraform' 카테고리의 다른 글

[Terraform]VPC, Subnet, IGW, EC2 생성  (0) 2024.08.06
[Terraform]state  (0) 2024.08.06
[Terraform] 변수 사용하기  (0) 2024.08.06
[Terraform] VPC 생성  (0) 2024.08.06
[Terraform] AWS provider 생성  (0) 2024.08.06