2017-12-20 1 views
3

방금 ​​terraform을 시작했으며 내 프로젝트의 상태를 저장하기위한 백엔드로 AWS S3을 사용할 수 있기를 바랍니다.terraform을 사용하는 terraform 백엔드의 초기 설정

terraform { 
    backend "s3" { 
     bucket = "tfstate" 
     key = "app-state" 
     region = "us-east-1" 
    } 
} 

내 S3 버킷, IAM 그룹 및 정책을 테라 폼과 함께 백엔드 저장소 인프라에도 설정할 수 있습니다.

초기 terraform 인프라를 적용하기 전에 백엔드 상태를 설정하면 백엔드 버킷이 아직 생성되지 않았다고 합리적으로 불평합니다. 그래서, 제 질문은, 어떻게 테라 폼에 의해 추적 된 백엔드에 대한 내 상태를 유지하면서 테라 폼으로 테라 폼 백엔드를 설정하는지에 있습니다. 중첩 된 인형 문제처럼 보입니다.

버킷이 있는지 또는 일부 상태가 설정되어 있는지 확인한 다음 terraform을 부트 스트랩하고 마지막으로 로컬 파일 시스템에서 ter3form tfstate를 s3으로 복사하는 등의 방법으로 스크립트를 작성하는 방법에 대해 생각해 봅니다. 첫 번째 실행. 그러나이 힘드는 길을 떠나기 전에, 나는 분명히 뭔가를 놓치지 않았 음을 확신했다.

+1

이것은 좋은 질문입니다. FWIW에는 별도의 "부트 스트랩 (bootstrap)"TF 프로젝트가 있으며,이 프로젝트는 수퍼 미니멈 수동 공급 버킷에 의존합니다. –

+0

예 부트 스트랩 프로젝트가 여러 헬퍼 스크립트와 공급자 구성을 프로젝트에 복사하고 AWS CLI를 사용하여 버전이없는 S3 버킷 및 DynamoDb 잠금 테이블을 만드는 경우 유사한 작업을 수행했습니다. 우리가 Terraform에서 그렇게 할 수 있다면 좋겠지 만 시도했을 때 그만한 가치가 있기에 너무 지저분했습니다. – ydaetskcoR

+0

Terragrunt도이 문제를 처리 할 수 ​​있으며 다른 버킷으로 이동하려는 경우 정말 편리합니다. https://github.com/gruntwork-io/terragrunt – Begin

답변

1

처음 발견 한 것처럼 terraform을 사용하여 terraform 구성 요소를 만들 수 없습니다.

"나는 모든 것을 추적하십시오."라는 태도를 이해하는 동안, 그것은 가치가있는 것보다 매우 힘들고 두통이 많습니다.

나는 일반적으로 간단한 부트 스트랩 쉘 스크립트를 작성하여이 상황을 처리합니다.

  1. 스테이트 스토리지
  2. 의 S3 버킷은 추가 버전에 내가 terraform을 위해 필요합니다 특정 정책 양동이
  3. terraform의 IAM 사용자 및 그룹이

를 구축하는 것을 : 그것은 같은 것들을 만들어 이것을 (기술적으로) 한 번만 실행하면 좋겠지 만, 새로운 시스템을 개발할 때 반복적으로 작동을 멈추고 찢어 버린다. 따라서 한 스크립트에서 이러한 단계를 수행하면 훨씬 간단 해집니다.

나는 일반적으로 멱등수가되도록 스크립트를 작성합니다. 이렇게하면 중복 된 버킷, 사용자 등을 만들지 않고 여러 번 실행할 수 있습니다.

1

terraform 원격 상태를 사용하여이를 설정하려면 일반적으로 내 dev에 remote-state라는 별도의 폴더가 있습니다. terraform 폴더. 다음 main.tf 파일은 게시 한 내용에 대한 원격 상태를 설정합니다.

provider "aws" { 
    region = "us-east-1" 
} 

resource "aws_s3_bucket" "terraform_state" { 
    bucket = "tfstate" 

    versioning { 
    enabled = true 
    } 

    lifecycle { 
    prevent_destroy = true 
    } 
} 

resource "aws_dynamodb_table" "terraform_state_lock" { 
    name   = "app-state" 
    read_capacity = 1 
    write_capacity = 1 
    hash_key  = "LockID" 

    attribute { 
    name = "LockID" 
    type = "S" 
    } 
} 

그런 다음 원격 상태 폴더 실행 terraform init && terraform apply 이내에 한 번만 실행해야합니다. 버킷 및 다이나모 테이블 이름에 무언가를 추가하여 여러 환경을 구분할 수 있습니다.

관련 문제