terraform Route53 别名记录不等待 s3 存储桶网站域

问题描述 投票:0回答:1

我正在努力: 1-创建一个存储桶 2-上传静态站点文件到它 3-将存储桶配置为静态网站 4-配置route53将子域转发到存储桶网站,而不是使用来自s3的丑陋url。

terraform 文件已创建,我可以访问该网站。但是,我需要运行 terraform apply 两次: 1-首次运行将创建存储桶、上传站点文件并为静态站点执行所需的存储桶配置。但是route53记录资源会失败并出现错误

 Error: Missing required argument
│
│   with module.ui_site.aws_route53_record.www-a,
│   on modules\UI\route53.tf line 14, in resource "aws_route53_record" "www-a":
│   14:     name                   = aws_s3_bucket.site.website_domain
│
│ The argument "alias.0.name" is required, but no definition was found.

2-第二次运行将创建 Route53 记录。

地形文件:

resource "aws_s3_bucket" "site" {
  bucket = "${var.ui_bucket_name}.${var.root_domain}"
}


resource "aws_s3_bucket_public_access_block" "site" {
  bucket = aws_s3_bucket.site.id

  block_public_acls       = false
  block_public_policy     = false
  ignore_public_acls      = false
  restrict_public_buckets = false
}

resource "aws_s3_bucket_website_configuration" "site" {
  bucket = aws_s3_bucket.site.id

  index_document {
    suffix = "index.html"
  }

  error_document {
    key = "index.html"
  }
}

resource "aws_s3_bucket_ownership_controls" "site" {
  bucket = aws_s3_bucket.site.id
  rule {
    object_ownership = "BucketOwnerPreferred"
  }
}

resource "aws_s3_bucket_acl" "site" {
  bucket = aws_s3_bucket.site.id

  acl = "public-read"
  depends_on = [
    aws_s3_bucket_ownership_controls.site,
    aws_s3_bucket_public_access_block.site
  ]
}


resource "aws_s3_bucket_policy" "site" {
  bucket = aws_s3_bucket.site.id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Sid       = "PublicReadGetObject"
        Effect    = "Allow"
        Principal = "*"
        Action    = "s3:GetObject"
        Resource = [
          aws_s3_bucket.site.arn,
          "${aws_s3_bucket.site.arn}/*",
        ]
      },
    ]
  })

  depends_on = [
    aws_s3_bucket_public_access_block.site
  ]
}


module "template_files" {
  source = "hashicorp/dir/template"

  base_dir = "${path.module}/../../../client_ui/build"

}
resource "aws_s3_object" "site" {
  bucket = aws_s3_bucket.site.bucket
  for_each = module.template_files.files
  key          = each.key
  content_type = each.value.content_type

  # The template_files module guarantees that only one of these two attributes
  # will be set for each file, depending on whether it is an in-memory template
  # rendering result or a static file on disk.
  source  = each.value.source_path
  content = each.value.content

  # Unless the bucket has encryption enabled, the ETag of each object is an
  # MD5 hash of that object.
  etag = each.value.digests.md5
}


#######################################################
#######################################################
#######################################################
## Route53

data "aws_route53_zone" "zone" {
  name         = var.root_domain
  private_zone = false
}


resource "aws_route53_record" "www-a" {
  zone_id = data.aws_route53_zone.zone.zone_id
  name = aws_s3_bucket.site.bucket
  type    = "A"

  alias {
    name                   = aws_s3_bucket.site.website_domain
    zone_id                = aws_s3_bucket.site.hosted_zone_id
    evaluate_target_health = true
  }
  depends_on = [
    aws_s3_bucket_website_configuration.site
  ]
}

我在route53记录的depends on部分尝试了不同的资源:bucketresource、bucket_website资源。

但仍然失败

amazon-web-services amazon-s3 terraform amazon-route53
1个回答
0
投票

而不是

name                   = aws_s3_bucket.site.website_domain

你应该使用

name                   = aws_s3_bucket_website_configuration.site.website_domain
© www.soinside.com 2019 - 2024. All rights reserved.