簡體   English   中英

如何使用多個AWS賬戶在環境之間隔離terraform state

[英]How to use multiple AWS account to isolate terraform state between environment

我該如何使用指向不同 AWS 賬戶的 s3 后端?

換句話說,我想要這樣的東西:

AWS 賬戶 A 中 S3 存儲桶上的開發環境 state

在 AWS 賬戶 B 上的另一個 S3 存儲桶上暫存環境 state

任何人都可以幫助我嗎?

Terraform 的s3后端的文檔包括多賬戶 AWS 架構部分,其中包括在多賬戶 AWS 架構中使用 Terraform 的一些建議、建議和注意事項。

該指南比我在這里復制的要詳細得多,但推薦的要點是:

  • 為 Terraform 和您用於預置和配置環境的任何其他管理工具使用單獨的 AWS 賬戶,以便 Terraform使用的基礎設施與 Terraform管理的基礎設施完全分開。

    這降低了錯誤的 Terraform 配置無意中破壞您使用 Terraform 本身的能力的風險(例如,通過刪除 state object,或通過刪除必要的 IAM 權限)。 它還降低了攻擊者利用您的主要基礎設施中的漏洞升級以訪問您的管理基礎設施的可能性。

  • 使用sts:AssumeRole在您的每個主要環境 AWS 賬戶中間接訪問具有管理訪問權限的 IAM 角色。

    這使您可以將所有直接管理訪問集中在一個 AWS 賬戶中,您可以在其中更輕松地對其進行審核,減少憑據蔓延,還可以方便地為該跨賬戶訪問配置 AWS 提供商(因為它內置了assume_role支持).

該指南還討論了使用工作空間來表示環境。 考慮到何時使用多個工作區中其他地方的指導,該建議可能更值得商榷,但使用管理帳戶和 IAM 委托的原則仍然適用,即使您遵循每個環境都有一個單獨的根模塊並使用共享模塊的建議表示公共元素。

與系統架構中的所有事物一樣,這些都不是絕對的,最適合您的情況將取決於您的詳細信息,但希望我鏈接到的這兩個文檔部分中的內容將幫助您權衡各種選項並決定什么是最適合您的具體情況。

有幾個解決方案:

  1. 在運行時運行terraform init和 injec terraform 后端變量時,在命令行提供 aws 配置文件名稱:

     AWS_PROFILE=aws-dev terraform init -backend-config="bucket=825df6bc4eef-state" \ -backend-config="dynamodb_table=825df6bc4eef-state-lock" \ -backend-config="key=terraform-multi-account/terraform.tfstate"

或將此命令包裝在Makefile中,因為它很長且容易忘記。

  1. 保留單獨的目錄並提供角色或您的憑據或配置文件名稱,即使使用共享憑據

     provider "aws" { region = "us-west-2" shared_credentials_file = "/Users/tf_user/.aws/creds" profile = "customprofile" }
  2. Terraform 工作區

  3. 暴龍

我不認為現在沒有一些 hijinks 的情況下,每個工作區都有一個單獨的 S3 后端是不可能的。 如果您可以在一個帳戶中使用一個 S3 后端,那么很容易讓不同的帳戶與每個工作區相關聯。

# backend.tf
terraform {
  backend "s3" {
    profile        = "default"
    bucket         = "my-terraform-state"
    key            = "terraform-multi-account-test/terraform.state"
    region         = "eu-west-1"
    encrypt        = true
    dynamodb_table = "my-terraform-state-lock"
  }
}

# provider.tf
variable "workspace_accounts" {
  type = map(string)
  default = {
    "sandbox" = "my-sandbox-keys"
    "dev"     = "default"
    "prod"    = "default"
  }
}

provider "aws" {
  shared_credentials_file = "$HOME/.aws/credentials"
  profile                 = var.workspace_accounts[terraform.workspace]
  region                  = "eu-west-1"
}

參見https://github.com/hashicorp/terraform/issues/16627

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM