{"id":19107132,"url":"https://github.com/govtechsg/terraform-s3-cloudfront-website","last_synced_at":"2026-06-18T03:33:29.827Z","repository":{"id":37884873,"uuid":"420351502","full_name":"GovTechSG/terraform-s3-cloudfront-website","owner":"GovTechSG","description":null,"archived":false,"fork":false,"pushed_at":"2025-07-14T10:32:29.000Z","size":132,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":53,"default_branch":"master","last_synced_at":"2025-07-14T12:31:48.650Z","etag":null,"topics":["terraform"],"latest_commit_sha":null,"homepage":"","language":"HCL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GovTechSG.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-10-23T08:05:00.000Z","updated_at":"2025-07-14T10:32:20.000Z","dependencies_parsed_at":"2025-01-03T03:12:40.745Z","dependency_job_id":"2a49ad15-702c-4a52-9152-cf2c20a43013","html_url":"https://github.com/GovTechSG/terraform-s3-cloudfront-website","commit_stats":null,"previous_names":[],"tags_count":43,"template":false,"template_full_name":null,"purl":"pkg:github/GovTechSG/terraform-s3-cloudfront-website","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GovTechSG%2Fterraform-s3-cloudfront-website","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GovTechSG%2Fterraform-s3-cloudfront-website/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GovTechSG%2Fterraform-s3-cloudfront-website/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GovTechSG%2Fterraform-s3-cloudfront-website/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GovTechSG","download_url":"https://codeload.github.com/GovTechSG/terraform-s3-cloudfront-website/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GovTechSG%2Fterraform-s3-cloudfront-website/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34475375,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-18T02:00:06.871Z","response_time":128,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["terraform"],"created_at":"2024-11-09T04:11:23.912Z","updated_at":"2026-06-18T03:33:29.813Z","avatar_url":"https://github.com/GovTechSG.png","language":"HCL","funding_links":[],"categories":[],"sub_categories":[],"readme":"# s3-cloudfront-website\n\nCreates a cloudfront distribution website using s3 bucket website configuration for static file hosting.\n\n## Diagram\n\n![architecture diagram](diagram.png)\n\n## Upgrade notes\n\n### v1.x.x to v2.x.x upgrade\n\nTake note of the breaking changes from [AWS v4 upgrade guid e](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/version-4-upgrade#s3-bucket-refactor)\n\nYou will have to run terraform import, e.g replace var.domain_name[0] with your host name `terraform import aws_s3_bucket_logging var.domain_name[0]` for each of the following.\n- `aws_s3_bucket_acl`\n- `aws_s3_bucket_logging`\n- `aws_s3_bucket_policy`\n- `aws_s3_bucket_server_side_encryption_configuration`\n- `aws_s3_bucket_versioning`\n- `aws_s3_bucket_website_configuration`\n\n### v3.x.x to v5.x.x upgrade\n\nIn order to remove the lambda redirection and fully rely on cloudfront and s3 to handle it, there needs to be a point the local provider is available during deletion, therefore you need to upgrade to v4.0.0 that removes the lambda successfully, before upgrading to v5.x.x that will handle redirects without lambda\n\n## Adding CSP headers\n\n### Basic CSP Configuration\n\nX headers are returned by default, to customise the content security policy, format it in terraform and provide the full string to the variable `content_security_policy`\n\n### Experimental: CSP with Nonce Support\n\nThis module includes an experimental feature to inject nonces into your Content Security Policy and HTML content. This is useful when you need to use inline scripts or styles while maintaining a strict CSP. To enable this feature:\n\n1. Set `enable_nonce = true` in your module configuration\n2. Configure nonce injection behavior using `nonce_injection_config`:\n   ```hcl\n   nonce_injection_config = {\n     inject_script_nonces = true  # Enable nonce injection for \u003cscript\u003e tags\n     inject_style_nonces  = true  # Enable nonce injection for \u003cstyle\u003e and \u003clink\u003e tags\n   }\n   ```\n3. Ensure your CSP includes the appropriate nonce placeholders where needed:\n   - For scripts: `'nonce-%%{SCRIPT_NONCE}%%'`\n   - For styles: `'nonce-%%{STYLE_NONCE}%%'`\n\n**Example Configuration:**\n```hcl\nmodule \"cloudfront\" {\n  source = \"...\"\n  \n  enable_nonce = true\n  nonce_injection_config = {\n    inject_script_nonces = true\n    inject_style_nonces  = true\n  }\n  content_security_policy = \"default-src 'none'; script-src 'self' 'strict-dynamic' 'nonce-%%{SCRIPT_NONCE}%%'; style-src 'self' 'nonce-%%{STYLE_NONCE}%%'; img-src 'self'\"\n}\n```\n\n**Important Notes:**\n- This feature is experimental and should only be enabled if you specifically need nonce support in your CSP\n- Nonces cannot be automatically injected into dynamically loaded content (e.g., JavaScript-injected scripts or styles)\n- The feature uses Lambda@Edge which may add latency to your requests\n- Only works with HTML files and requires proper Content-Type headers\n- For Angular applications, also injects `ngCspNonce` attribute on the `\u003capp-root\u003e` element when script nonces are enabled\n\n### Custom Error Responses\n\nThis module supports configurable custom error responses for CloudFront distributions. This allows you to customize how different HTTP error codes are handled, such as serving custom error pages or routing all errors to your SPA's index.html file.\n\nBy default, the module is configured for Single Page Applications (SPAs) and will route common error codes (400, 403, 404, 500, 503) to `/index.html` with a 200 response code.\n\n**Example Configuration for SPA:**\n```hcl\nmodule \"cloudfront\" {\n  source = \"...\"\n  \n  # Default configuration routes all errors to index.html for SPAs\n  # No additional configuration needed\n}\n```\n\n**Example Configuration for Custom Error Pages:**\n```hcl\nmodule \"cloudfront\" {\n  source = \"...\"\n  \n  custom_error_responses = [\n    {\n      error_code         = 404\n      response_code      = 404\n      response_page_path = \"/error/404.html\"\n    },\n    {\n      error_code         = 500\n      response_code      = 500\n      response_page_path = \"/error/500.html\"\n    }\n  ]\n}\n```\n\n**Example Configuration for Mixed Approach:**\n```hcl\nmodule \"cloudfront\" {\n  source = \"...\"\n  \n  custom_error_responses = [\n    {\n      error_code         = 403\n      response_code      = 200\n      response_page_path = \"/index.html\"\n    },\n    {\n      error_code         = 404\n      response_code      = 404\n      response_page_path = \"/error/404.html\"\n    }\n  ]\n}\n```\n\n```\nlocals {\n  default-src = join(\" \", [\"default-src\", \"'none'\"])\n  connect-src = join(\" \", [\"connect-src\", \"https://*.example.com\"])\n  font-src = join(\" \", [\"font-src\", \"'self'\"])\n  img-src = join(\" \", [\"img-src\", \"'self'\"])\n  script-src = join(\" \", [\"script-src\", \"'self'\"])\n  style-src = join(\" \", [\"style-src\", \"'self'\", \"'unsafe-inline'\"])\n  object-src = join(\" \", [\"object-src\", \"'none'\"])\n\n  content_security_policy = join( \"; \", [local.default-src, local.connect-src, local.font-src, local.img-src, local.script-src, local.style-src, local.object-src])\n}\n\nmodule \"cloudfront\" {\n  ...\n  content_security_policy = local.content_security_policy\n  ...\n}\n```## Requirements\n\n| Name | Version |\n|------|---------|\n| \u003ca name=\"requirement_local\"\u003e\u003c/a\u003e [local](#requirement\\_local) | ~\u003e 2.1 |\n\n## Providers\n\n| Name | Version |\n|------|---------|\n| \u003ca name=\"provider_archive\"\u003e\u003c/a\u003e [archive](#provider\\_archive) | n/a |\n| \u003ca name=\"provider_aws\"\u003e\u003c/a\u003e [aws](#provider\\_aws) | n/a |\n| \u003ca name=\"provider_aws.us-east-1\"\u003e\u003c/a\u003e [aws.us-east-1](#provider\\_aws.us-east-1) | n/a |\n| \u003ca name=\"provider_local\"\u003e\u003c/a\u003e [local](#provider\\_local) | ~\u003e 2.1 |\n| \u003ca name=\"provider_null\"\u003e\u003c/a\u003e [null](#provider\\_null) | n/a |\n\n## Modules\n\nNo modules.\n\n## Resources\n\n| Name | Type |\n|------|------|\n| [aws_acm_certificate.cert](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/acm_certificate) | resource |\n| [aws_acm_certificate_validation.cert](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/acm_certificate_validation) | resource |\n| [aws_cloudfront_distribution.web_dist](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudfront_distribution) | resource |\n| [aws_cloudfront_distribution.web_redirect](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudfront_distribution) | resource |\n| [aws_cloudfront_origin_access_control.main](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudfront_origin_access_control) | resource |\n| [aws_cloudfront_origin_access_identity.origin_access_identity](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudfront_origin_access_identity) | resource |\n| [aws_cloudfront_response_headers_policy.web_dist](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudfront_response_headers_policy) | resource |\n| [aws_cloudwatch_log_group.nonce_injector](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_log_group) | resource |\n| [aws_iam_role.lambda_edge](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |\n| [aws_iam_role_policy.lambda_edge_s3](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy) | resource |\n| [aws_iam_role_policy_attachment.lambda_edge_basic](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource |\n| [aws_lambda_function.nonce_injector](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function) | resource |\n| [aws_route53_record.cert_validation](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_record) | resource |\n| [aws_route53_record.redirect](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_record) | resource |\n| [aws_route53_record.www](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_record) | resource |\n| [aws_s3_bucket.main](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket) | resource |\n| [aws_s3_bucket.redirect](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket) | resource |\n| [aws_s3_bucket_logging.main](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_logging) | resource |\n| [aws_s3_bucket_logging.redirect](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_logging) | resource |\n| [aws_s3_bucket_ownership_controls.main](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_ownership_controls) | resource |\n| [aws_s3_bucket_ownership_controls.redirect](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_ownership_controls) | resource |\n| [aws_s3_bucket_policy.main](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_policy) | resource |\n| [aws_s3_bucket_policy.redirect](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_policy) | resource |\n| [aws_s3_bucket_public_access_block.public_access_block_main](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_public_access_block) | resource |\n| [aws_s3_bucket_public_access_block.public_access_block_redirect](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_public_access_block) | resource |\n| [aws_s3_bucket_server_side_encryption_configuration.main](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_server_side_encryption_configuration) | resource |\n| [aws_s3_bucket_server_side_encryption_configuration.redirect](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_server_side_encryption_configuration) | resource |\n| [aws_s3_bucket_versioning.main](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_versioning) | resource |\n| [aws_s3_bucket_versioning.redirect](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_versioning) | resource |\n| [aws_s3_bucket_website_configuration.main](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_website_configuration) | resource |\n| [aws_s3_bucket_website_configuration.redirect](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_website_configuration) | resource |\n| [local_file.nonce_injector](https://registry.terraform.io/providers/hashicorp/local/latest/docs/resources/file) | resource |\n| [null_resource.nonce_injector_deps](https://registry.terraform.io/providers/hashicorp/null/latest/docs/resources/resource) | resource |\n| [archive_file.nonce_injector](https://registry.terraform.io/providers/hashicorp/archive/latest/docs/data-sources/file) | data source |\n| [aws_caller_identity.current](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/caller_identity) | data source |\n| [aws_iam_policy_document.bucket_policy](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document) | data source |\n| [aws_iam_policy_document.bucket_policy_redirect](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document) | data source |\n\n## Inputs\n\n| Name | Description | Type | Default | Required |\n|------|-------------|------|---------|:--------:|\n| \u003ca name=\"input_cloudfront_origin_path\"\u003e\u003c/a\u003e [cloudfront\\_origin\\_path](#input\\_cloudfront\\_origin\\_path) | Origin path of CloudFront | `string` | `\"\"` | no |\n| \u003ca name=\"input_content_security_policy\"\u003e\u003c/a\u003e [content\\_security\\_policy](#input\\_content\\_security\\_policy) | Default Content Security Policy to use when no custom CSP is provided in request headers | `string` | `\"default-src 'none'; img-src 'self'; script-src 'self' 'nonce-%{SCRIPT_NONCE}%%'; style-src 'self' 'nonce-%{STYLE_NONCE}%%'; object-src 'none'\"` | no |\n| \u003ca name=\"input_cors_allowed_origins\"\u003e\u003c/a\u003e [cors\\_allowed\\_origins](#input\\_cors\\_allowed\\_origins) | CORS allowed origins | `list(string)` | `[]` | no |\n| \u003ca name=\"input_domain_names\"\u003e\u003c/a\u003e [domain\\_names](#input\\_domain\\_names) | domain names to serve site on | `list(string)` | n/a | yes |\n| \u003ca name=\"input_enable_acm_validation\"\u003e\u003c/a\u003e [enable\\_acm\\_validation](#input\\_enable\\_acm\\_validation) | Validates ACM by updating route 53 DNS | `bool` | `false` | no |\n| \u003ca name=\"input_enable_compression\"\u003e\u003c/a\u003e [enable\\_compression](#input\\_enable\\_compression) | Toggle whether the default cache behaviour has compression enabled | `bool` | `true` | no |\n| \u003ca name=\"input_enable_nonce\"\u003e\u003c/a\u003e [enable\\_nonce](#input\\_enable\\_nonce) | Enable nonce injection feature. This controls whether the Lambda function is deployed and associated with CloudFront. | `bool` | `false` | no |\n| \u003ca name=\"input_forward_query_string\"\u003e\u003c/a\u003e [forward\\_query\\_string](#input\\_forward\\_query\\_string) | forward query strings to origin | `bool` | `false` | no |\n| \u003ca name=\"input_lambda_function_associations\"\u003e\u003c/a\u003e [lambda\\_function\\_associations](#input\\_lambda\\_function\\_associations) | CloudFront Lambda function associations. key is CloudFront event type and value is an object with 'arn' (Lambda function ARN with version) and 'include\\_body' (whether to include request/response body) fields. For nonce injection, this is automatically populated with the nonce-injector Lambda. | \u003cpre\u003emap(object({\u003cbr\u003e    arn = string\u003cbr\u003e    include_body = bool\u003cbr\u003e  }))\u003c/pre\u003e | `{}` | no |\n| \u003ca name=\"input_main_default_ttl\"\u003e\u003c/a\u003e [main\\_default\\_ttl](#input\\_main\\_default\\_ttl) | default TTL of the main cloudfront distribution | `number` | `180` | no |\n| \u003ca name=\"input_nonce_injection_config\"\u003e\u003c/a\u003e [nonce\\_injection\\_config](#input\\_nonce\\_injection\\_config) | Configuration for nonce injection when enable\\_nonce is true. Determines which types of tags receive nonces. | \u003cpre\u003eobject({\u003cbr\u003e    inject_script_nonces = bool\u003cbr\u003e    inject_style_nonces  = bool\u003cbr\u003e  })\u003c/pre\u003e | \u003cpre\u003e{\u003cbr\u003e  \"inject_script_nonces\": true,\u003cbr\u003e  \"inject_style_nonces\": true\u003cbr\u003e}\u003c/pre\u003e | no |\n| \u003ca name=\"input_ordered_cache_behaviors\"\u003e\u003c/a\u003e [ordered\\_cache\\_behaviors](#input\\_ordered\\_cache\\_behaviors) | Ordered cache behaviors with Lambda function associations | \u003cpre\u003elist(object({\u003cbr\u003e    path                  = string\u003cbr\u003e    lambda_function_associations = map(object({\u003cbr\u003e      arn = string\u003cbr\u003e      include_body = bool\u003cbr\u003e    }))\u003cbr\u003e  }))\u003c/pre\u003e | `[]` | no |\n| \u003ca name=\"input_permissions_boundary\"\u003e\u003c/a\u003e [permissions\\_boundary](#input\\_permissions\\_boundary) | If provided, all IAM roles will be created with this permissions boundary attached. | `string` | `\"\"` | no |\n| \u003ca name=\"input_redirect_domain_names\"\u003e\u003c/a\u003e [redirect\\_domain\\_names](#input\\_redirect\\_domain\\_names) | domain names to redirect to `domain_names` | `list(string)` | n/a | yes |\n| \u003ca name=\"input_route53_zone_id\"\u003e\u003c/a\u003e [route53\\_zone\\_id](#input\\_route53\\_zone\\_id) | Route53 Zone ID | `string` | `\"\"` | no |\n| \u003ca name=\"input_s3_logging_bucket\"\u003e\u003c/a\u003e [s3\\_logging\\_bucket](#input\\_s3\\_logging\\_bucket) | Bucket which will store s3 access logs | `string` | `\"\"` | no |\n| \u003ca name=\"input_s3_logging_bucket_prefix\"\u003e\u003c/a\u003e [s3\\_logging\\_bucket\\_prefix](#input\\_s3\\_logging\\_bucket\\_prefix) | Bucket which will store s3 access logs | `string` | `\"\"` | no |\n| \u003ca name=\"input_save_access_log\"\u003e\u003c/a\u003e [save\\_access\\_log](#input\\_save\\_access\\_log) | whether save cloudfront access log to S3 | `bool` | `false` | no |\n| \u003ca name=\"input_service_name\"\u003e\u003c/a\u003e [service\\_name](#input\\_service\\_name) | tagged with service name | `any` | n/a | yes |\n| \u003ca name=\"input_web_acl_id\"\u003e\u003c/a\u003e [web\\_acl\\_id](#input\\_web\\_acl\\_id) | WAF ACL to attach to the cloudfront distribution | `string` | `\"\"` | no |\n\n## Outputs\n\n| Name | Description |\n|------|-------------|\n| \u003ca name=\"output_acm_arn\"\u003e\u003c/a\u003e [acm\\_arn](#output\\_acm\\_arn) | ARN of acm certificate |\n| \u003ca name=\"output_aws_cloudfront_response_headers_policy_cors_config\"\u003e\u003c/a\u003e [aws\\_cloudfront\\_response\\_headers\\_policy\\_cors\\_config](#output\\_aws\\_cloudfront\\_response\\_headers\\_policy\\_cors\\_config) | n/a |\n| \u003ca name=\"output_aws_cloudfront_response_headers_policy_custom_headers_config\"\u003e\u003c/a\u003e [aws\\_cloudfront\\_response\\_headers\\_policy\\_custom\\_headers\\_config](#output\\_aws\\_cloudfront\\_response\\_headers\\_policy\\_custom\\_headers\\_config) | n/a |\n| \u003ca name=\"output_aws_cloudfront_response_headers_policy_security_headers_config\"\u003e\u003c/a\u003e [aws\\_cloudfront\\_response\\_headers\\_policy\\_security\\_headers\\_config](#output\\_aws\\_cloudfront\\_response\\_headers\\_policy\\_security\\_headers\\_config) | n/a |\n| \u003ca name=\"output_cache_invalidation_command\"\u003e\u003c/a\u003e [cache\\_invalidation\\_command](#output\\_cache\\_invalidation\\_command) | CloudFront edge cache invalidation command. /path/to/invalidation/resource is like /index.html /error.html |\n| \u003ca name=\"output_cache_invalidation_redirect_command\"\u003e\u003c/a\u003e [cache\\_invalidation\\_redirect\\_command](#output\\_cache\\_invalidation\\_redirect\\_command) | CloudFront edge cache invalidation command. /path/to/invalidation/resource is like /index.html /error.html |\n| \u003ca name=\"output_cloudfront_distribution_main_arn\"\u003e\u003c/a\u003e [cloudfront\\_distribution\\_main\\_arn](#output\\_cloudfront\\_distribution\\_main\\_arn) | ARN of cloudfront distribution |\n| \u003ca name=\"output_cloudfront_distribution_main_domain_name\"\u003e\u003c/a\u003e [cloudfront\\_distribution\\_main\\_domain\\_name](#output\\_cloudfront\\_distribution\\_main\\_domain\\_name) | Domain URL of cloudfront distribution |\n| \u003ca name=\"output_cloudfront_distribution_main_etag\"\u003e\u003c/a\u003e [cloudfront\\_distribution\\_main\\_etag](#output\\_cloudfront\\_distribution\\_main\\_etag) | ETag of cloudfront distribution |\n| \u003ca name=\"output_cloudfront_distribution_main_hosted_zone_id\"\u003e\u003c/a\u003e [cloudfront\\_distribution\\_main\\_hosted\\_zone\\_id](#output\\_cloudfront\\_distribution\\_main\\_hosted\\_zone\\_id) | hosted zone id of cloudfront distribution |\n| \u003ca name=\"output_cloudfront_distribution_redirect_arn\"\u003e\u003c/a\u003e [cloudfront\\_distribution\\_redirect\\_arn](#output\\_cloudfront\\_distribution\\_redirect\\_arn) | ARN of cloudfront distribution |\n| \u003ca name=\"output_cloudfront_distribution_redirect_domain_name\"\u003e\u003c/a\u003e [cloudfront\\_distribution\\_redirect\\_domain\\_name](#output\\_cloudfront\\_distribution\\_redirect\\_domain\\_name) | Domain URL of cloudfront distribution |\n| \u003ca name=\"output_cloudfront_distribution_redirect_etag\"\u003e\u003c/a\u003e [cloudfront\\_distribution\\_redirect\\_etag](#output\\_cloudfront\\_distribution\\_redirect\\_etag) | ETag of cloudfront distribution |\n| \u003ca name=\"output_cloudfront_distribution_redirect_hosted_zone_id\"\u003e\u003c/a\u003e [cloudfront\\_distribution\\_redirect\\_hosted\\_zone\\_id](#output\\_cloudfront\\_distribution\\_redirect\\_hosted\\_zone\\_id) | hosted zone id of cloudfront distribution |\n| \u003ca name=\"output_s3_main_arn\"\u003e\u003c/a\u003e [s3\\_main\\_arn](#output\\_s3\\_main\\_arn) | ARN of s3 hosting index.html of site |\n| \u003ca name=\"output_s3_main_website_domain\"\u003e\u003c/a\u003e [s3\\_main\\_website\\_domain](#output\\_s3\\_main\\_website\\_domain) | n/a |\n| \u003ca name=\"output_s3_main_website_endpoint\"\u003e\u003c/a\u003e [s3\\_main\\_website\\_endpoint](#output\\_s3\\_main\\_website\\_endpoint) | n/a |\n| \u003ca name=\"output_s3_redirec_website_endpoint\"\u003e\u003c/a\u003e [s3\\_redirec\\_website\\_endpoint](#output\\_s3\\_redirec\\_website\\_endpoint) | n/a |\n| \u003ca name=\"output_s3_redirect_arn\"\u003e\u003c/a\u003e [s3\\_redirect\\_arn](#output\\_s3\\_redirect\\_arn) | ARN of s3 hosting redirection to www. |\n| \u003ca name=\"output_s3_redirect_website_domain\"\u003e\u003c/a\u003e [s3\\_redirect\\_website\\_domain](#output\\_s3\\_redirect\\_website\\_domain) | n/a |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgovtechsg%2Fterraform-s3-cloudfront-website","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgovtechsg%2Fterraform-s3-cloudfront-website","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgovtechsg%2Fterraform-s3-cloudfront-website/lists"}