仅在不存在的情况下如何创建Terraform资源

时间:2019-12-21 17:38:32

标签: amazon-web-services aws-lambda terraform terraform-provider-aws

我正在使用Terraform在AWS中创建角色。由于IAM是非区域服务,因此我只想创建一次角色。因此,每当我运行Terraform时,都应检查该角色是否已经存在,如果不存在,则应创建一个。

data "aws_iam_role" "iam_role_check" {
  name = "some_role"
}

resource "aws_iam_role" "iam_role" {
  count= "${data.aws_iam_role.iam_role_check != "null" ? 0 : 1}"
  name = "some_role"

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF
}

data.aws_iam_role.iam_role_check:刷新状态...

  

错误:读取IAM角色时出错(some_role):NoSuchEntity:具有   找不到名称some_role。状态码:404,请求ID:

3 个答案:

答案 0 :(得分:1)

没有已知的方法,因为它是设计原理,请参见this GitHub issue

我认为创建所需数量的角色没有错。您可以在角色名称中包括一些与众不同的位,例如部署名称或环境。您可能还希望将一些通用配置与其他“通用” terraform部署分开,并仅在其他位置使用数据源。

如果无法为同一事物提供多个实例(例如AWSServiceRoleForAmazonElasticsearchService for the Amazon Elasticsearch Service),例如,如果应该在其terraform Elasticsearch module中创建角色或不创建角色,则Cloud Posse会做一个简单的变量,在README.md中搜索create_iam_service_linked_role。

答案 1 :(得分:1)

我认为这种情况下最简单的解决方案是仅为共享资源创建一个单独的状态,然后在对其他状态运行应用之前先对其应用运行

答案 2 :(得分:0)

我有类似的问题。我写了一个Python脚本来检查IAM角色是否存在。基于此,它将在tfvar文件中设置计数变量值(0/1)。 只有地形,这是无法实现的。