1+ # New API Gateway for mTLS
2+ resource "aws_api_gateway_rest_api" "ndr_doc_store_api_mtls" {
3+ name = " ${ terraform . workspace } -DocStoreAPI-mTLS"
4+ description = " Docuemnt store API with mTLS enabled"
5+
6+ tags = {
7+ Name = " ${ terraform . workspace } -docstore-api-mtls"
8+ Owner = var.owner
9+ Environment = var.environment
10+ Workspace = terraform.workspace
11+ }
12+ }
13+
14+ resource "aws_api_gateway_domain_name" "custom_api_domain_mtls" {
15+ domain_name = local. mtls_api_gateway_full_domain_name
16+ regional_certificate_arn = aws_acm_certificate_validation. mtls_api_gateway_cert . certificate_arn
17+ security_policy = " TLS_1_2"
18+
19+ endpoint_configuration {
20+ types = [" REGIONAL" ]
21+ }
22+
23+ mutual_tls_authentication {
24+ truststore_uri = " s3://${ terraform . workspace } -${ var . truststore_bucket_name } /${ var . ca_pem_filename } "
25+ }
26+ }
27+
28+ resource "aws_api_gateway_base_path_mapping" "api_mapping_mtls" {
29+ api_id = aws_api_gateway_rest_api. ndr_doc_store_api_mtls . id
30+ stage_name = var. environment
31+ domain_name = aws_api_gateway_domain_name. custom_api_domain_mtls . domain_name
32+
33+ depends_on = [aws_api_gateway_deployment . ndr_api_deploy_mtls ]
34+ }
35+
36+ resource "aws_api_gateway_deployment" "ndr_api_deploy_mtls" {
37+ rest_api_id = aws_api_gateway_rest_api. ndr_doc_store_api_mtls . id
38+
39+ depends_on = [
40+ aws_api_gateway_rest_api . ndr_doc_store_api_mtls ,
41+ ]
42+
43+ lifecycle {
44+ create_before_destroy = true
45+ }
46+
47+ variables = {
48+ deployed_at = timestamp ()
49+ }
50+ }
51+
52+ resource "aws_api_gateway_stage" "ndr_api_mtls" {
53+ deployment_id = aws_api_gateway_deployment. ndr_api_deploy_mtls . id
54+ rest_api_id = aws_api_gateway_rest_api. ndr_doc_store_api_mtls . id
55+ stage_name = var. environment
56+ xray_tracing_enabled = var. enable_xray_tracing
57+ }
58+
59+ resource "aws_cloudwatch_log_group" "mtls_api_gateway_stage" {
60+ name = " API-Gateway-Execution-Logs_${ aws_api_gateway_rest_api . ndr_doc_store_api_mtls . id } /${ var . environment } "
61+ retention_in_days = 0
62+ depends_on = [
63+ aws_api_gateway_account . logging
64+ ]
65+ }
66+
67+ resource "aws_api_gateway_method_settings" "mtls_api_gateway_stage" {
68+ rest_api_id = aws_api_gateway_rest_api. ndr_doc_store_api_mtls . id
69+ stage_name = aws_api_gateway_stage. ndr_api_mtls . stage_name
70+ method_path = " */*"
71+
72+ settings {
73+ logging_level = " INFO"
74+ metrics_enabled = true
75+ data_trace_enabled = true
76+ }
77+ }
78+
79+ resource "aws_api_gateway_gateway_response" "unauthorised_response_mtls" {
80+ rest_api_id = aws_api_gateway_rest_api. ndr_doc_store_api_mtls . id
81+ response_type = " DEFAULT_4XX"
82+
83+ response_templates = {
84+ " application/json" = " {\" message\" :$context.error.messageString}"
85+ }
86+
87+ response_parameters = {
88+ " gatewayresponse.header.Access-Control-Allow-Origin" = contains ([" prod" ], terraform. workspace ) ? " 'https://${ var . domain } '" : " 'https://${ terraform . workspace } .${ var . domain } '"
89+ " gatewayresponse.header.Access-Control-Allow-Methods" = " '*'"
90+ " gatewayresponse.header.Access-Control-Allow-Headers" = " 'Content-Type,X-Amz-Date,Authorization,X-Auth,X-Api-Key,X-Amz-Security-Token,X-Auth-Cookie,Accept'"
91+ " gatewayresponse.header.Access-Control-Allow-Credentials" = " 'true'"
92+ }
93+ }
94+
95+ resource "aws_api_gateway_gateway_response" "bad_gateway_response_mtls" {
96+ rest_api_id = aws_api_gateway_rest_api. ndr_doc_store_api_mtls . id
97+ response_type = " DEFAULT_5XX"
98+
99+ response_templates = {
100+ " application/json" = " {\" message\" :$context.error.messageString}"
101+ }
102+
103+ response_parameters = {
104+ " gatewayresponse.header.Access-Control-Allow-Origin" = contains ([" prod" ], terraform. workspace ) ? " 'https://${ var . domain } '" : " 'https://${ terraform . workspace } .${ var . domain } '"
105+ " gatewayresponse.header.Access-Control-Allow-Methods" = " '*'"
106+ " gatewayresponse.header.Access-Control-Allow-Headers" = " 'Content-Type,X-Amz-Date,Authorization,X-Auth,X-Api-Key,X-Amz-Security-Token,X-Auth-Cookie,Accept'"
107+ " gatewayresponse.header.Access-Control-Allow-Credentials" = " 'true'"
108+ }
109+ }
110+
111+ module "mtls_api_endpoint_url_ssm_parameter" {
112+ source = " ./modules/ssm_parameter"
113+ name = " api_endpoint_mtls"
114+ description = " mTLS api endpoint URL for ${ var . environment } "
115+ resource_depends_on = aws_api_gateway_deployment. ndr_api_deploy_mtls
116+ value = " https://${ aws_api_gateway_base_path_mapping . api_mapping_mtls . domain_name } "
117+ type = " SecureString"
118+ owner = var. owner
119+ environment = var. environment
120+ }
0 commit comments