首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何让Terraform根据用户所在的帐户抛出特定的错误消息?

如何让Terraform根据用户所在的帐户抛出特定的错误消息?
EN

Stack Overflow用户
提问于 2020-02-18 04:18:11
回答 2查看 2.2K关注 0票数 1

我有一个执行域委托的terraform模块。对于几个变量,有一些针对硬编码值的验证,以检查用户是否使用了有效的输入,例如:

代码语言:javascript
代码运行次数:0
运行
复制
resource "null_resource" "validate_region" {
  count = contains(local.regions, var.region) == true ? 0 : "Please provide a valid AWS region. E.g. (us-west-2)"
}

其中local.regions是硬编码的,而var.region是用户设置的变量。上面的代码的工作原理是,当用户设置错误的变量时,它会抛出如下错误:

代码语言:javascript
代码运行次数:0
运行
复制
Error: Incorrect value type

  on .terraform/foo/main.tf line 46, in resource "null_resource" "validate_region":
  46:   count = contains(local.regions, var.region) == true ? 0 : "Please provide a valid AWS region. E.g. (us-west-2)"

Invalid expression value: a number is required.

现在我需要验证用户当前使用的AWS帐户是否正确。在本例中,由用户在其变量中设置正确帐户的帐户id,我的代码需要提取运行模块的帐户的帐户id,并将其与用户的变量进行比较。我尝试过这样的东西:

代码语言:javascript
代码运行次数:0
运行
复制
data "aws_caller_identity" "account" {}

resource "null_resource" "validate_account" {
  count = data.aws_caller_identity.account.account_id == var.primary_account_id ? 0 : "Please check that you are using the AWS creds for the primary account for this domain."
}

data "aws_route53_zone" "primary" {
  name = local.primary_name
}

"{data.aws_caller_identity.account.account_id == var.primary_account_id}" ? 0部分上进行了各种语法更改,以使逻辑正常工作,但没有成功。我希望它像区域验证一样抛出一个错误,它将显示我编写的错误消息。相反(取决于语法),它将对正确的帐户按预期工作,并为不正确的帐户抛出一个Error: no matching Route53Zone found错误,或者它将抛出一个完全不同的错误,可能是因为语法搞砸了。

我怎么才能让它工作呢?有可能吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-18 08:02:22

我算出了这个区块:

代码语言:javascript
代码运行次数:0
运行
复制
data "aws_route53_zone" "primary" {
  name = local.primary_name
}

在帐户验证资源块之前运行。添加如下所示的depends_on

代码语言:javascript
代码运行次数:0
运行
复制
data "aws_route53_zone" "primary" {
  name       = local.primary_name
  depends_on = [null_resource.validate_account,
  ]
}

一切都很好。

票数 1
EN

Stack Overflow用户

发布于 2020-02-18 16:46:37

这里的另一个选项可以简化您正在做的事情,即设置区域和帐户约束,以便Terraform将自动使用正确的区域,如果凭据不是用于正确的帐户,则会失败。

您可以在aws提供程序块中对此进行定义。示例如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
provider "aws" {
  region              = "eu-west-1"
  allowed_account_ids = ["123456789012"]
}

现在,如果您尝试使用其他AWS帐户的凭据,则Terraform将在计划阶段失败:

代码语言:javascript
代码运行次数:0
运行
复制
Error: AWS Account ID not allowed: 234567890123
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60269812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档