Terraform을 사용하여 여러 계정에 배포하시나요?

Terraform을 사용하여 여러 계정에 배포하시나요?

저는 Terraform에서 동시에 여러 AWS 계정에 배포하고 완료할 수 있는 Terraform 방법을 찾고 있었습니다. AWS에는 Stacks를 사용하여 이 작업을 수행한다는 개념이 있지만 TF에서 이를 수행할 수 있는 방법이 있는지 잘 모르겠습니다. 그렇다면 어떤 해결책이 있을까요?

여기에서 AWS 솔루션에 대한 자세한 내용을 읽을 수 있습니다.https://aws.amazon.com/blogs/mt/supercharge-multi-account-management-with-aws-cloudformation/

답변1

여러 AWS 계정에서 동일한 Terraform 구성을 사용하려면 해결해야 할 두 가지 문제가 있습니다. 첫 번째는 각 계정마다 다른 상태 파일을 사용해야 한다는 것입니다. 두 번째는 AWS 공급자가 원하는 계정에 대해 올바른 프로필/자격 증명을 사용하는지 확인하는 것입니다.

각 계정에 대해 다른 상태 파일 사용

높은 수준에서 Terraform은 제공된 terraform 구성 파일(*.tf)에서 종속성 리소스 그래프를 생성하여 간단히 작동합니다. 상태 파일과 비교합니다. 상태 파일은 로컬( terraform.tfstate) 또는 원격에 있을 수 있습니다.백엔드; 일반적인 AWS 원격 백엔드는s3.

변수를 통해 별도의 계정을 사용하도록 AWS 공급자를 지정하더라도(자세한 내용은 아래 참조) 두 계정 모두 동일한 백엔드를 사용하는 경우 Terraform은 계속 충돌합니다. 이는 한 계정에서 다른 계정으로 전환할 때 리소스 AWS ID가 일치하지 않거나 Terraform이 현재 보고 있는 계정에 존재하지 않는 상태 파일에 리소스가 명시되기 때문에 발생합니다.

이 문제를 해결하는 간단한 방법은 다음과 같습니다.작업 공간. 작업공간을 사용하면 다른 백엔드 키를 지정하지 않고도 다양한 상태 파일을 사용할 수 있습니다. 작업 공간을 사용하는 것은 매우 간단합니다. 다음과 같은 간단한 Terraform 블록이 있는 경우:

terraform {
    backend "s3" {
       bucket = "aws_bucket"
       key    = "terraform.tfstate"
       region = "us-east-1"
    }
}

를 사용하여 새 작업 공간을 만들 수 있습니다 terraform workspace new <workspace-name>. 따라서 다음과 같은 순서를 사용하여 두 계정 모두에 대한 작업 공간을 만들 수 있습니다.

terraform workspace new account-1
terraform workspace new account-2

다음을 사용하여 현재 작업 공간을 전환할 수 있습니다 terraform workspace select.

terraform workspace select account-1

작업 공간을 인식하도록 AWS 공급자 구성

별도의 상태 파일을 사용하는 것 외에도. 또한 필요한 각 계정에 대해 서로 다른 AWS 자격 증명(예: 액세스 키)을 지정해야 합니다. AWS 자격 증명은 다음을 사용하여 명시됩니다.공급자. 이 경우에는 분명히 다음을 사용하고 있습니다.AWS 공급자.. 당신은 본질적으로 사용하고 싶습니다보간AWS 공급자 리소스 블록 내에서 작업 공간을 전환하면 Terraform이 올바른 자격 증명을 사용합니다. 계정별로 별도의 프로필을 사용하여 aws 자격 증명 파일을 설정했다고 가정합니다.

[account-1]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

[account-2]
aws_access_key_id=AKIAI44QH8DHBEXAMPLE
aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY

그런 다음 aws 공급자 블록을 다음과 같이 간단히 작성할 수 있습니다.

provider "aws" {
    region  = "us-east-1"
    profile = "${terraform.workspace}"
}

따라서 작업 영역의 이름을 aws 프로필 이름으로 지정하면 작업 영역을 전환할 때 Terraform은 상태를 새로 고치고 종속성 그래프를 작성할 때 다른 aws 자격 증명 프로필을 사용합니다.

대체 방법

이것이 이것을 달성하는 유일한 방법은 아닙니다. 당신은 구축할 수 있습니다모듈; 그런 다음 다양한 AWS 공급자 및 상태 파일이 지정된 모듈을 호출하는 다양한 디렉터리가 있습니다. 각 방법에는 장단점이 있습니다.

작업 공간 방법은 단일 디렉터리를 사용하여 수행하는 방법이며, 작성된 것과 정확히 동일한 Terraform 구성 파일을 사용하게 됩니다.

모듈에는 최소한 모듈을 호출하고 공급자와 백엔드를 지정하는 별도의 구성 파일이 필요합니다. 다중 계정, 다중 지역 및 다중 환경을 수행하려는 경우 모듈이 매우 적합합니다. 예를 들어 각 계정에 대해 두 지역과 두 가지 다른 환경(스테이징 및 프로덕션)에서 실행하려는 경우입니다. 모듈은 개수와 같은 인수를 사용하여 유연성을 제공하기 때문에 여기서 의미가 있습니다(스테이징은 더 적은 수의 인스턴스를 실행하는 등).

답변2

기본적으로 비결은 하나의 공유 버킷 내에서 상태를 가져오고 계정을 전환할 때 제공된 것에 대해 다른 자격 증명을 지정하는 것입니다. 작업 공간은 나에게 완벽하게 작동합니다.

provider "aws" {
  version = "~> 2.18"
  profile = "second_account"
}

terraform {
  backend "s3" {
    encrypt = true
    bucket  = "shared_bucket"
    region  = "us-east-1"
    key     = "state"
    profile = "first_shared_account"
  }

  required_version = "~> 0.12.7"
}

공급자와 백엔드 구성 모두에 대해 서로 다른 프로필이 지정되어 있습니다. 각 프로필이 자체 작업 공간을 통해 격리되어 있는 한 다양한 프로필을 가질 수 있습니다.

aws configure --profile third_account
terraform workspace new third_account
terraform workspace select third_account

관련 정보