首页 > 解决方案 > Terraform:如何确保我在预期的 AWS 账户上运行 terraform

问题描述

假设我想在我的 dev 账户中启动一个 EC2 实例,但我可能不小心运行了错误的命令并创建了一个 prod 账户而不是 dev 账户的临时凭证,那么当我应用 Terraform 时,我将在 prod 账户中启动 EC2 ?

我怎样才能避免这种情况发生?我可以在此文件夹中创建一个具有开发帐户 ID 的文本文件,然后让 Terraform 在启动 EC2 之前将我的临时凭证的帐户 ID 与此文件中的帐户 ID 进行比较,也许是在 null_resource 中?我无法弄清楚如何实现它。

标签: amazon-web-servicesterraform

解决方案


AWS 提供商允许您指定一个列表allowed_account_idsforbidden_account_ids您可以定义的列表,以防止在必要时发生这种情况。

所以你可能有一个看起来有点像这样的文件夹结构:

$ tree -a
.
├── dev
│   ├── bar-app
│   │   ├── dev-eu-west-1.tf -> ../../providers/dev-eu-west-1.tf
│   │   └── main.tf
│   ├── foo-app
│   │   ├── dev-eu-west-1.tf -> ../../providers/dev-eu-west-1.tf
│   │   └── main.tf
│   └── vpc
│       ├── dev-eu-west-1.tf -> ../../providers/dev-eu-west-1.tf
│       └── main.tf
├── prod
│   ├── bar-app
│   │   ├── main.tf
│   │   └── prod-eu-west-1.tf -> ../../providers/prod-eu-west-1.tf
│   ├── foo-app
│   │   ├── main.tf
│   │   └── prod-eu-west-1.tf -> ../../providers/prod-eu-west-1.tf
│   └── vpc
│       ├── main.tf
│       └── prod-eu-west-1.tf -> ../../providers/prod-eu-west-1.tf
├── providers
│   ├── dev-eu-west-1.tf
│   ├── prod-eu-west-1.tf
│   └── test-eu-west-1.tf
└── test
    ├── bar-app
    │   ├── main.tf
    │   └── test-eu-west-1.tf -> ../../providers/test-eu-west-1.tf
    ├── foo-app
    │   ├── main.tf
    │   └── test-eu-west-1.tf -> ../../providers/test-eu-west-1.tf
    └── vpc
        ├── main.tf
        └── test-eu-west-1.tf -> ../../providers/test-eu-west-1.tf

您的providers/dev-eu-west-1.tf文件如下所示:

provider "aws" {
  region              = "eu-west-1"
  allowed_account_ids = [
    "1234567890",
  ]
}

你的providers/test-eu-west-1.tf文件看起来像:

provider "aws" {
  region              = "eu-west-1"
  allowed_account_ids = [
    "5678901234",
  ]
}

这意味着您只能dev/foo-app在使用属于该1234567890帐户的凭据时运行 Terraform,并且只能dev/foo-app在使用属于该5678901234帐户的凭据时运行 Terraform。


推荐阅读