我正在努力: 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资源。
但仍然失败
而不是
name = aws_s3_bucket.site.website_domain
你应该使用
name = aws_s3_bucket_website_configuration.site.website_domain