Terraform 参考为远程后端创建了 S3 存储桶

Posted

技术标签:

【中文标题】Terraform 参考为远程后端创建了 S3 存储桶【英文标题】:Terraform Reference Created S3 Bucket for Remote Backend 【发布时间】:2021-12-30 09:32:55 【问题描述】:

我正在尝试为 S3 设置远程 Terraform 后端。我能够创建存储桶,但我使用 bucket_prefix 而不是存储桶来定义我的存储桶名称。我这样做是为了确保我的组织内的代码可重用性。

我的问题是我在 Terraform 后端配置中引用新存储桶时遇到了问题。我知道我可以硬编码我创建的存储桶的名称,但我想引用类似于 Terraform 中其他资源的存储桶。

这可能吗?

我在下面包含了我的代码:

#configure terraform to use s3 as the backend
terraform 
   backend "s3" 
      bucket         = "aws_s3_bucket.my-bucket.id"
      key            = "terraform/terraform.tfstate"
      region         = "ca-central-1"    
   

AWS S3 资源定义

resource "aws_s3_bucket" "my-bucket" 
    bucket_prefix = var.bucket_prefix

    acl = var.acl

    lifecycle 
        prevent_destroy = true
    

    versioning 
        enabled = var.versioning
    

    server_side_encryption_configuration 
        rule 
            apply_server_side_encryption_by_default 
               sse_algorithm = var.sse_algorithm
            
        
    

【问题讨论】:

【参考方案1】:

在初始化步骤发生时,Terraform 需要一个有效的后端配置 (terraform init),这意味着您必须拥有一个现有的存储桶才能配置任何资源(在第一个 terraform apply 之前)。

如果您使用不存在的存储桶名称执行terraform init,则会收到此错误:

The referenced S3 bucket must have been previously created. If the S3 bucket
│ was created within the last minute, please wait for a minute or two and try
│ again.

这是不言自明的。将 S3 存储桶用于后端并定义为 Terraform 资源是不可能的。虽然您当然可以使用terraform import 将现有存储桶导入state,但我不建议您导入后端存储桶。

【讨论】:

感谢 Ervin,我了解到在创建 S3 存储桶之前我无法引用后端。相反,我注释掉了后端代码块并应用了 tf 配置。这创建了存储桶,但我想知道是否可以使用“my-bucket.id”符号而不是硬编码存储桶名称来引用存储桶名称。 Terraform 验证不允许在那里使用变量。它将引发此错误:Variables may not be used here. 知道了,我会继续使用硬编码的桶名。作为 Terraform 的新手,我想知道我是否遗漏了什么。感谢您的帮助!

以上是关于Terraform 参考为远程后端创建了 S3 存储桶的主要内容,如果未能解决你的问题,请参考以下文章

使用 s3 后端初始化 terraform 时出现问题 - CredentialRequiresARNError

Terraform init │ 错误:配置 S3 后端时出错:找不到 S3 后端的有效凭证源

在 Terraform 远程后端使用变量

使用 terraform 初始设置 terraform 后端

aws cdk 可以提供远程状态吗?

加密存储在远程后端(如 GCS 存储桶)上的 Terraform 状态是不是有用?