使用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。

广告
将在 10 秒后关闭
bannerAds