ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Terraform Backend

    IaC/Terraform 기초 2023. 9. 12. 23:56

     

     

    (이 글은 Terraform state에 대한 이해를 바탕으로 작성되었습니다.

    관련 내용은 https://kh-archive.tistory.com/22를 참고해주세요.)

     

    테라폼의 백엔드 설정에 대해서 알아보겠습니다.

    테라폼에서 State 파일에 대한 관리를 설정하는 것이 backend 설정입니다.

    backend 설정을 따로 하지 않으면 로컬에서 state 파일을 생성하여 관리합니다.

     

    그러면 굳이 Backend 설정을 하지 않아도 되나요?

     

    혼자서 개발할 것이라면 굳이 Backend 설정이 필요하지는 않습니다.

    하지만 대부분의 경우 인프라 개발을 혼자서 개발을 하는 경우는 드물죠.

    그리고 지금 당장은 혼자서 인프라 및 데봅스 개발을 하더라도

    나중에 누군가와 협업을 해야하는 상황이 올 수도 있다는 가정을 하면 backend 설정은 필수적입니다.

     

    또한, 기본적으로 backend 설정은 각 클라우드에서 제공하는 storage에 state를 생성하고 관리하기 때문에

    클라우드에서 제공하는 데이터 백업이나 보안 등의 서비스를 이용할 수 있다는 장점이 있습니다.

    (다만, 비용은 들겠죠?)

     

    그러면 AWS의 S3로 테라폼 Backend 설정을 하는 방법에 대해서 알아보겠습니다.

    (다른 클라우드의 스토리지를 backend로 설정하는 것은 각 클라우드에 관한 terraform 카테고리에서 다루겠습니다.)

     

    (AWS S3 bucket을 생성을 전제로 진행합니다. AWS S3 bucket 생성에 대한 내용은 링크를 참조해주세요.)

     

    terraform {
      backend "s3" {
        bucket = "cloudman-sample-bucket-01"
        key = "terraform/state/tfstate"
        region = "ap-northeast-2"
      }
    }

     

    이렇게 테라폼 블록 안에 backend라고 state 파일이 저장될 bucket과 bucket 내 경로인 key를 적어주면 끝입니다.

    정말 쉽죠? 그런데 사실 이렇게 간단하게 끝나지는 않습니다.

    어디까지나 이런 간단한 설정은 앞에 전제되어야 하는 작업들이 있는데요.

     

    우선, state파일을 저장 관리할 S3 bucket을 만들고, 

    해당 bucket에 대해 읽고 쓸 수 있는 권한을 가진 User 혹은 Role로 AWS의 profile 설정을 한 후에

    위에 코드로 S3 Backend 설정이 가능합니다.

     

    DynamoDB table을 활용하는 방법도 있는데요. 다음과 같습니다.

     

    terraform {  
      backend "s3" {  
        bucket = "cloudman-sample-bucket-01"  
    	key = "terraform/state/tfstate"
        region = "ap-northeast-2"  
        dynamodb_table = "terraform-state-table"  
        encrypt = true  
      }  
    }

     

    이런 식으로 DynamoDB table을 활용하여 state lock이 되도록 설정하는 방법도 있습니다.

    state lock은 동시에 state file을 수정하려고 할 때 발생하는 충돌을 방지하기 위해

    누군가 state file을 수정하고 있을 때 다른 사람이 수정하지 못하도록 lock을 거는 것을 의미합니다.

    (좀 더 자세한 내용은 state lock에 관한 내용을 참고해주세요)

     

    그러면 실제로 backend 설정을 하고 terraform을 실행하여 state 파일이 저장되는지 확인해보겠습니다.

    아래처럼 S3 bucket이 잘 생성되어 있는 것을 확인해줍니다.

     

    S3 bucket

     

    그리고 해당 테라폼을 실행할 User도 생성한 후 일단 S3의 모든 권한을 주겠습니다.

    원래는 모든 권한을 주는 것은 보안상 위험하기 때문에 필요한 권한만 부여해야 하지만,

    여기서는 Backend 테스트를 위해 임시로 생성한 User이므로 모든 권한을 주고 테스트를 진행하겠습니다.

     

    User with S3 Full Access

     

    해당 User로 AWS profile을 설정해줍니다.

    profile이 잘 설정되었는지 확인하려면 아래의 명령어로 현재 profile의 정보를 확인할 수 있습니다.

     

    aws sts get-caller-identity

     

    이 명령어를 통해 확인하면 다음과 같이 S3의 모든 권한을 가진 User가 현재 profile로 설정되어 있음을 알 수 있습니다.

     

     

    이제 terraform init을 통해 backend 설정이 되도록 해봅시다.

     

     

    중간 부분에 보면 다음과 같이 S3로 Backend가 잘 설정되었다는 문구를 확인할 수 있습니다.

    Initializing the backend...
    
    Successfully configured the backend "s3"! Terraform will automatically
    use this backend unless the backend configuration changes.

     

    하지만 우리는 아직 아무런 테라폼 동작을 하지 않았기 때문에 아직 버킷에는 보시는 것처럼 state 파일이 없습니다.

     

    Empty S3 bucket

     

    그러면 terraform을 실행해서 state file이 잘 올라가는지 봅시다.

    terraform으로 간단한 코드를 만들고 (혹은 아무 리소스나 생성하는 간단한 코드를 갓피티에게 부탁하면 만들어줍니다.)

    terraform apply 명령어를 실행하여 state file을 만들어봅니다.

    그러면 다음과 같이 리소스가 잘 생성되었다는 메시지를 확인한 후에

     

     

    S3 bucket에 가서 state가 잘 생성되었나 확인해볼까요?

     

    S3 Backend

     

    경로를 보면 저희가 key에 설정한 경로대로 폴더를 만들어서 state를 잘 저장된 것을 알 수 있습니다.

    이제 terraform apply를 해서 state를 변경할 때 S3 bucket에 있는 state file을 업데이트 합니다.

    그리고 state를 읽는 것도 S3 bucket에 있는 state file을 읽어서 현재 테라폼을 실행합니다.

     

    지금까지 cloud의 storage를 backend로 설정하는 것을 알아보았습니다.

    'IaC > Terraform 기초' 카테고리의 다른 글

    Terraform Variable  (0) 2023.09.19
    Terraform State Lock  (0) 2023.09.15
    Terraform Provider  (0) 2023.09.12
    Terraform Apply  (0) 2023.09.05
    Terraform State  (0) 2023.09.03
Designed by Tistory.