Terraform调用模块创建S3静态网站报找不到index.html文件错误
Terraform自定义模块创建S3静态网站时报文件找不到错误排查
报错信息
Error: Error opening S3 bucket object source (index.html): open index.html: The system cannot find the file specified.
项目目录结构
- Terraform
- My-Module
- main.tf
- index.html
- Use-My-Module
- c1-main.tf
- My-Module
现有配置
My-Module/main.tf
resource "aws_s3_bucket" "mybucket" { bucket = "tf-static-web-test" force_destroy = true } resource "aws_s3_bucket_acl" "bucket-acl" { acl = "public-read" bucket = aws_s3_bucket.mybucket.id } resource "aws_s3_bucket_policy" "bucket-policy" { bucket = aws_s3_bucket.mybucket.id policy = "..." } resource "aws_s3_bucket_object" "s3object" { bucket = aws_s3_bucket.mybucket.id content_type = "text/html" key = "index.html" source = "index.html" } resource "aws_s3_bucket_website_configuration" "website" { bucket = aws_s3_bucket.mybucket.id index_document { suffix = "index.html" } error_document { key = "error.html" } }
Use-My-Module/c1-main.tf
module "my_static_website" { source = "../My-Module" }
注:Use-My-Module目录下同时存放了provider配置与Terraform基础块配置文件
报错根因
Terraform解析文件相对路径时,默认以执行terraform plan/terraform apply命令的工作目录(即当前执行命令的Use-My-Module目录)为基准,不会以模块文件自身所在的My-Module目录为基准。
配置中写source = "index.html"时,Terraform会去Use-My-Module目录下查找index.html,但该文件实际存放在My-Module目录下,因此触发文件不存在报错。
另外当前配置声明了错误页为error.html,但没有对应的上传资源逻辑,修复完index.html的问题后还会触发同类报错,需要同步处理。
修复方案
修改My-Module/main.tf里aws_s3_bucket_object.s3object资源的source参数,使用Terraform内置的path.module常量——该常量永远指向当前配置文件所属模块的所在目录,和执行命令的工作目录无关:
resource "aws_s3_bucket_object" "s3object" { bucket = aws_s3_bucket.mybucket.id content_type = "text/html" key = "index.html" # 替换原有的相对路径写法 source = "${path.module}/index.html" }
如果后续需要支持自定义上传的首页、错误页文件,可以把文件路径定义为模块的输入变量,在调用模块时按需传入对应路径即可,不需要把静态文件固定放在模块目录内。
内容的提问来源于stack exchange,提问作者Sarat Kota
相关产品推荐
相关产品推荐

