【问题标题】:How to update an existing cloudflare_record in terraform and github actions如何在 terraform 和 github 操作中更新现有的 cloudflare_record
【发布时间】:2021-11-08 08:20:41
【问题描述】:

我使用 Hashicorp 教程“使用 S3 和 Cloudflare 托管静态网站”中的代码创建了我的项目,但该教程没有提及 github 操作。因此,当我将项目放入 github 操作时,即使 terraform plan 和 terraform 在本地成功应用输出,我也会在 terraform apply 上遇到错误:

Error: expected DNS record to not already be present but already exists

 with cloudflare_record.site_cname ...
 with cloudflare_record.www

我的 main.tf 中有两个资源,一个用于站点域,一个用于 www,如下所示:

resource "cloudflare_record" "site_cname"  {
zone_id = data.cloudflare_zones.domain.zones[0].id
name    = var.site_domain
value   = aws_s3_bucket.site.website_endpoint
type    = "CNAME"
ttl     = 1
proxied = true
}

resource "cloudflare_record" "www" {
zone_id = data.cloudflare_zones.domain.zones[0].id
name    = "www"
value   = var.site_domain
type    = "CNAME"

ttl     = 1
proxied = true
}

如果我从 main.tf 中删除这些代码行,然后在本地运行 terraform apply,我会收到警告说这会破坏我的资源。

我应该怎么做?

  1. 在某处添加 allow_overwrite(在文档中看不到如何使用它的示例)以及我尝试添加它的方式会产生错误。
  2. 从 main.tf 中删除代码行知道运行 github 操作将破坏我的 cloudflare_record.www 和 cloudflare_record.site_cname 知道如果我登录到 cloudflare 可以看到我的区域 id 和 CNAME,所以之后可能不需要此代码初始设置
  3. 在某处运行 terrform 导入?如果是这样,我在哪里可以找到区域 ID 和记录 ID

还是别的什么?

【问题讨论】:

    标签: terraform cloudflare terraform-provider-aws


    【解决方案1】:

    您的 terraform 状态在哪里?您将其存储在本地还是远程位置?

    因为它会解释为什么你在本地没有任何问题,以及为什么它会尝试在 Github 操作中重新创建资源。

    关于 terraform 后端(存储状态的位置)的更多信息 -> https://www.terraform.io/docs/language/settings/backends/index.html

    以及如何使用 S3 创建一个例如 -> https://www.terraform.io/docs/language/settings/backends/s3.html

    【讨论】:

    • 这些是非常有用的链接,我今天将通过它们。我对 terraform state 的了解肯定不够。
    • 这如何解决 OP 的问题?!​​
    【解决方案2】:

    如果 Terraform 会删除并重新创建 DNS 记录,这应该不是问题,但为了获得更好的结果,您需要确保 GitHub Actions 可以访问(当前)工作区状态。

    由于 Terraform Cloud 提供免费计划,因此没有理由不利用它。只需通过他们的仪表板创建一个工作区,将“远程”后端配置添加到您的项目并确保 GitHub Actions 在运行时使用 Terraform API 令牌(您可以通过 GitHub 存储库设置 > Secrets 进行设置)。

    您可能想查看此示例 — Terraform Starter Kit

    • infra/backend.tf
    • infra/dns-records.tf
    • scripts/tf.js

    您可以通过以下方式将 Terraform API 令牌从 secrets.TERRAFORM_API_TOKEN GitHub 机密传递到 Terraform CLI:

    - env: { TERRAFORM_API_TOKEN: "${{ secrets.TERRAFORM_API_TOKEN }}" }
      run: |
        echo "credentials \"app.terraform.io\" { token = \"$TERRAFORM_API_TOKEN\" }" > ./.terraformrc
    
      
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-21
      • 2020-02-07
      • 1970-01-01
      • 2022-08-23
      • 2022-01-13
      • 2021-04-08
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多