我将使用外部数据源来创建当前不受支持的AWS资源(AWS Organizations OU) . 我正在做一些创建S3存储桶的测试,因为工作流程类似 . 我正在使用外部数据源来调用bash脚本,并传递参数(例如,桶名称,区域) .

脚本正在检查S3存储桶是否存在,如果不存在,则创建它 . 如果脚本已经存在,则编写该脚本以返回成功等 .

我所看到的是,即使在“terraform plan”阶段也会执行脚本,并且似乎没有传递给脚本的stdin参数或环境变量来指示计划/应用/销毁阶段 . 这可以做/推断吗?理想情况下,脚本将使用“plan”调用,然后在资源已存在时返回 . 然后,如果需要,可以创建“应用”阶段 .

是否有可能在脚本中获得Terraform阶段(计划/应用/销毁)?或者其他方法可以避免在计划阶段完全调用脚本?

提醒一下,最终我并没有尝试创建一个S3存储桶(因为我知道我已经可以在Terraform中做到这一点),我想创建一个Organizations OU,但这是一个更容易测试的工作流程...

调用代码示例:

data "external" "create_bucket" { 
    program = ["bash", "create_bucket.sh"]
    query = { 
        region = "ca-central-1" 
        bucket_name = "mytestbucket" 
    }
}

还尝试使用local-exec:

当我有以下调用代码时:

variable "bucket_name_list" {
    type = "list"
    default = ["neilp-dummylist-1","neilp-dummylist-2",
               "neilp-dummylist-3"]
}

module "local" {
    source           = "../local"
    bucket_name_list = ["${var.bucket_name_list}"]
    bucket_region    = "ca-central-1"
}

随着模块:

resource "null_resource" "test" {
    count = "${length(var.bucket_name_list)}"

    provisioner "local-exec" {
        command = "aws s3api create-bucket 
                       --bucket 
                         ${element(var.bucket_name_list, count.index)} 
                       --create-bucket-configuration
                         LocationConstraint=${var.bucket_region}"
    }
}

这里的问题是,它只跟踪 bucket_name_list 中的条目数,如果我更改了一个值但保持条目数相同,则不会注意到 .