mirror of
https://github.com/projecthorus/sondehub-infra.git
synced 2024-12-20 21:53:11 +00:00
add redirect and CDN parts
This commit is contained in:
parent
9cf9289f8f
commit
831da1cfc3
618
cdn.tf
Normal file
618
cdn.tf
Normal file
@ -0,0 +1,618 @@
|
|||||||
|
# manages the short codes
|
||||||
|
|
||||||
|
data "archive_file" "redirect" {
|
||||||
|
type = "zip"
|
||||||
|
source_file = "redirect/index.js"
|
||||||
|
output_path = "${path.module}/build/redirect.zip"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
resource "aws_lambda_function" "redirect" {
|
||||||
|
function_name = "sondehub-redirect"
|
||||||
|
handler = "index.handler"
|
||||||
|
filename = "${path.module}/build/redirect.zip"
|
||||||
|
source_code_hash = data.archive_file.redirect.output_base64sha256
|
||||||
|
publish = true
|
||||||
|
memory_size = 128
|
||||||
|
role = aws_iam_role.basic_lambda_role.arn
|
||||||
|
runtime = "nodejs14.x"
|
||||||
|
timeout = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
resource "aws_route53_record" "testing_A" {
|
||||||
|
name = "testing"
|
||||||
|
type = "A"
|
||||||
|
alias {
|
||||||
|
name = aws_cloudfront_distribution.testing.domain_name
|
||||||
|
zone_id = aws_cloudfront_distribution.testing.hosted_zone_id
|
||||||
|
evaluate_target_health = false
|
||||||
|
}
|
||||||
|
zone_id = aws_route53_zone.Route53HostedZone.zone_id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route53_record" "testing_AAAA" {
|
||||||
|
name = "testing"
|
||||||
|
type = "AAAA"
|
||||||
|
alias {
|
||||||
|
name = aws_cloudfront_distribution.testing.domain_name
|
||||||
|
zone_id = aws_cloudfront_distribution.testing.hosted_zone_id
|
||||||
|
evaluate_target_health = false
|
||||||
|
}
|
||||||
|
zone_id = aws_route53_zone.Route53HostedZone.zone_id
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
resource "aws_route53_record" "root_A" {
|
||||||
|
name = ""
|
||||||
|
allow_overwrite = true
|
||||||
|
type = "A"
|
||||||
|
alias {
|
||||||
|
name = aws_cloudfront_distribution.sondehub.domain_name
|
||||||
|
zone_id = aws_cloudfront_distribution.sondehub.hosted_zone_id
|
||||||
|
evaluate_target_health = false
|
||||||
|
}
|
||||||
|
zone_id = "Z0756308IVLVF48G6G1S"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route53_record" "root_AAAA" {
|
||||||
|
name = ""
|
||||||
|
allow_overwrite = true
|
||||||
|
type = "AAAA"
|
||||||
|
alias {
|
||||||
|
name = aws_cloudfront_distribution.sondehub.domain_name
|
||||||
|
zone_id = aws_cloudfront_distribution.sondehub.hosted_zone_id
|
||||||
|
evaluate_target_health = false
|
||||||
|
}
|
||||||
|
zone_id = "Z0756308IVLVF48G6G1S"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route53_record" "predict_A" {
|
||||||
|
name = "predict"
|
||||||
|
type = "A"
|
||||||
|
alias {
|
||||||
|
name = aws_cloudfront_distribution.predict.domain_name
|
||||||
|
zone_id = aws_cloudfront_distribution.predict.hosted_zone_id
|
||||||
|
evaluate_target_health = false
|
||||||
|
}
|
||||||
|
zone_id = "Z0756308IVLVF48G6G1S"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route53_record" "predict_AAAA" {
|
||||||
|
name = "predict"
|
||||||
|
type = "AAAA"
|
||||||
|
alias {
|
||||||
|
name = aws_cloudfront_distribution.predict.domain_name
|
||||||
|
zone_id = aws_cloudfront_distribution.predict.hosted_zone_id
|
||||||
|
evaluate_target_health = false
|
||||||
|
}
|
||||||
|
zone_id = "Z0756308IVLVF48G6G1S"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route53_record" "tracker_A" {
|
||||||
|
name = "tracker"
|
||||||
|
type = "A"
|
||||||
|
alias {
|
||||||
|
name = aws_cloudfront_distribution.sondehub.domain_name
|
||||||
|
zone_id = aws_cloudfront_distribution.sondehub.hosted_zone_id
|
||||||
|
evaluate_target_health = false
|
||||||
|
}
|
||||||
|
zone_id = "Z0756308IVLVF48G6G1S"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route53_record" "tracker_AAAA" {
|
||||||
|
name = "tracker"
|
||||||
|
type = "AAAA"
|
||||||
|
alias {
|
||||||
|
name = aws_cloudfront_distribution.sondehub.domain_name
|
||||||
|
zone_id = aws_cloudfront_distribution.sondehub.hosted_zone_id
|
||||||
|
evaluate_target_health = false
|
||||||
|
}
|
||||||
|
zone_id = "Z0756308IVLVF48G6G1S"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route53_record" "www_A" {
|
||||||
|
name = "www"
|
||||||
|
type = "A"
|
||||||
|
alias {
|
||||||
|
name = aws_cloudfront_distribution.sondehub.domain_name
|
||||||
|
zone_id = aws_cloudfront_distribution.sondehub.hosted_zone_id
|
||||||
|
evaluate_target_health = false
|
||||||
|
}
|
||||||
|
zone_id = "Z0756308IVLVF48G6G1S"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route53_record" "www_AAAA" {
|
||||||
|
name = "www"
|
||||||
|
type = "AAAA"
|
||||||
|
alias {
|
||||||
|
name = aws_cloudfront_distribution.sondehub.domain_name
|
||||||
|
zone_id = aws_cloudfront_distribution.sondehub.hosted_zone_id
|
||||||
|
evaluate_target_health = false
|
||||||
|
}
|
||||||
|
zone_id = "Z0756308IVLVF48G6G1S"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route53_record" "v2_A" {
|
||||||
|
name = ""
|
||||||
|
allow_overwrite = true
|
||||||
|
type = "A"
|
||||||
|
alias {
|
||||||
|
name = aws_cloudfront_distribution.sondehub.domain_name
|
||||||
|
zone_id = aws_cloudfront_distribution.sondehub.hosted_zone_id
|
||||||
|
evaluate_target_health = false
|
||||||
|
}
|
||||||
|
zone_id = aws_route53_zone.Route53HostedZone.zone_id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route53_record" "v2_AAAA" {
|
||||||
|
name = ""
|
||||||
|
allow_overwrite = true
|
||||||
|
type = "AAAA"
|
||||||
|
alias {
|
||||||
|
name = aws_cloudfront_distribution.sondehub.domain_name
|
||||||
|
zone_id = aws_cloudfront_distribution.sondehub.hosted_zone_id
|
||||||
|
evaluate_target_health = false
|
||||||
|
}
|
||||||
|
zone_id = aws_route53_zone.Route53HostedZone.zone_id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route53_record" "api_raw" {
|
||||||
|
name = "api-raw"
|
||||||
|
type = "CNAME"
|
||||||
|
ttl = 300
|
||||||
|
records = [
|
||||||
|
aws_apigatewayv2_domain_name.ApiGatewayV2DomainName.domain_name_configuration[0].target_domain_name
|
||||||
|
]
|
||||||
|
zone_id = aws_route53_zone.Route53HostedZone.zone_id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route53_record" "api_A" {
|
||||||
|
name = "api"
|
||||||
|
type = "A"
|
||||||
|
alias {
|
||||||
|
name = aws_cloudfront_distribution.api.domain_name
|
||||||
|
zone_id = aws_cloudfront_distribution.api.hosted_zone_id
|
||||||
|
evaluate_target_health = false
|
||||||
|
}
|
||||||
|
zone_id = aws_route53_zone.Route53HostedZone.zone_id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route53_record" "api_AAAA" {
|
||||||
|
name = "api"
|
||||||
|
type = "AAAA"
|
||||||
|
alias {
|
||||||
|
name = aws_cloudfront_distribution.api.domain_name
|
||||||
|
zone_id = aws_cloudfront_distribution.api.hosted_zone_id
|
||||||
|
evaluate_target_health = false
|
||||||
|
}
|
||||||
|
zone_id = aws_route53_zone.Route53HostedZone.zone_id
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
resource "aws_cloudfront_distribution" "sondehub" {
|
||||||
|
aliases = [
|
||||||
|
local.domain_name,
|
||||||
|
"sondehub.org",
|
||||||
|
"tracker.sondehub.org",
|
||||||
|
"www.sondehub.org"
|
||||||
|
]
|
||||||
|
default_root_object = "index.html"
|
||||||
|
origin {
|
||||||
|
custom_origin_config {
|
||||||
|
http_port = 80
|
||||||
|
https_port = 443
|
||||||
|
origin_keepalive_timeout = 5
|
||||||
|
origin_protocol_policy = "https-only"
|
||||||
|
origin_read_timeout = 30
|
||||||
|
origin_ssl_protocols = [
|
||||||
|
"TLSv1",
|
||||||
|
"TLSv1.1",
|
||||||
|
"TLSv1.2"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
domain_name = aws_cloudfront_distribution.card.domain_name
|
||||||
|
origin_id = "card"
|
||||||
|
origin_path = ""
|
||||||
|
}
|
||||||
|
origin {
|
||||||
|
domain_name = aws_s3_bucket.v2.bucket_regional_domain_name
|
||||||
|
origin_id = "S3-${local.domain_name}"
|
||||||
|
origin_path = ""
|
||||||
|
}
|
||||||
|
default_cache_behavior {
|
||||||
|
allowed_methods = ["GET", "HEAD", "OPTIONS"]
|
||||||
|
cached_methods = [
|
||||||
|
"HEAD",
|
||||||
|
"GET"
|
||||||
|
]
|
||||||
|
compress = true
|
||||||
|
default_ttl = 120
|
||||||
|
forwarded_values {
|
||||||
|
cookies {
|
||||||
|
forward = "none"
|
||||||
|
}
|
||||||
|
query_string = false
|
||||||
|
}
|
||||||
|
lambda_function_association {
|
||||||
|
event_type = "viewer-request"
|
||||||
|
lambda_arn = aws_lambda_function.redirect.qualified_arn
|
||||||
|
}
|
||||||
|
max_ttl = 120
|
||||||
|
min_ttl = 120
|
||||||
|
smooth_streaming = false
|
||||||
|
target_origin_id = "S3-${local.domain_name}"
|
||||||
|
viewer_protocol_policy = "redirect-to-https"
|
||||||
|
}
|
||||||
|
ordered_cache_behavior {
|
||||||
|
|
||||||
|
allowed_methods = [ "GET", "HEAD"]
|
||||||
|
cached_methods = [
|
||||||
|
"HEAD",
|
||||||
|
"GET"
|
||||||
|
]
|
||||||
|
compress = true
|
||||||
|
default_ttl = 120
|
||||||
|
forwarded_values {
|
||||||
|
cookies {
|
||||||
|
forward = "none"
|
||||||
|
}
|
||||||
|
query_string = false
|
||||||
|
}
|
||||||
|
max_ttl = 120
|
||||||
|
min_ttl = 120
|
||||||
|
path_pattern = "card/*"
|
||||||
|
smooth_streaming = false
|
||||||
|
target_origin_id = "card"
|
||||||
|
viewer_protocol_policy = "redirect-to-https"
|
||||||
|
}
|
||||||
|
ordered_cache_behavior {
|
||||||
|
allowed_methods = [ "GET", "HEAD", "OPTIONS"]
|
||||||
|
cached_methods = [
|
||||||
|
"HEAD",
|
||||||
|
"GET"
|
||||||
|
]
|
||||||
|
compress = true
|
||||||
|
default_ttl = 120
|
||||||
|
forwarded_values {
|
||||||
|
cookies {
|
||||||
|
forward = "none"
|
||||||
|
}
|
||||||
|
query_string = false
|
||||||
|
}
|
||||||
|
max_ttl = 120
|
||||||
|
min_ttl = 120
|
||||||
|
path_pattern = "*.*"
|
||||||
|
smooth_streaming = false
|
||||||
|
target_origin_id = "S3-${local.domain_name}"
|
||||||
|
viewer_protocol_policy = "redirect-to-https"
|
||||||
|
}
|
||||||
|
custom_error_response {
|
||||||
|
error_caching_min_ttl = 10
|
||||||
|
error_code = 403
|
||||||
|
response_code = "200"
|
||||||
|
response_page_path = "/card/index.html"
|
||||||
|
}
|
||||||
|
custom_error_response {
|
||||||
|
error_caching_min_ttl = 10
|
||||||
|
error_code = 404
|
||||||
|
response_code = "200"
|
||||||
|
response_page_path = "/card/index.html"
|
||||||
|
}
|
||||||
|
comment = ""
|
||||||
|
price_class = "PriceClass_All"
|
||||||
|
enabled = true
|
||||||
|
viewer_certificate {
|
||||||
|
acm_certificate_arn = aws_acm_certificate.CertificateManagerCertificate_root.arn
|
||||||
|
minimum_protocol_version = "TLSv1.2_2019"
|
||||||
|
ssl_support_method = "sni-only"
|
||||||
|
}
|
||||||
|
restrictions {
|
||||||
|
geo_restriction {
|
||||||
|
restriction_type = "none"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
http_version = "http2"
|
||||||
|
is_ipv6_enabled = true
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_cloudfront_distribution" "testing" {
|
||||||
|
aliases = [
|
||||||
|
"testing.${local.domain_name}"
|
||||||
|
]
|
||||||
|
default_root_object = "index.html"
|
||||||
|
origin {
|
||||||
|
domain_name = aws_s3_bucket.v2.bucket_regional_domain_name
|
||||||
|
origin_id = "S3-${local.domain_name}/testing"
|
||||||
|
origin_path = "/testing"
|
||||||
|
}
|
||||||
|
default_cache_behavior {
|
||||||
|
allowed_methods = ["GET", "HEAD"]
|
||||||
|
cached_methods = [
|
||||||
|
"HEAD",
|
||||||
|
"GET"
|
||||||
|
]
|
||||||
|
compress = true
|
||||||
|
default_ttl = 5
|
||||||
|
forwarded_values {
|
||||||
|
cookies {
|
||||||
|
forward = "none"
|
||||||
|
}
|
||||||
|
query_string = false
|
||||||
|
}
|
||||||
|
max_ttl = 5
|
||||||
|
min_ttl = 0
|
||||||
|
smooth_streaming = false
|
||||||
|
target_origin_id = "S3-${local.domain_name}/testing"
|
||||||
|
viewer_protocol_policy = "redirect-to-https"
|
||||||
|
}
|
||||||
|
comment = ""
|
||||||
|
price_class = "PriceClass_All"
|
||||||
|
enabled = true
|
||||||
|
viewer_certificate {
|
||||||
|
acm_certificate_arn = aws_acm_certificate_validation.CertificateManagerCertificate.certificate_arn
|
||||||
|
minimum_protocol_version = "TLSv1.2_2021"
|
||||||
|
ssl_support_method = "sni-only"
|
||||||
|
}
|
||||||
|
restrictions {
|
||||||
|
geo_restriction {
|
||||||
|
restriction_type = "none"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
http_version = "http2"
|
||||||
|
is_ipv6_enabled = true
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_cloudfront_distribution" "card" {
|
||||||
|
origin {
|
||||||
|
domain_name = aws_s3_bucket.card.bucket_regional_domain_name
|
||||||
|
origin_id = aws_s3_bucket.card.bucket_regional_domain_name
|
||||||
|
origin_path = ""
|
||||||
|
}
|
||||||
|
default_cache_behavior {
|
||||||
|
allowed_methods = ["GET", "HEAD"]
|
||||||
|
cached_methods = [
|
||||||
|
"HEAD",
|
||||||
|
"GET"
|
||||||
|
]
|
||||||
|
compress = false
|
||||||
|
default_ttl = 120
|
||||||
|
forwarded_values {
|
||||||
|
cookies {
|
||||||
|
forward = "none"
|
||||||
|
}
|
||||||
|
query_string = false
|
||||||
|
}
|
||||||
|
max_ttl = 120
|
||||||
|
min_ttl = 120
|
||||||
|
smooth_streaming = false
|
||||||
|
target_origin_id = aws_s3_bucket.card.bucket_regional_domain_name
|
||||||
|
viewer_protocol_policy = "redirect-to-https"
|
||||||
|
}
|
||||||
|
comment = ""
|
||||||
|
default_root_object = "index.html"
|
||||||
|
price_class = "PriceClass_100"
|
||||||
|
enabled = true
|
||||||
|
viewer_certificate {
|
||||||
|
cloudfront_default_certificate = true
|
||||||
|
minimum_protocol_version = "TLSv1"
|
||||||
|
}
|
||||||
|
restrictions {
|
||||||
|
geo_restriction {
|
||||||
|
restriction_type = "none"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
http_version = "http2"
|
||||||
|
is_ipv6_enabled = true
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_cloudfront_distribution" "predict" {
|
||||||
|
aliases = [
|
||||||
|
"predict.sondehub.org"
|
||||||
|
]
|
||||||
|
origin {
|
||||||
|
domain_name = aws_s3_bucket.predict.bucket_regional_domain_name
|
||||||
|
origin_id = aws_s3_bucket.predict.bucket_regional_domain_name
|
||||||
|
origin_path = ""
|
||||||
|
}
|
||||||
|
default_root_object = "index.html"
|
||||||
|
default_cache_behavior {
|
||||||
|
allowed_methods = ["GET", "HEAD", "OPTIONS"]
|
||||||
|
cached_methods = [
|
||||||
|
"HEAD",
|
||||||
|
"GET"
|
||||||
|
]
|
||||||
|
compress = true
|
||||||
|
default_ttl = 120
|
||||||
|
forwarded_values {
|
||||||
|
cookies {
|
||||||
|
forward = "none"
|
||||||
|
}
|
||||||
|
query_string = false
|
||||||
|
}
|
||||||
|
max_ttl = 120
|
||||||
|
min_ttl = 120
|
||||||
|
smooth_streaming = false
|
||||||
|
target_origin_id = aws_s3_bucket.predict.bucket_regional_domain_name
|
||||||
|
viewer_protocol_policy = "redirect-to-https"
|
||||||
|
}
|
||||||
|
comment = ""
|
||||||
|
price_class = "PriceClass_100"
|
||||||
|
enabled = true
|
||||||
|
viewer_certificate {
|
||||||
|
acm_certificate_arn = aws_acm_certificate.CertificateManagerCertificate_root.arn
|
||||||
|
minimum_protocol_version = "TLSv1.2_2021"
|
||||||
|
ssl_support_method = "sni-only"
|
||||||
|
}
|
||||||
|
restrictions {
|
||||||
|
geo_restriction {
|
||||||
|
restriction_type = "none"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
http_version = "http2"
|
||||||
|
is_ipv6_enabled = true
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_cloudfront_distribution" "api" {
|
||||||
|
aliases = [
|
||||||
|
"api.${local.domain_name}"
|
||||||
|
]
|
||||||
|
origin {
|
||||||
|
custom_origin_config {
|
||||||
|
http_port = 80
|
||||||
|
https_port = 443
|
||||||
|
origin_keepalive_timeout = 5
|
||||||
|
origin_protocol_policy = "https-only"
|
||||||
|
origin_read_timeout = 60
|
||||||
|
origin_ssl_protocols = [
|
||||||
|
"TLSv1.2"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
domain_name = aws_apigatewayv2_domain_name.ApiGatewayV2DomainName.domain_name
|
||||||
|
origin_id = "Custom-api.${local.domain_name}"
|
||||||
|
origin_path = ""
|
||||||
|
}
|
||||||
|
default_cache_behavior {
|
||||||
|
allowed_methods = ["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"]
|
||||||
|
cached_methods = [
|
||||||
|
"HEAD",
|
||||||
|
"GET"
|
||||||
|
]
|
||||||
|
compress = true
|
||||||
|
default_ttl = 60
|
||||||
|
forwarded_values {
|
||||||
|
cookies {
|
||||||
|
forward = "none"
|
||||||
|
}
|
||||||
|
headers = [
|
||||||
|
"Origin",
|
||||||
|
"Access-Control-Request-Method",
|
||||||
|
"Access-Control-Request-Headers"
|
||||||
|
]
|
||||||
|
query_string = true
|
||||||
|
}
|
||||||
|
max_ttl = 120
|
||||||
|
min_ttl = 60
|
||||||
|
smooth_streaming = false
|
||||||
|
target_origin_id = "Custom-api.${local.domain_name}"
|
||||||
|
viewer_protocol_policy = "allow-all"
|
||||||
|
}
|
||||||
|
ordered_cache_behavior {
|
||||||
|
allowed_methods = ["GET", "HEAD"]
|
||||||
|
cached_methods = [
|
||||||
|
"HEAD",
|
||||||
|
"GET"
|
||||||
|
]
|
||||||
|
compress = true
|
||||||
|
default_ttl = 30
|
||||||
|
forwarded_values {
|
||||||
|
cookies {
|
||||||
|
forward = "none"
|
||||||
|
}
|
||||||
|
headers = [
|
||||||
|
"Origin",
|
||||||
|
"Access-Control-Request-Method",
|
||||||
|
"Access-Control-Request-Headers"
|
||||||
|
]
|
||||||
|
query_string = true
|
||||||
|
}
|
||||||
|
max_ttl = 30
|
||||||
|
min_ttl = 30
|
||||||
|
path_pattern = "predictions"
|
||||||
|
smooth_streaming = false
|
||||||
|
target_origin_id = "Custom-api.${local.domain_name}"
|
||||||
|
viewer_protocol_policy = "redirect-to-https"
|
||||||
|
}
|
||||||
|
ordered_cache_behavior {
|
||||||
|
allowed_methods = ["GET", "HEAD"]
|
||||||
|
cached_methods = [
|
||||||
|
"HEAD",
|
||||||
|
"GET"
|
||||||
|
]
|
||||||
|
compress = true
|
||||||
|
default_ttl = 300
|
||||||
|
forwarded_values {
|
||||||
|
cookies {
|
||||||
|
forward = "none"
|
||||||
|
}
|
||||||
|
headers = [
|
||||||
|
"Origin",
|
||||||
|
"Access-Control-Request-Method",
|
||||||
|
"Access-Control-Request-Headers"
|
||||||
|
]
|
||||||
|
query_string = false
|
||||||
|
}
|
||||||
|
max_ttl = 300
|
||||||
|
min_ttl = 300
|
||||||
|
path_pattern = "pledges"
|
||||||
|
smooth_streaming = false
|
||||||
|
target_origin_id = "Custom-api.${local.domain_name}"
|
||||||
|
viewer_protocol_policy = "redirect-to-https"
|
||||||
|
}
|
||||||
|
comment = ""
|
||||||
|
price_class = "PriceClass_100"
|
||||||
|
enabled = true
|
||||||
|
viewer_certificate {
|
||||||
|
acm_certificate_arn = aws_acm_certificate_validation.CertificateManagerCertificate.certificate_arn
|
||||||
|
minimum_protocol_version = "TLSv1.2_2019"
|
||||||
|
ssl_support_method = "sni-only"
|
||||||
|
}
|
||||||
|
restrictions {
|
||||||
|
geo_restriction {
|
||||||
|
restriction_type = "none"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
http_version = "http2"
|
||||||
|
is_ipv6_enabled = true
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
resource "aws_s3_bucket" "v2" {
|
||||||
|
bucket = local.domain_name
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_s3_bucket" "cf_logs" {
|
||||||
|
bucket = "sondehub-cloudfront-logs"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_s3_bucket" "history" {
|
||||||
|
bucket = "sondehub-history"
|
||||||
|
cors_rule {
|
||||||
|
allowed_headers = [
|
||||||
|
"*",
|
||||||
|
]
|
||||||
|
allowed_methods = [
|
||||||
|
"GET",
|
||||||
|
]
|
||||||
|
allowed_origins = [
|
||||||
|
"*",
|
||||||
|
]
|
||||||
|
expose_headers = []
|
||||||
|
max_age_seconds = 0
|
||||||
|
}
|
||||||
|
website {
|
||||||
|
index_document = "index.html"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_s3_bucket" "predict" {
|
||||||
|
bucket = "sondehub-predict"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_s3_bucket" "card" {
|
||||||
|
bucket = "sondehub-v2-card"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
resource "aws_s3_bucket_policy" "S3BucketPolicy" {
|
||||||
|
bucket = aws_s3_bucket.v2.bucket
|
||||||
|
policy = "{\"Version\":\"2012-10-17\",\"Id\":\"Policy1615627853229\",\"Statement\":[{\"Sid\":\"Stmt1615627852247\",\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"s3:GetObject\",\"Resource\":\"arn:aws:s3:::${local.domain_name}/*\"}]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_s3_bucket_policy" "S3BucketPolicy2" {
|
||||||
|
bucket = aws_s3_bucket.history.bucket
|
||||||
|
policy = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"PublicRead\",\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":[\"s3:GetObject\",\"s3:GetObjectVersion\",\"s3:ListBucket\",\"s3:GetObjectTorrent\"],\"Resource\":[\"arn:aws:s3:::sondehub-history/*\",\"arn:aws:s3:::sondehub-history\"]}]}"
|
||||||
|
}
|
@ -78,10 +78,10 @@ resource "aws_lambda_function" "historic_to_s3" {
|
|||||||
filename = "${path.module}/build/historic_to_s3.zip"
|
filename = "${path.module}/build/historic_to_s3.zip"
|
||||||
source_code_hash = data.archive_file.historic_to_s3.output_base64sha256
|
source_code_hash = data.archive_file.historic_to_s3.output_base64sha256
|
||||||
publish = true
|
publish = true
|
||||||
memory_size = 2048
|
memory_size = 3096
|
||||||
role = aws_iam_role.historic.arn
|
role = aws_iam_role.historic.arn
|
||||||
runtime = "python3.9"
|
runtime = "python3.9"
|
||||||
timeout = 60
|
timeout = 120
|
||||||
reserved_concurrent_executions = 2
|
reserved_concurrent_executions = 2
|
||||||
environment {
|
environment {
|
||||||
variables = {
|
variables = {
|
||||||
|
18
main.tf
18
main.tf
@ -30,6 +30,13 @@ resource "aws_iam_role" "basic_lambda_role" {
|
|||||||
"Service": "lambda.amazonaws.com"
|
"Service": "lambda.amazonaws.com"
|
||||||
},
|
},
|
||||||
"Action": "sts:AssumeRole"
|
"Action": "sts:AssumeRole"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Effect": "Allow",
|
||||||
|
"Principal": {
|
||||||
|
"Service": "edgelambda.amazonaws.com"
|
||||||
|
},
|
||||||
|
"Action": "sts:AssumeRole"
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
@ -108,3 +115,14 @@ resource "aws_acm_certificate" "CertificateManagerCertificate" {
|
|||||||
]
|
]
|
||||||
validation_method = "DNS"
|
validation_method = "DNS"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
resource "aws_acm_certificate" "CertificateManagerCertificate_root" {
|
||||||
|
domain_name = local.domain_name
|
||||||
|
subject_alternative_names = [
|
||||||
|
"*.${local.domain_name}",
|
||||||
|
"sondehub.org",
|
||||||
|
"*.sondehub.org"
|
||||||
|
]
|
||||||
|
validation_method = "DNS"
|
||||||
|
}
|
||||||
|
167
predictor.tf
167
predictor.tf
@ -211,7 +211,16 @@ resource "aws_ecs_task_definition" "tawhiri" {
|
|||||||
container_definitions = jsonencode(
|
container_definitions = jsonencode(
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
command = []
|
command = [
|
||||||
|
"/root/.local/bin/gunicorn",
|
||||||
|
"-b",
|
||||||
|
"0.0.0.0:8000",
|
||||||
|
"--workers=20",
|
||||||
|
"--timeout=30",
|
||||||
|
"--keep-alive=65",
|
||||||
|
"--threads=1",
|
||||||
|
"tawhiri.api:app"
|
||||||
|
]
|
||||||
cpu = 0
|
cpu = 0
|
||||||
environment = []
|
environment = []
|
||||||
essential = true
|
essential = true
|
||||||
@ -229,6 +238,10 @@ resource "aws_ecs_task_definition" "tawhiri" {
|
|||||||
containerPath = "/srv"
|
containerPath = "/srv"
|
||||||
sourceVolume = "srv"
|
sourceVolume = "srv"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
containerPath = "/srv/tawhiri-datasets"
|
||||||
|
sourceVolume = "downloader"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
name = "tawhiri"
|
name = "tawhiri"
|
||||||
portMappings = [
|
portMappings = [
|
||||||
@ -240,6 +253,34 @@ resource "aws_ecs_task_definition" "tawhiri" {
|
|||||||
]
|
]
|
||||||
volumesFrom = []
|
volumesFrom = []
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
command = ["daemon"]
|
||||||
|
cpu = 0
|
||||||
|
environment = [
|
||||||
|
{
|
||||||
|
name = "TZ"
|
||||||
|
value = "UTC"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
essential = true
|
||||||
|
image = "${data.aws_caller_identity.current.account_id}.dkr.ecr.us-east-1.amazonaws.com/tawhiri-downloader:latest"
|
||||||
|
logConfiguration = {
|
||||||
|
logDriver = "awslogs"
|
||||||
|
options = {
|
||||||
|
awslogs-group = "/ecs/tawhiri"
|
||||||
|
awslogs-region = "us-east-1"
|
||||||
|
awslogs-stream-prefix = "ecs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mountPoints = [
|
||||||
|
{
|
||||||
|
containerPath = "/srv/tawhiri-datasets"
|
||||||
|
sourceVolume = "downloader"
|
||||||
|
},
|
||||||
|
]
|
||||||
|
name = "downloader"
|
||||||
|
volumesFrom = []
|
||||||
|
},
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
cpu = "512"
|
cpu = "512"
|
||||||
@ -253,68 +294,6 @@ resource "aws_ecs_task_definition" "tawhiri" {
|
|||||||
task_role_arn = aws_iam_role.ecs_execution.arn
|
task_role_arn = aws_iam_role.ecs_execution.arn
|
||||||
|
|
||||||
|
|
||||||
volume {
|
|
||||||
name = "srv"
|
|
||||||
|
|
||||||
efs_volume_configuration {
|
|
||||||
file_system_id = aws_efs_file_system.tawhiri.id
|
|
||||||
root_directory = "srv"
|
|
||||||
transit_encryption = "DISABLED"
|
|
||||||
|
|
||||||
authorization_config {
|
|
||||||
iam = "DISABLED"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
resource "aws_ecs_task_definition" "tawhiri_downloader" {
|
|
||||||
family = "tawhiri-downloader"
|
|
||||||
container_definitions = jsonencode(
|
|
||||||
[
|
|
||||||
{
|
|
||||||
command = [
|
|
||||||
"daemon",
|
|
||||||
]
|
|
||||||
cpu = 0
|
|
||||||
environment = [
|
|
||||||
{
|
|
||||||
name = "TZ"
|
|
||||||
value = "UTC"
|
|
||||||
},
|
|
||||||
]
|
|
||||||
essential = true
|
|
||||||
image = "${data.aws_caller_identity.current.account_id}.dkr.ecr.us-east-1.amazonaws.com/tawhiri-downloader:latest"
|
|
||||||
logConfiguration = {
|
|
||||||
logDriver = "awslogs"
|
|
||||||
options = {
|
|
||||||
awslogs-group = "/ecs/tawhiri-downloader"
|
|
||||||
awslogs-region = "us-east-1"
|
|
||||||
awslogs-stream-prefix = "ecs"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mountPoints = [
|
|
||||||
{
|
|
||||||
containerPath = "/srv"
|
|
||||||
sourceVolume = "srv"
|
|
||||||
},
|
|
||||||
]
|
|
||||||
name = "tawhiri-downloader"
|
|
||||||
portMappings = []
|
|
||||||
volumesFrom = []
|
|
||||||
},
|
|
||||||
]
|
|
||||||
)
|
|
||||||
cpu = "256"
|
|
||||||
execution_role_arn = aws_iam_role.ecs_execution.arn
|
|
||||||
memory = "512"
|
|
||||||
network_mode = "awsvpc"
|
|
||||||
requires_compatibilities = [
|
|
||||||
"FARGATE",
|
|
||||||
]
|
|
||||||
tags = {}
|
|
||||||
task_role_arn = aws_iam_role.ecs_execution.arn
|
|
||||||
|
|
||||||
|
|
||||||
volume {
|
volume {
|
||||||
name = "srv"
|
name = "srv"
|
||||||
@ -329,6 +308,11 @@ resource "aws_ecs_task_definition" "tawhiri_downloader" {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
volume {
|
||||||
|
name = "downloader"
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "aws_ecs_task_definition" "tawhiri_ruaumoko" {
|
resource "aws_ecs_task_definition" "tawhiri_ruaumoko" {
|
||||||
@ -431,10 +415,10 @@ resource "aws_lb_target_group" "tawhiri" {
|
|||||||
target_type = "ip"
|
target_type = "ip"
|
||||||
health_check {
|
health_check {
|
||||||
enabled = true
|
enabled = true
|
||||||
healthy_threshold = 5
|
healthy_threshold = 2
|
||||||
interval = 30
|
interval = 10
|
||||||
matcher = "400"
|
matcher = "200"
|
||||||
path = "/api/v1/"
|
path = "/api/datasetcheck"
|
||||||
port = "traffic-port"
|
port = "traffic-port"
|
||||||
protocol = "HTTP"
|
protocol = "HTTP"
|
||||||
timeout = 5
|
timeout = 5
|
||||||
@ -447,7 +431,7 @@ resource "aws_ecs_service" "tawhiri" {
|
|||||||
cluster = aws_ecs_cluster.tawhiri.id
|
cluster = aws_ecs_cluster.tawhiri.id
|
||||||
task_definition = aws_ecs_task_definition.tawhiri.arn
|
task_definition = aws_ecs_task_definition.tawhiri.arn
|
||||||
enable_ecs_managed_tags = true
|
enable_ecs_managed_tags = true
|
||||||
health_check_grace_period_seconds = 60
|
health_check_grace_period_seconds = 600
|
||||||
iam_role = "aws-service-role"
|
iam_role = "aws-service-role"
|
||||||
launch_type = "FARGATE"
|
launch_type = "FARGATE"
|
||||||
platform_version = "LATEST"
|
platform_version = "LATEST"
|
||||||
@ -472,29 +456,6 @@ resource "aws_ecs_service" "tawhiri" {
|
|||||||
subnets = [aws_subnet.public["us-east-1b"].id]
|
subnets = [aws_subnet.public["us-east-1b"].id]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
resource "aws_ecs_service" "tawhiri_downloader" {
|
|
||||||
name = "tawhiri-downloader"
|
|
||||||
cluster = aws_ecs_cluster.tawhiri.id
|
|
||||||
task_definition = aws_ecs_task_definition.tawhiri_downloader.arn
|
|
||||||
enable_ecs_managed_tags = true
|
|
||||||
iam_role = "aws-service-role"
|
|
||||||
launch_type = "FARGATE"
|
|
||||||
platform_version = "LATEST"
|
|
||||||
desired_count = 1
|
|
||||||
|
|
||||||
|
|
||||||
lifecycle {
|
|
||||||
ignore_changes = [desired_count]
|
|
||||||
}
|
|
||||||
|
|
||||||
network_configuration {
|
|
||||||
assign_public_ip = true
|
|
||||||
security_groups = [
|
|
||||||
aws_security_group.tawhiri_efs.id
|
|
||||||
]
|
|
||||||
subnets = [aws_subnet.public["us-east-1b"].id]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
resource "aws_appautoscaling_target" "tawhiri" {
|
resource "aws_appautoscaling_target" "tawhiri" {
|
||||||
@ -631,3 +592,27 @@ resource "aws_security_group" "tawhiri_alb" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
resource "aws_route53_record" "tawhiri_A" {
|
||||||
|
name = "tawhiri"
|
||||||
|
type = "A"
|
||||||
|
alias {
|
||||||
|
name = "dualstack.${aws_lb.ws.dns_name}."
|
||||||
|
zone_id = aws_lb.ws.zone_id
|
||||||
|
evaluate_target_health = true
|
||||||
|
}
|
||||||
|
zone_id = aws_route53_zone.Route53HostedZone.zone_id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route53_record" "tawhiri_AAAA" {
|
||||||
|
name = "tawhiri"
|
||||||
|
type = "AAAA"
|
||||||
|
alias {
|
||||||
|
name = "dualstack.${aws_lb.ws.dns_name}."
|
||||||
|
zone_id = aws_lb.ws.zone_id
|
||||||
|
evaluate_target_health = true
|
||||||
|
}
|
||||||
|
zone_id = aws_route53_zone.Route53HostedZone.zone_id
|
||||||
|
}
|
88
redirect/index.js
Normal file
88
redirect/index.js
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
exports.handler = (event, context, callback) => {
|
||||||
|
/*
|
||||||
|
* Generate HTTP redirect response with 302 status code and Location header.
|
||||||
|
*/
|
||||||
|
const request = event.Records[0].cf.request;
|
||||||
|
if (request.uri.startsWith('/aprs/')) {
|
||||||
|
var sonde = request.uri.replace(/^\/aprs\//, "");
|
||||||
|
var specific_response = {
|
||||||
|
status: '302',
|
||||||
|
statusDescription: 'Found',
|
||||||
|
headers: {
|
||||||
|
location: [{
|
||||||
|
key: 'Location',
|
||||||
|
value: 'https://aprs.fi/#!call=' + sonde + '&timerange=36000&tail=36000'
|
||||||
|
}],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
callback(null, specific_response);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (request.uri.startsWith('/go/')) {
|
||||||
|
var name = request.uri.replace(/^\/go\//, "");
|
||||||
|
if (name == "donate") {
|
||||||
|
var specific_response = {
|
||||||
|
status: '302',
|
||||||
|
statusDescription: 'Found',
|
||||||
|
headers: {
|
||||||
|
location: [{
|
||||||
|
key: 'Location',
|
||||||
|
value: 'https://www.paypal.com/donate?business=YK2WHT6RNSYH8&item_name=SondeHub+Database+funding¤cy_code=USD'
|
||||||
|
}],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
callback(null, specific_response);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (name == "status") {
|
||||||
|
var specific_response = {
|
||||||
|
status: '302',
|
||||||
|
statusDescription: 'Found',
|
||||||
|
headers: {
|
||||||
|
location: [{
|
||||||
|
key: 'Location',
|
||||||
|
value: 'https://cloudwatch.amazonaws.com/dashboard.html?dashboard=SondeHub&context=eyJSIjoidXMtZWFzdC0xIiwiRCI6ImN3LWRiLTE0Mzg0MTk0MTc3MyIsIlUiOiJ1cy1lYXN0LTFfZ2NlT3hwUnp0IiwiQyI6IjNuOWV0Y2ZxZm9zdm11aTc0NTYwMWFzajVzIiwiSSI6InVzLWVhc3QtMTo0ODI5YmQ4MC0yZmYzLTQ0MDktYjI1ZS0yOTE4MTM5YTgwM2MiLCJNIjoiUHVibGljIn0%3D'
|
||||||
|
}],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
callback(null, specific_response);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var specific_response = {
|
||||||
|
status: '302',
|
||||||
|
statusDescription: 'Found',
|
||||||
|
headers: {
|
||||||
|
location: [{
|
||||||
|
key: 'Location',
|
||||||
|
value: 'https://tinyurl.com/' + name
|
||||||
|
}],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
callback(null, specific_response);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (request.uri !== '/') {
|
||||||
|
var sonde = request.uri.replace(/^\//, "").replace(/^(DFM|M10|M20|IMET|IMET54|MRZ|LMS6)-/, "");
|
||||||
|
var specific_response = {
|
||||||
|
status: '302',
|
||||||
|
statusDescription: 'Found',
|
||||||
|
headers: {
|
||||||
|
location: [{
|
||||||
|
key: 'Location',
|
||||||
|
value: 'https://sondehub.org/?sondehub=1#!f=' + sonde + '&mz=9&qm=All&q=' + sonde
|
||||||
|
}],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
callback(null, specific_response);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (request.querystring !== '' && request.querystring !== undefined) {
|
||||||
|
// do not process if this is not an A-B test request
|
||||||
|
callback(null, request);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
callback(null, request);
|
||||||
|
};
|
@ -669,3 +669,49 @@ resource "aws_appautoscaling_policy" "ws_reader" {
|
|||||||
|
|
||||||
# TODO
|
# TODO
|
||||||
# s3 config bucket
|
# s3 config bucket
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
resource "aws_route53_record" "ws_reader_A" {
|
||||||
|
name = "ws-reader"
|
||||||
|
type = "A"
|
||||||
|
alias {
|
||||||
|
name = "dualstack.${aws_lb.ws.dns_name}."
|
||||||
|
zone_id = aws_lb.ws.zone_id
|
||||||
|
evaluate_target_health = true
|
||||||
|
}
|
||||||
|
zone_id = aws_route53_zone.Route53HostedZone.zone_id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route53_record" "ws_reader_AAAA" {
|
||||||
|
name = "ws-reader"
|
||||||
|
type = "AAAA"
|
||||||
|
alias {
|
||||||
|
name = "dualstack.${aws_lb.ws.dns_name}."
|
||||||
|
zone_id = aws_lb.ws.zone_id
|
||||||
|
evaluate_target_health = true
|
||||||
|
}
|
||||||
|
zone_id = aws_route53_zone.Route53HostedZone.zone_id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route53_record" "ws_A" {
|
||||||
|
name = "ws"
|
||||||
|
type = "A"
|
||||||
|
alias {
|
||||||
|
name = "dualstack.${aws_lb.ws.dns_name}."
|
||||||
|
zone_id = aws_lb.ws.zone_id
|
||||||
|
evaluate_target_health = true
|
||||||
|
}
|
||||||
|
zone_id = aws_route53_zone.Route53HostedZone.zone_id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route53_record" "ws_AAAA" {
|
||||||
|
name = "ws"
|
||||||
|
type = "AAAA"
|
||||||
|
alias {
|
||||||
|
name = "dualstack.${aws_lb.ws.dns_name}."
|
||||||
|
zone_id = aws_lb.ws.zone_id
|
||||||
|
evaluate_target_health = true
|
||||||
|
}
|
||||||
|
zone_id = aws_route53_zone.Route53HostedZone.zone_id
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user