https://github.com/willfarrell/terraform-public-static-assets-module
Terraform Module: CloudFront, ACM, S3
https://github.com/willfarrell/terraform-public-static-assets-module
Last synced: 5 months ago
JSON representation
Terraform Module: CloudFront, ACM, S3
- Host: GitHub
- URL: https://github.com/willfarrell/terraform-public-static-assets-module
- Owner: willfarrell
- License: mit
- Created: 2017-12-16T17:47:54.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2025-02-04T16:33:27.000Z (over 1 year ago)
- Last Synced: 2025-02-04T17:33:43.201Z (over 1 year ago)
- Language: HCL
- Size: 137 KB
- Stars: 2
- Watchers: 3
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Terraform App Endpoint
Creates CloudFront (w/ WAF and Lambda) and S3 Bucket.
## Setup
### Requirements
- Edge provider in the root.
```hcl-terraform
provider "aws" {
profile = "${local.workspace["profile"]}-${local.workspace["env"]}"
region = "us-east-1"
alias = "edge"
}
```
- ACM Certificate
```hcl-terraform
data "aws_acm_certificate" "main" {
provider = "aws.edge"
domain = "${var.env}-appname.example.com"
statuses = ["ISSUED"]
}
```
- Web Application Firewall (Optional)
```hcl-terraform
module "waf" {
source = "git@github.com:willfarrell/terraform-waf-module"
name = "${local.workspace["name"]}"
defaultAction = "ALLOW"
providers = {
aws = "aws.edge"
}
}
```
### Module
```hcl-terraform
module "logs" {
source = "git@github.com:willfarrell/terraform-s3-logs-module?ref=v0.3.0"
name = "${local.workspace["name"]}-${terraform.workspace}-edge"
tags = {
"Name": "Edge Logs"
}
}
module "app" {
source = "git@github.com:willfarrell/terraform-public-static-assets?ref=v0.2.1"
name = "${var.env}-myapp"
aliases = ["${var.env != "prod" ? "${var.env}-": ""}appname.example.com"]
acm_certificate_arn = data.aws_acm_certificate.main.arn
web_acl_id = module.waf.id
lambda = {
"origin-request" = file("${path.module}/origin-request.js")
"viewer-request" = file("${path.module}/viewer-request.js")
"viewer-response" = file("${path.module}/viewer-response.js")
"origin-response" = file("${path.module}/origin-response.js")
}
error_codes = {
404 = "/404.html"
}
logging_bucket = "${local[terraform.workspace].name}-${terraform.workspace}-edge-logs"
providers = {
aws = "aws.edge"
}
}
```
## Input
- **name:** AWS S3 Bucket name. `${var.env}-${var.name}`.
- **aliases:** CloudFront Aliases.
- **acm_certificate_arn:** Domain Certificate ARN
- **web_acl_id:** WAF ACL ID
- **lambda:** lambda@Edge functions
- **cors_origins:** URL to apply to CORS. [Default: `["*"]`]
- **error_codes:** map of paths for error codes. Defaults: none
- **logging_bucket:** Bucket id for where teh logs should be sent
## Output
- **bucket:** `${aws_s3_bucket.main.id}` Full name of the S3 bucket.
- **id:** `${aws_cloudfront_distribution.main.id}` CloudFront Distribution Id for CI/CD to trigger cache clearing (`aws cloudfront create-invalidation --distribution-id ${AWS_CLOUDFRONT_DISTRIBUTION_ID} --paths /index.html`)
- **domain_name:** `${aws_cloudfront_distribution.main.domain_name}` CloudFront Domain Name for DNS updating.
- **hosted_zone_id:** `${aws_cloudfront_distribution.main.hosted_zone_id}` CloudFront Hosted Zone ID.