代码之家  ›  专栏  ›  技术社区  ›  ahmad alzamer

terraform route53别名记录不等待s3 bucket网站域

  •  1
  • ahmad alzamer  · 技术社区  · 2 年前

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

    地形文件被创建,我可以访问网站。然而,我需要运行两次地形应用程序: 1-第一次运行将创建bucket,上传站点文件,并为静态站点进行所需的bucket配置。但是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
      ]
    }
    

    我在路由53记录的依赖部分尝试了不同的资源:bucketresource、bucket_website resource。

    但它仍在失败

    1 回复  |  直到 2 年前
        1
  •  1
  •   Marcin    2 年前

    而不是

    name                   = aws_s3_bucket.site.website_domain
    

    你应该使用

    name                   = aws_s3_bucket_website_configuration.site.website_domain