메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

한빛랩스 - 지식에 가능성을 머지하다 / 강의 콘텐츠 무료로 수강하시고 피드백을 남겨주세요. ▶︎

IT/모바일

[테라폼으로 시작하는 IaC] 기존 리소스를 테라폼으로 관리

한빛미디어

|

2024-11-18

|

by 김민수 , 김재준 , 이규석 , 이유

334

이미 구성되어 있는 리소스를 테라폼으로 관리하게 되는 상황의 예는 다음과 같다.

 

  • 테라폼을 사용하기 전 이미 수동으로 프로비저닝
  • 테라폼 사용이 익숙하지 않은 상황에서 먼저 수동으로 프로비저닝하고 다시 코드화
  • IaC와 수동 운영을 복합적으로 사용하는 경우 테라폼을 이용한 관리 영역을 확장
  • 테라폼으로 관리되고 있었지만 terraform.tfstate가 유실됨
  • 테라폼으로 관리되고 있지 않던 리소스들의 경우 IaC로 전환했을 때 다음과 같은 이점이 생긴다.
  • 구성된 리소스의 명세화
  • 수동 프로비저닝에서는 확인되지 않은 설정 값 파악
  • 리소스 간 종속성 확인

 

테라폼으로의 전환을 고려할 때 모든 것을 코드화하기보다는 코드적인 효율이 있는 대상에 먼저 일부 적용해보는 쪽이 “모든 것을 IaC로 관리해야 해!”라는 부담을 줄일 수 있다.

 

 

1. Import

 

테라폼으로 프로비저닝한 경우 테라폼 구성(예: main.tf )을 먼저 작성하고 Apply 단계를 거쳐 State(terraform.tfstate )가 생성되었지만, 수동으로 프로비저닝이 완료된 경우 이 두 구성이 모두 없는 상태라고 판단한다. 테라폼으로 기존 현실 세계의 리소스를 가져오는 것을 Import 동작으로 설명하며, 그 절차는 다음과 같다.

 

1. 기존 인프라의 정보 확인(프로바이더 문서 참고)

2. 테라폼 Import 동작을 사용해 State로 상태를 가져옴(구성에 리소스 주소에 해당하는 블록 선언 필요)

3. 상태 정보를 기반으로 테라폼 구성을 작성(Show 명령 활용)

4. Plan 동작으로 구성-상태-형상이 일치함을 확인

5. Apply 동작으로 상태를 업데이트하고 테라폼으로 관리 시작

 

 

제시된 실습을 위해서 AWS 계정이 필요하다. 관리되는 리소스 추가를 위해 AWS 보안 그룹을  AWS 콘솔을 이용하여 다음과 같이 수동으로 자원을 생성한다. 보안 그룹은 VPC 또는 EC2 대

시보드에서 보안 메뉴로 그룹핑되어 있다.

 

✔️ 보안 그룹 GUI 이동

■ 리전: 서울(ap-northeast-2)

■ 서비스: VPC(검색 후 대시보드 이동 또는 메뉴에서 선택)

■ 보안 > 보안 그룹

 

✔️ 보안 그룹 생성

■ 보안 그룹 이름: import-sg

■ 설명: terraform import check

■ VPC: 이미 구성되어 있는, 또는 기본 VPC 선택

■ 인바운드 규칙

■ 아웃바운드 규칙: 기본값

■ 태그 선택 사항

◆ 키: purpose

◆ 값: terraform-import

보안 그룹 생성 정보 확인 

 

✅ 1단계. 기존 인프라의 정보 확인 

 

기존 인프라에서 테라폼 코드화 대상을 선정한다. 실습 대상은 변경이 잦은 보안 그룹을 코드로 관리해 효율성을 얻고자 한다. 각 리소스별로 Import 수행 시 필요한 고유 ID 값이 다를 수 

있으므로 프로바이더의 리소스 문서1를 확인하고 Import를 위한 정보를 확인한다.

 

리소스 구성 문서 가이드의 Import 설명 

 

✅ 2단계. Import 수행 

 

테라폼 구성을 가져오기 위한 초기화된 구성이 필요하다. 앞서 terraform과 provider 블록에서와 같이 신규로 추가되는 리소스를 위해서도 구성 정의가 필요하다. 이미 선언된 테라폼 구성에 추가하는 경우라면 Import되는 대상의 프로바이더 정의가 있는지 확인한다. 

 

여기서는 기존 테라폼 구성이 없다고 가정하고 새로운 디렉터리를 생성한 후 main.tf를 다음과 같이 작성한다. 기존 리소스의 기본 정의도 리소스 주소 선언을 위해 추가하고 terraform init을 수행한다.

 

[코드] Import를 수행할 코드 구성 

terraform {
    required_providers {
        aws = {
            source  = “hashicorp/aws”
            version = “~> 5.0”
        }
    }
}

provider “aws” {
    region = “ap-northeast-2”
}

resource “aws_security_group” “my_sg” { # Import 대상의 리소스 블록 껍데기
}

 

테라폼 구성으로 가져오려는 대상을 terraform import 명령을 사용해 State를 작성한다. Import가 성공하면 terraform.tfstate가 새로 생성되고, 기존에 사용 중인 State가 있다면 해당 State 파일에 내용이 추가된다

 

 기본 사용법: terraform [global options] import [options] ADDR ID
| - ADDR: Import하는 대상에게 부여하는 리소스 주소
| - ID: Import 대상의 고유 값

 

 

$ terraform import aws_security_group.my_sg <보안 그룹 ID>

aws_security_group.my_sg: Importing from ID “<보안 그룹 ID>”...
aws_security_group.my_sg: Import prepared!
	Prepared aws_security_group for import
aws_security_group.my_sg: Refreshing state... [id=<보안 그룹 ID>]

Import successful!

The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.

[커맨드] 생성되어 있는 리소스 정보를 테라폼 State로 가져오는 작업 
 

 

terraform.tfstate에 추가된 정보를 확인한다.

 

[구성] Import로 State에 추가된 리소스 정보 

"resources": [
    {
        "mode": "managed",
        "type": "aws_security_group",
        "name": "my_sg",
        "provider": "provider["registry.terraform.io/hashicorp/aws"]",
        "instances": [
            {
                "schema_version": 1,
                "attributes": {
                    "description": "terraform import check",
                    "id": "<보안 그룹 ID>",
                    "ingress": [
                        {
                            "cidr_blocks": [
                                "0.0.0.0/0"
                            ],
                            "from_port": 1234,
                            "protocol": "tcp",
                            "to_port": 1234
                            ...
                        }
                        ...
                    ],
                    "name": "import-sg",
                    "tags": {
                        "purpose": "terraform-import"
                    },
                    ...
                }
            }
        ]
    }
]
	

 

✅ 3단계. 테라폼 구성 작성 

 

State만 추가된 상태에서 Plan을 수행하면 테라폼 실행 계획은 구성의 내용에 기반하기 때문에 이미 생성된 형상을 삭제하려 한다. 따라서 State에 정의된 내용을 참고해 테라폼 구성을 작

성해야 한다. terraform state show 명령을 활용해 HCL 형태의 State 정보를 확인하면 보다 수월하게 코드화 과정을 수행할 수 있다. 출력된 결과를 테라폼 구성 파일(main.tf )에 붙여넣는다.

 

$ terraform state show aws_security_group.my_sg
# aws_security_group.my_sg:
resource “aws_security_group” “my_sg” {
    arn         = “arn:aws:ec2:ap-northeast-2:**********:security-group/<보안 그룹 ID>”
    description = “terraform import check”
    egress      = [
        ...
    ]
    id          = “<보안 그룹 ID>”
    ingress     = [
        ...
    ]
    name        = “import-sg”
    tags = {
        “purpose” = “terraform-import”
    }
    vpc_id      = “<VPC ID>”
}

[커맨드] State에 저장된 리소스 정보를 HCL 형태로 출력 
 

주의해야 할 점은 출력된 결과는 코드 작성에 사용되는 정의인 인수와 결과로 나타나는 속성을 모두 포함하고 있다는 것이다. 따라서 문서를 참고해 생성에 필요한 인수와 불필요한 기본값은 삭제할 필요가 있다. 실습에서 삭제 대상은 다음과 같다.

 

  • id
  • owner_id
  • tags_all
  • timeouts

 

✅ 4단계. Plan으로 검증 

 

Plan을 수행하면서 변경 사항이 발생하지 않는지 확인한다.

 

 

✅ 5단계. Apply로 상태 업데이트 

 

Apply로 최종 상태를 확인하고, 이미 반영된 구성을 변경하면서 테라폼으로 관리할 수 있는지 확인한다. 추가로 aws_security_group_rule 형태로 변경해보고 변수로 포트를 입력할 수 있도록 구성을 변경해보는 것을 추천한다. 내부 블록 형태에서 리소스2 참조 형태로 정의하는 Security Group 정의 방식이다.

보안 그룹과 같이 변경이 잦고, 속성 값이 많고, 작업을 실수할 가능성이 높은 리소스의 경우 대상 리소스만 테라폼으로 관리하더라도 코드적인 프로비저닝과 자동화를 구현할 수 있다.

 


 

 

“현업에서 요구하는 진짜 IaC 사용법”
개정판으로 더 탄탄해진 테라폼 실무 노하우


인프라를 코드로 정의하고 자동화하는 기술인 IaC의 수요는 나날이 늘고 있으며 그중에서도 테라폼은 빠르고 실용적이라는 특성 덕에 가장 강력한 도구로 인정받고 있다. 이 책은 테라폼의 기본 개념부터 고급 활용 방법까지, 초보자도 전문가로 성장할 수 있도록 구성되어 있다. 다양한 클라우드 환경에서 테라폼을 활용하는 방법과 효과적인 팀 협업 및 대규모 인프라 관리 전략도 제공한다. 게다가 LG 유플러스 사례와 생성형 AI 활용법을 통해 생산성을 더욱 향상시키는 방안도 소개한다. 친절한 단계별 설명, 풍부한 예제로 시스템 전문가 및 엔지니어에게 꼭 필요한 지침서가 되어줄 것이다.

댓글 입력
자료실

최근 본 상품0