분류 기타

Terraform 및 Infrastructure as Code 알아보기

컨텐츠 정보

  • 조회 398 (작성일 )

본문

Terraform은 코드 형태로 다양한 클라우드 인프라 서비스를 관리하는 데 도움이 되는 도구입니다. 인프라를 코드화 하므로 IaC (Infrastructure as Code)라고도 합니다.


클라우드는 점점 더 많은 기업에서 중요해지고 있습니다. 시간과 비용을 줄이는 데 도움이 될 뿐만 아니라 고객이 핵심 비즈니스에 집중할 수 있습니다.


왜 Infrastructure as Code인가? 


클라우드 제공 업체의 수가 증가하고 서비스가 더욱 유연해짐에 따라 클라우드 인프라 리소스를 관리 할 수 있는 것이 더욱 중요해지고 있습니다.


Terraform은 IaC (Infrastructure as Code) 개념으로 작동합니다. 간단히 말해서 IaC는 양식 코드로 인프라를 표현하는 기능입니다.


AWS의 EC2와 같은 특정 클라우드의 컴퓨팅 리소스를 예로 들어 보겠습니다. AWS에서 EC2 인스턴스를 요청하는 것은 AWS에 가입하고 값을 제공 한 다음 "Launch"버튼을 클릭하면 됩니다. "리소스"는 몇 분 안에 준비됩니다.


이러한 가치를 AWS에 제공 할 수 있는 한 그들은 해당 클라우드 공급자에 상주 할 것입니다. 물론 이것은 이를 수행하는 전통적인 방법입니다.


Terraform은 이러한 자격 증명 및 입력을 구성 형식으로 가져와 처리하여 대상 클라우드에서 리소스를 생성하는 방법을 제공합니다.


이러한 구성은 Terraform이 이해하는 언어로 리소스를 설명합니다. 구성은 인프라의 원하는 상태를 선언하는 방법입니다. 기본적으로 "선언적"구문입니다.


Terraform은 클라우드 공급자 API를 사용하여 리소스를 생성합니다.


Terraform의 장점 


Terraform은 Hashicorp의 제품이며 HCL (Hashicorp Configuration Language) 구문을 사용하여 구성을 나타냅니다.


아래 예에서 가장 간단한 형태로 EC2 인스턴스의 표현을 볼 수 있습니다.


provider “aws” {
	region = “us-west-1”
}

resource “aws_instance” “myec2” {
	ami = “ami-12345qwert”
	instance_type = “t2.micro”
}

이 간단한 예는 Terraform의 기능을 이해하기에 충분합니다.


코드에는 공급자와 리소스의 두 블록이 포함됩니다. provider 블록을 통해 Terraform은 "us-west-1"리전에서 aws 공급자를 사용하고자 함을 알립니다.


리소스 블록을 통해 Terraform은 AWS에서 제공하는 모든 인프라 리소스 중에서 "인스턴스"(EC2) 유형의 리소스를 생성하고자 함을 알 수 있습니다.


첫 번째 매개 변수는 이를 리소스 블록에 "aws_instance"로 나타냅니다. 두 번째 매개 변수는 리소스 이름을 지정했습니다. 이 경우에는“myec2”입니다.


리소스 블록에는 AWS 머신 이미지와 이 리소스를 생성하는 데 사용 된 인스턴스 유형을 나타내는 몇 가지 인수가 있습니다.


여기에서 우리는 인프라를 코드 형태로 표현했습니다. IaC의 몇 가지 장점을 살펴 보겠습니다.


  1. 이제 인프라 생성이 구성 / 코드 파일에 압축되어 있기 때문에 이제 Git과 같은 버전 제어 시스템을 활용하여 공동 작업 및 유지 관리 할 수 ​​있으므로 유지 관리가 더 쉽습니다.
  2. 짧은 시간 내에 구성을 작성할 수 있으므로 인프라 계획 단계에 필요한 시간이 단축됩니다. 이러한 구성은 Terraform에서 몇 분 동안 클라우드 리소스를 만들기 위해 즉시 사용됩니다.
  3. 인프라 변경은 더 쉽고 애플리케이션 코드 변경과 비슷합니다.
  4. 소프트웨어 개발의 경우 애플리케이션 관리 수명주기의 이점은 인프라에도 적용됩니다. 이것은 더 효율적입니다.


Terraform의 특징 


Orchestration 

다양한 엔드 투 엔드 서비스를 배포 할 때 Terraform은 클라우드 리소스 생성과 관련하여 오케스트레이션 프로세스의 핵심 역할을 합니다.


Cloud agnostic 

Terraform은 AWS, MS Azure 및 GCP를 포함한 대부분의 클라우드를 지원하므로 공급 업체 종속 문제에 대해 많이 걱정할 필요가 없습니다. Terraform 레지스트리는 지원되는 모든 클라우드 제공 업체에 대한 문서를 제공합니다.


다양한 클라우드에서 인프라를 코딩하는 데 사용되는 구문 패턴은 동일하므로 공급자 별 API와 관련된 학습 곡선은 뒷받침되지만 잊혀지지는 않습니다.


Declarative syntax 

Terraform 파일에 표현 된 인프라는 선언적입니다. 따라서 개발자는 Terraform이 리소스를 만드는 데 필요한 단계를 이해하도록 하는 것에 대해 걱정할 필요가 없습니다. 오히려 우리가 해야 할 일은 Terraform에 원하는 상태를 알리고 Terraform이 내부적으로 단계를 처리하는 것입니다.


Modules 

Terraform은 Terraform 코드를 재사용 하는 데 도움이 되는 모듈을 제공합니다. 복잡한 인프라는 여러 모듈로 나뉘며 각 모듈은 다른 프로젝트에서 재사용 할 수 있습니다.


주어진 Terraform 구성을 모듈로 변환하는 것은 매우 쉽고 Terraform에는 사전 빌드 된 모듈을 위한 에코 시스템이 있습니다.


State management 

Terraform이 인프라를 만들고 계획하는 동안 상태는 유지됩니다. 협업을 위해 다른 팀원과 공유 할 수 있습니다.


Terraform을 사용하면 상태를 원격으로 관리 할 수 ​​있으므로 팀 구성원이 인프라를 다시 만들려고 할 때 혼란을 방지 할 수 있습니다.


Provisioning 

Terraform은 완전한 프로비저닝 도구는 아니지만 첫날 프로비저닝 활동에 도움이 됩니다. Terraform의 local-exec 및 remote-exec 블록을 사용하면 인라인 스크립트를 실행할 수 있습니다. 인라인 스크립트는 리소스를 성공적으로 만들 때 소프트웨어 구성 요소를 설치하는 데 도움이 됩니다.


이는 Chef, Ansible 및 Salt Stack과 같은 구성 관리 도구가 각각의 에이전트를 설치하도록 도울 때 특히 유용합니다. 성공적으로 설치되면 "UP"신호를 보낼 수 있습니다.


Open Source 

Terraform은 오픈 소스 소프트웨어로 사용할 수 있습니다. 엔터프라이즈 버전도 있습니다.


Terraform Workflow [init - plan - apply - destroy] 

Terraform 코드를 실행하려면 몇 가지 간단한 단계를 수행해야 합니다. 이러한 단계는 클라우드 플랫폼의 리소스 수명주기와 밀접한 관련이 있습니다.


다시 말하지만, 이러한 단계는 클라우드에 구애 받지 않습니다. 즉, 동일한 단계 / 명령이 지정된 클라우드 공급자에서 리소스를 생성, 업데이트 및 제거하는 데 유효합니다.


참고 :이 블로그 게시물은 Terraform의 설치 단계를 다루지 않으며 시스템에 이미 Terraform CLI가 설치되어 있다고 가정합니다.


Run the init command 

구성 파일이 준비되면 실행해야 하는 첫 번째 명령은 terraform init입니다. Terraform 바이너리 설치에는 한 번에 모든 클라우드 공급자에 대한 지원이 포함되지 않습니다.


대신 제공 업체에 따라 Terraform이 코드를 실행하기 전에 적절한 플러그인이 다운로드 됩니다. 이 예에서 terraform init를 실행하면 aws 공급자 플러그인이 다운로드 됩니다. 이 명령은 지정된 Terraform 디렉토리에 대한 백엔드를 초기화하는 데 도움이 됩니다.


Generate an execution plan 

terraform plan 명령은 실행 계획을 생성하는 데 도움이 됩니다. 제공 한 구성에 따라 Terraform은 실행 계획을 생성합니다. 이 단계에서 Terraform은 구문 오류, API 인증, 상태 확인 등의 측면에서 타당성 검사를 수행합니다.


계획은 실제 실행 전에 Terraform 스크립트의 수정 사항을 강조 표시합니다. 성공하면 인프라의 잠재적 인 변경 사항에 대한 요약을 출력합니다. 인프라를 수정하기 전에 모든 위험을 인식하므로 적용하기 전에 실행해야 합니다.


Apply the changes 

terraform apply는 인프라 변경을 실행하는 데 도움이 됩니다. 계획은 적용 단계에서 참조되는 계획 파일을 생성하므로 terraform apply를 실행하기 전에 plan 명령을 실행해야 합니다.


단, terraform apply를 직접 실행하는 경우에는 자동으로 새로운 계획 파일이 생성됩니다.


Destroy resources 

마지막으로, terraform destroy는 현재 구성 / 상태의 일부인 모든 리소스를 파괴하는 데 도움이 됩니다.


Terraform in Action 

좋아요,이 게시물에 대한 충분한 이론입니다. AWS에서 실제로 EC2 인스턴스를 생성하여 지금까지 배운 것을 구현해 보겠습니다.


먼저 아직 설치하지 않은 경우 Terraform CLI를 설치합니다. 설치는 매우 쉽고 여기에서 선택한 OS에 대한 단계를 찾을 수 있습니다.


시스템에 디렉토리 / 폴더를 만들고 첫 번째 Terraform 파일을 만듭니다. 이름을 main.tf로 지정합니다. 이상적으로는 확장자가 .tf이면 무엇이든 이름을 지정할 수 있습니다.


Terraform CLI는 실행을 위해 특정 디렉토리에 저장된 .tf 확장자를 가진 모든 파일을 인식합니다.


이 파일에 위 코드를 붙여 넣고 저장하십시오. 선호하는 리전에 따라 올바른 AMI를 사용해야 합니다.


Terraform 코드를 처음 실행하는 것이기 때문에이 디렉토리에서 Terraform을 초기화해야 합니다. terraform init를 실행하면 필요한 aws 플러그인이 설치됩니다.


터미널을 실행하고 Terraform 파일이 있는 디렉토리로 이동 한 후 아래 명령을 실행하십시오.


terraform init 


그러면 아래와 같은 출력이 생성됩니다. 출력은 매우 명확하며 aws 플러그인이 버전 v3.22.0과 함께 설치되었음을 알 수 있습니다.


Initializing the backend...
Initializing provider plugins...
- Reusing previous version of hashicorp/aws from the dependency lock file
- Installing hashicorp/aws v3.22.0...
- Installed hashicorp/aws v3.22.0 (signed by HashiCorp)
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

다음으로 terraform plan 명령을 실행하여 임시 실행 계획을 확인합니다. 또한 구문 또는 참조 오류에 대해서도 유효성을 검사합니다. plan 명령은 main.tf 파일에서 선언 된 리소스의 실행 가능성을 확인합니다. 동일한 터미널에서 실행하십시오.


terraform plan 


모든 것이 잘 작동하면 다음 출력이 생성됩니다.


An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # aws_instance.example will be created
  + resource "aws_instance" "myec2" {
      + ami                          = "ami-12345qwert"
      + arn                          = (known after apply)
      + associate_public_ip_address  = (known after apply)
. . .
Plan: 1 to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

plan 명령은 생성 될 리소스를 나타냅니다. 우리의 경우 주어진 구성으로 myec2 인스턴스를 생성 할 계획입니다. 인스턴스를 생성하는 데 사용되는 AMI ID를 보여줍니다.


또한 arn 및 Associate_public_ip_address와 같은 다른 속성이 적용 후, 즉 인스턴스가 생성 될 때 알려 졌음을 나타냅니다.


여기서 맨 아래 줄은 최종 변경 세트를 나타냅니다. 즉, 리소스 1 개를 추가하고 변경하거나 삭제할 항목이 없습니다.


그래서 지금은 모든 것이 좋아 보입니다. 계속해서 구성을 적용 해 보겠습니다. 터미널에서 아래 명령을 실행하고 출력을 관찰하십시오.


terraform apply 


확인되면 AWS에서 EC2 인스턴스 생성을 완료하는 데 몇 초가 걸리며 이는 terraform apply에서 생성되는 출력으로 표시됩니다.


아래 출력에서 ​​알 수 있듯이 제 경우에는 EC2 인스턴스를 생성하는 데 51 초가 걸렸으며 인스턴스 ID도 사용할 수 있게 되었습니다.


AWS 콘솔에 로그인하고 아래 ID로 EC2 인스턴스를 검색하여 동일하게 확인하십시오. 모든 것이 잘 작동했다면 찾을 수 있을 것입니다.


Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

aws_instance.myec2: Creating...
aws_instance.myec2: Still creating... [10s elapsed]
aws_instance.myec2: Still creating... [20s elapsed]
aws_instance.myec2: Still creating... [30s elapsed]
aws_instance.myec2: Still creating... [40s elapsed]
aws_instance.myec2: Still creating... [50s elapsed]
aws_instance.myec2: Creation complete after 51s [id=i-04ef3120a0006a153]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

따라서 IaC를 사용하여 AWS에서 가상 머신 구성을 정의 / 선언하고 생성했습니다.


이 가상 머신이 더 이상 필요하지 않은 경우 동일한 구성을 사용하여 삭제할 수 있습니다.


이러한 변경 사항을 적용 할 의도 없이 구성을 변경 한 다음 동일한 사항을 삭제하려고 하면 오류가 발생할 수 있습니다.


이는 Terraform이 상태 파일에서 구성과 실제 리소스 간의 관계를 유지하기 때문입니다. 응용 프로그램으로 구성을 변경하면 정렬에 영향을 미치며 Terraform은 이를 생성 할 새 리소스로 취급합니다.


Terraform 상태는 자체 게시물이 필요한 주제이므로 나중에 다루겠습니다. 지금은 EC2 인스턴스를 삭제하려면 터미널에서 아래 명령을 실행하십시오.


terraform destroy 


리소스를 폐기하기 전에 Terraform은 계획 출력을 제공하여 확인을 요청합니다. 그것은 destroy 명령을 실행하면 정확히 우리가 기대하는 리소스 1 개가 삭제된다는 것을 나타냅니다.


Terraform destroy
Plan: 0 to add, 0 to change, 1 to destroy.

Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes

aws_instance.myec2: Destroying... [id=i-04ef3120a0006a153]
aws_instance.myec2: Still destroying... [id=i-04ef3120a0006a153, 10s elapsed]
aws_instance.myec2: Still destroying... [id=i-04ef3120a0006a153, 20s elapsed]
aws_instance.myec2: Still destroying... [id=i-04ef3120a0006a153, 30s elapsed]
aws_instance.myec2: Still destroying... [id=i-04ef3120a0006a153, 40s elapsed]
aws_instance.myec2: Still destroying... [id=i-04ef3120a0006a153, 50s elapsed]
aws_instance.myec2: Still destroying... [id=i-04ef3120a0006a153, 1m0s elapsed]
aws_instance.myec2: Destruction complete after 1m5s

Destroy complete! Resources: 1 destroyed.

다시 말하지만 리소스를 삭제하는 데 몇 초가 걸립니다. Terraform은 10 초 간격으로 상태를 업데이트하기 때문에 계속 중단되지 않습니다.


리소스가 파괴되면 완료되었음을 확인합니다. AWS 콘솔에 자유롭게 로그인하여 리소스가 종료되었는지 확인하십시오.


Thanks for reading! 


이 기본 소개에서 Terraform의 작동 방식을 이해하시기 바랍니다. 상태, 구문, CLI, 백엔드 등과 같은 더 깊은 개념을 다루는 더 많은 게시물을 향후 게시물에서 작성하겠습니다.


https://www.freecodecamp.org/news/what-is-terraform-learn-infrastructure-as-code/