使用Terraform在CloudFront中添加BASIC认证
使用Terraform创建CloudFront Functions,并添加基本身份验证到CloudFront的方法。
使用 terraform 的 template_file 插件,可以接收变量并进行展开,非常方便。
variable basic_user { default = "basic_user" }
variable basic_password { default = "basic_password" }
variable unauthorized_message { default = "Unauthorized" }
data template_file basic_auth {
template = file("${path.module}/function.js")
vars = {
basic_auth_string = base64encode("${var.basic_user}:${var.basic_password}")
unauthorized_message = var.unauthorized_message
}
}
如果以类似的方式编写function.js,可以通过terraform的variables对basic_auth_string和unauthorized_message进行动态设置。
function handler(event) {
var request = event.request;
var headers = request.headers;
var authString = "Basic ${basic_auth_string}";
if (
typeof headers.authorization === "undefined" ||
headers.authorization.value !== authString
) {
return {
statusCode: 401,
statusDescription: "${unauthorized_message}",
headers: { "www-authenticate": { value: "Basic" } }
};
}
return request;
}
使用 aws_cloudfront_function 资源来创建 CloudFront 函数。
variable function_name { default = "basic_auth" }
variable runtime { default = "cloudfront-js-1.0" }
variable comment { default = "" }
resource aws_cloudfront_function basic_auth {
name = var.function_name
runtime = var.runtime
comment = var.comment
publish = true
code = data.template_file.basic_auth.rendered
}
要将某个函数与CloudFront关联起来,需要在ordered_cache_behavior或default_cache_behavior中添加function_association。
default_cache_behavior {
:
function_association {
event_type = "viewer-request"
function_arn = aws_cloudfront_function.basic_auth.arn
}
}
CloudFront Functions的代碼參考了以下文章。我們嘗試在每個環境中使用Terraform來啟用/禁用CloudFront Functions。