From 77042f42636ac9f680686135aa21cf3b768b2a7a Mon Sep 17 00:00:00 2001 From: Nick Dumas Date: Tue, 3 Jun 2025 05:55:35 -0400 Subject: [PATCH] API Gateway --- api_gw.load.tf | 30 ++++++++++++++++++++++++++++++ api_gw.metrics.tf | 30 ++++++++++++++++++++++++++++++ api_gw.tf | 32 ++++++++++++++++++++++++++++++++ main.tf | 3 +++ 4 files changed, 95 insertions(+) create mode 100644 api_gw.load.tf create mode 100644 api_gw.metrics.tf create mode 100644 api_gw.tf create mode 100644 main.tf diff --git a/api_gw.load.tf b/api_gw.load.tf new file mode 100644 index 0000000..8795b51 --- /dev/null +++ b/api_gw.load.tf @@ -0,0 +1,30 @@ +resource "aws_api_gateway_resource" "transponder-tracker-load" { + parent_id = aws_api_gateway_rest_api.transponder-tracker.root_resource_id + path_part = "load" + rest_api_id = aws_api_gateway_rest_api.transponder-tracker.id +} + +resource "aws_api_gateway_method" "transponder-tracker-load" { + authorization = "NONE" + http_method = "GET" + resource_id = aws_api_gateway_resource.transponder-tracker-load.id + rest_api_id = aws_api_gateway_rest_api.transponder-tracker.id +} + +resource "aws_api_gateway_integration" "transponder-tracker-load" { + http_method = aws_api_gateway_method.transponder-tracker-load.http_method + resource_id = aws_api_gateway_resource.transponder-tracker-load.id + rest_api_id = aws_api_gateway_rest_api.transponder-tracker.id + type = "AWS_PROXY" + uri = module.load-lambda.invoke_arn +} + +resource "aws_lambda_permission" "apigw_lambda_load" { + statement_id = "AllowExecutionFromAPIGateway" + action = "lambda:InvokeFunction" + function_name = module.load-lambda.function_name + principal = "apigateway.amazonaws.com" + + # More: http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-control-access-using-iam-policies-to-invoke-api.html + source_arn = "arn:aws:execute-api:${data.aws_region.current.name}:${data.aws_caller_identity.current.id}:${aws_api_gateway_rest_api.transponder-tracker.id}/*/${aws_api_gateway_method.transponder-tracker-load.http_method}${aws_api_gateway_resource.transponder-tracker-load.path}" +} diff --git a/api_gw.metrics.tf b/api_gw.metrics.tf new file mode 100644 index 0000000..16f71a3 --- /dev/null +++ b/api_gw.metrics.tf @@ -0,0 +1,30 @@ +resource "aws_api_gateway_resource" "transponder-tracker-metrics" { + parent_id = aws_api_gateway_rest_api.transponder-tracker.root_resource_id + path_part = "metrics" + rest_api_id = aws_api_gateway_rest_api.transponder-tracker.id +} + +resource "aws_api_gateway_method" "transponder-tracker-metrics" { + authorization = "NONE" + http_method = "GET" + resource_id = aws_api_gateway_resource.transponder-tracker-metrics.id + rest_api_id = aws_api_gateway_rest_api.transponder-tracker.id +} + +resource "aws_api_gateway_integration" "transponder-tracker-metrics" { + http_method = aws_api_gateway_method.transponder-tracker-metrics.http_method + resource_id = aws_api_gateway_resource.transponder-tracker-metrics.id + rest_api_id = aws_api_gateway_rest_api.transponder-tracker.id + type = "AWS_PROXY" + uri = module.metrics-lambda.invoke_arn +} + +resource "aws_lambda_permission" "apigw_lambda-metrics" { + statement_id = "AllowExecutionFromAPIGateway" + action = "lambda:InvokeFunction" + function_name = module.metrics-lambda.function_name + principal = "apigateway.amazonaws.com" + + # More: http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-control-access-using-iam-policies-to-invoke-api.html + source_arn = "arn:aws:execute-api:${data.aws_region.current.name}:${data.aws_caller_identity.current.id}:${aws_api_gateway_rest_api.transponder-tracker.id}/*/${aws_api_gateway_method.transponder-tracker-metrics.http_method}${aws_api_gateway_resource.transponder-tracker-metrics.path}" +} diff --git a/api_gw.tf b/api_gw.tf new file mode 100644 index 0000000..f7d0cd7 --- /dev/null +++ b/api_gw.tf @@ -0,0 +1,32 @@ +resource "aws_api_gateway_rest_api" "transponder-tracker" { + name = "transponder-tracker" +} + +resource "aws_api_gateway_deployment" "transponder-tracker" { + rest_api_id = aws_api_gateway_rest_api.transponder-tracker.id + + triggers = { + # NOTE: The configuration below will satisfy ordering considerations, + # but not pick up all future REST API changes. More advanced patterns + # are possible, such as using the filesha1() function against the + # Terraform configuration file(s) or removing the .id references to + # calculate a hash against whole resources. Be aware that using whole + # resources will show a difference after the initial implementation. + # It will stabilize to only change when resources change afterwards. + redeployment = sha1(jsonencode([ + aws_api_gateway_resource.transponder-tracker-load.id, + aws_api_gateway_method.transponder-tracker-load.id, + aws_api_gateway_integration.transponder-tracker-load.id, + ])) + } + + lifecycle { + create_before_destroy = true + } +} + +resource "aws_api_gateway_stage" "transponder-tracker" { + deployment_id = aws_api_gateway_deployment.transponder-tracker.id + rest_api_id = aws_api_gateway_rest_api.transponder-tracker.id + stage_name = "sandbox" +} diff --git a/main.tf b/main.tf new file mode 100644 index 0000000..f4693af --- /dev/null +++ b/main.tf @@ -0,0 +1,3 @@ +data "aws_caller_identity" "current" {} + +data "aws_region" "current" {}