Sign in
Menu
Start free trial
Annex F: NIST 800-53

NIST 800-53 controls built into your Terraform modules. Enforced before apply.

Access control, audit logging, system protection and configuration management on AWS resources. The modules enforce these controls before apply and list the NIST SP 800-53 Rev 5 control ID each one maps to, where the catalog names one.

Modules enforce 77 of 96 NIST 800-53 controls in the catalog. Of the 62 that cite a NIST 800-53 clause, they enforce 49. The controls they do not enforce stay with your team, with risk assessment, security plans, training and incident response.

No credit card or AWS account needed to start. By Anton Babenko, maintainer of terraform-aws-modules, more than 2 billion provisions.

Annex F: NIST 800-53

Framework
NIST SP 800-53 Rev 5
For
Your team, on Terraform
F.1

Scope for NIST 800-53

Federal agencies and their contractors use NIST 800-53 as the security baseline. If you sell to the US government or plan for FedRAMP, it is where you start.

F.1.1

Covers

  • Infrastructure controls on AWS resources that map to NIST SP 800-53 Rev 5 control IDs, by control family in F.3.
  • terraform-aws-modules through the NIST 800-53 framework host or your org endpoint, and resources written by hand outside modules once your team switches to the compliance.tf provider.
F.1.2

Stays with your team

  • Risk assessment documentation (RA family).
  • Security planning and system security plans (PL family).
  • Contingency planning procedures beyond backup configuration (CP family).
  • Personnel security and screening (PS family).
  • Awareness and training (AT family).
  • Incident response procedures (IR family).
  • Physical and environmental protection (PE family).
  • Resources outside compliance.tf module coverage, and every control F.4 lists as Mapped: 13 with a NIST 800-53 clause and 6 without one.
F.2

The source line

Point a module at the NIST 800-53 framework host. Same inputs and outputs, no state migration. Terraform 1.0 or later.

-  source  = "terraform-aws-modules/s3-bucket/aws"
+  source  = "nist80053.compliance.tf/terraform-aws-modules/s3-bucket/aws"
   version = "~> 5.0"

With an org endpoint, the source names your org host instead, and NIST 800-53comes from your org's configuration.

F.3

Enforced and mapped, by control family

Of the 62 NIST 800-53 controls in the documented catalog that cite a clause, modules enforce 49. A control appears once under each control family it maps to.

SC44 of 55
AU21 of 30
SI22 of 30
AC14 of 20
CM14 of 20
CP14 of 17
CA9 of 13
PM8 of 13
IA6 of 10
MP6 of 7
MA4 of 7
SA4 of 5

The catalog maps 34 more controls to NIST 800-53 without naming a clause, 28 of them enforced. They are listed apart at the end of F.4 and left out of these counts.

Every row is a control your assessor can look up.

Filter the register, or search by control name or clause, for example SC-28.

62 of 62 shown

Each control links to its public docs page.

Enforced
Modules set this control before anything is deployed.
Mapped
Documented on its docs page, not set by modules. Your team owns it.
F.4

Control register

ControlStatusNIST 800-53 clauses
CloudWatch alarms should have an action configuredEnforcedAC-2(12), IA-10
CloudWatch log groups should have retention period of at least 365 daysEnforcedAC-16(b), AU-6(3), AU-6(4), AU-6(6), AU-6(9), AU-11(1), AU-12(1), AU-12(2), AU-12(3), AU-14(a), AU-14(b), AU-11, CA-7(b), PM-31, SI-12, AU-10, PM-14(a)(1), PM-14(b), PM-21(b), SC-28(2), SI-4(17)
DMS replication instances should not be publicly accessibleEnforcedSC-25
DynamoDB tables should have AWS KMS encryption enabledEnforcedAU-9(3), SC-8(3), SC-8(4), SC-13(a), SC-28(1), SI-19(4)
DynamoDB tables should have encryption enabledEnforcedAU-9(3), SC-8(3), SC-8(4), SC-13(a), SC-28(1), SI-19(4)
DynamoDB tables should have point-in-time recovery enabledEnforcedCP-1(2), CP-2(5), CP-6(2), CP-9(a), CP-9(b), CP-9(c), CP-10(2), SC-5(2), SI-13(5), CP-10
Attached EBS volumes should have encryption enabledEnforcedAU-9(3), CM-6(a), CM-9(b), CP-9(d), SC-8(3), SC-8(4), SC-13(a), SC-28(1), SI-19(4)
EC2 instances should have IAM profile attachedEnforcedAC-3, CM-5(1)(a), CM-6(a), IA-3(4), IA-9
EC2 instances should be in a VPCEnforcedSC-25
EC2 instances should not have a public IP addressEnforcedAC-2(6), AC-3(7), AC-4(21), AC-6, AC-17(1), AC-17(4)(a), AC-17(9), AC-17(10), AC-17(b), AC-3, MP-2, SC-7(2), SC-7(3), SC-7(7), SC-7(9)(a), SC-7(11), SC-7(12), SC-7(16), SC-7(20), SC-7(21), SC-7(24)(b), SC-7(25), SC-7(26), SC-7(27), SC-7(28), SC-7(a), SC-7(b), SC-7(c), SC-25
EC2 instances should use IMDSv2EnforcedAC-2(6), AC-3(3), AC-3(3)(a), AC-3(3)(b)(1), AC-3(3)(c), AC-3(4), AC-3(4)(a), AC-3(4)(b), AC-3(4)(c), AC-3(4)(d), AC-3(4)(e), AC-3(7), AC-3(8), AC-3(12)(a), AC-3(13), AC-3(15)(a), AC-3(15)(b), AC-4(28), AC-6, AC-24, AC-3, CM-5(1)(a), MP-2, SA-8(20), SC-23(3)
ECR repositories should have image scan on push enabledEnforcedSI-2(2), SI-2(5)
EFS file systems should have encryption at rest enabledEnforcedAU-9(3), CP-9(d), SC-8(3), SC-8(4), SC-13(a), SC-28(1), SI-19(4)
ELB application and classic load balancer logging should be enabledEnforcedAC-4(26), AU-2(b), AU-3(a), AU-3(b), AU-3(c), AU-3(d), AU-3(e), AU-3(f), AU-6(3), AU-6(4), AU-6(6), AU-6(9), AU-8(b), AU-12(1), AU-12(2), AU-12(3), AU-12(4), AU-12(a), AU-12(c), AU-14(3), AU-14(a), AU-14(b), CA-7(b), CM-5(1)(b), PM-31, IA-3(3)(b), MA-4(1)(a), AU-10, PM-14(a)(1), PM-14(b), SC-7(9)(b), SI-4(17), SI-7(8)
ELB application load balancer deletion protection should be enabledEnforcedSC-22, CA-7(4)(c), CM-2(2), CM-2(a), CM-3(a), CM-8(6), CP-1(a)(1)(b), CP-2(5), CP-2(a), CP-2(d), CP-2(e), SA-15(a)(4), SC-5(2)
ELB network load balancers should have TLS listener security policy configuredEnforcedSC-8(1)
ELB listeners should use approved SSL/TLS protocol versionsEnforcedSC-8(1), SC-23(5)
KMS CMK rotation should be enabledEnforcedCM-6(a), CM-9(b), SC-12, SA-9(6), SC-12(2), SC-12(6)
Lambda functions should have concurrent execution limit configuredEnforcedSC-6
Lambda functions should be in a VPCEnforcedSC-25
Lambda functions should restrict public URLEnforcedAC-2(6), AC-3(7), AC-4(21), AC-6, AC-17(1), AC-17(4)(a), AC-17(9), AC-17(10), AC-17(b), AC-3, MP-2, SC-7(2), SC-7(3), SC-7(7), SC-7(9)(a), SC-7(11), SC-7(12), SC-7(16), SC-7(20), SC-7(21), SC-7(24)(b), SC-7(25), SC-7(26), SC-7(27), SC-7(28), SC-7(a), SC-7(b), SC-7(c), SC-25
Log groups should have encryption at rest enabledEnforcedAU-9(3), CP-9(d), SC-8(3), SC-8(4), SC-13(a), SC-28(1), SI-19(4)
OpenSearch domains should have encryption at rest enabledEnforcedAU-9(3), CP-9(d), SC-8(3), SC-8(4), SC-13(a), SC-28(1), SI-19(4)
OpenSearch domains should have logging to CloudWatch Logs enabledEnforcedAU-10
OpenSearch domains node-to-node encryption should be enabledEnforcedAC-4(22), AC-24(1), AU-9(3), CA-9(b), AC-4, PM-17(b), SC-7(4)(b), SC-7(4)(g), SC-8(1), SC-8(2), SC-8(3), SC-8(4), SC-8(5), SC-13(a), SC-23, SI-1(a)(2), SC-8
RDS DB instances and clusters should have enhanced monitoring enabledEnforcedAU-12(3), AU-14(a), AU-14(b), CA-2(2), CA-7(b), CA-7, PM-31, PM-14(a)(1), PM-14(b), SC-36(1)(a), SI-2(a)
RDS DB instance backup should be enabledEnforcedCP-1(2), CP-2(5), CP-6(1), CP-6(2), CP-6(a), CP-9(a), CP-9(b), CP-9(c), CP-10(2), SC-5(2), SI-13(5), CP-10
RDS DB instances should be integrated with CloudWatch logsEnforcedAC-2(4), AC-3(1), AC-3(10), AC-4(26), AC-6(9), AU-2(b), AU-3(a), AU-3(b), AU-3(c), AU-3(d), AU-3(e), AU-3(f), AU-6(3), AU-6(4), AU-6(6), AU-6(9), AU-8(b), AU-12(1), AU-12(2), AU-12(3), AU-12(4), AU-12(a), AU-12(c), AU-14(3), AU-14(a), AU-14(b), CA-7(b), CM-5(1)(b), PM-31, IA-3(3)(b), MA-4(1)(a), AU-10, PM-14(a)(1), PM-14(b), SC-7(9)(b), SI-1(1)(c), SI-3(8)(b), SI-4(2), SI-4(17), SI-4(20), SI-7(8), SI-10(1)(c)
RDS DB instances should have deletion protection enabledEnforcedSC-22, CA-7(4)(c), CM-3(a), CP-1(a)(1)(b), CP-2(5), CP-2(a), CP-2(d), CP-2(e), SA-15(a)(4), SC-5(2), SI-13(5)
RDS DB instance encryption at rest should be enabledEnforcedAU-9(3), CP-9(8), CP-9(d), SC-8(3), SC-8(4), SC-13(a), SC-28(1), SI-19(4)
RDS DB instances should have multiple AZ enabledEnforcedSC-22, CP-1(a)(1)(b), CP-2(5), CP-2(6), CP-2(a), CP-2(d), CP-2(e), CP-6(2), SC-36, SC-6, SC-5(2), SI-13(5), CP-10
RDS DB instances should prohibit public accessEnforcedSC-25
Redshift clusters should have audit logging enabledEnforcedAC-2(4), AC-3(1), AC-3(10), AC-4(26), AC-6(9), AU-2(b), AU-3(a), AU-3(b), AU-3(c), AU-3(d), AU-3(e), AU-3(f), AU-6(3), AU-6(4), AU-6(6), AU-6(9), AU-8(b), AU-9(3), AU-12(1), AU-12(2), AU-12(3), AU-12(4), AU-12(a), AU-12(c), AU-14(3), AU-14(a), AU-14(b), CA-7(b), CM-5(1)(b), PM-31, CP-9(d), IA-3(3)(b), MA-4(1)(a), AU-10, PM-14(a)(1), PM-14(b), SC-7(9)(b), SC-8(3), SC-8(4), SC-13(a), SC-28(1), SI-1(1)(c), SI-3(8)(b), SI-4(2), SI-4(17), SI-4(20), SI-7(8), SI-10(1)(c), SI-19(4)
Redshift clusters should have automatic upgrades to major versions enabledEnforcedCM-2(b), CM-3(3), CP-9(a), CP-9(b), CP-9(c), SC-5(2), SI-2(2), SI-2(5), SI-2(c), SI-2(d)
Redshift clusters should prohibit public accessEnforcedSC-25
S3 buckets should have default encryption enabledEnforcedAU-9(3), SC-28(1)
S3 buckets should have default encryption enabled using KMSEnforcedAU-9(3), SC-28(1)
S3 buckets should have logging enabledEnforcedAC-2(4), AC-3(1), AC-3(10), AC-4(26), AC-6(9), AU-2(b), AU-3(a), AU-3(b), AU-3(c), AU-3(d), AU-3(e), AU-3(f), AU-6(3), AU-6(4), AU-6(6), AU-6(9), AU-8(b), AU-12(1), AU-12(2), AU-12(3), AU-12(4), AU-12(a), AU-12(c), AU-14(3), AU-14(a), AU-14(b), CA-7(b), CM-5(1)(b), CM-6(a), CM-9(b), PM-31, IA-3(3)(b), MA-4(1)(a), AU-10, PM-14(a)(1), PM-14(b), SC-7(9)(b), SI-1(1)(c), SI-3(8)(b), SI-4(2), SI-4(17), SI-4(20), SI-7(8), SI-10(1)(c)
S3 buckets should not be accessible to all authenticated usersEnforcedAC-2(6), AC-3(7), AC-4(21), AC-6, AC-17(1), AC-17(4)(a), AC-17(9), AC-17(10), AC-17(b), AC-3, CM-6(a), CM-9(b), MP-2, SC-7(2), SC-7(3), SC-7(7), SC-7(9)(a), SC-7(11), SC-7(12), SC-7(16), SC-7(20), SC-7(21), SC-7(24)(b), SC-7(25), SC-7(26), SC-7(27), SC-7(28), SC-7(a), SC-7(b), SC-7(c), SC-25
S3 buckets should prohibit public read accessEnforcedAC-2(6), AC-3(7), AC-4(21), AC-6, AC-17(1), AC-17(4)(a), AC-17(9), AC-17(10), AC-17(b), AC-3, CM-6(a), CM-9(b), MP-2, SC-7(2), SC-7(3), SC-7(7), SC-7(9)(a), SC-7(11), SC-7(12), SC-7(16), SC-7(20), SC-7(21), SC-7(24)(b), SC-7(25), SC-7(26), SC-7(27), SC-7(28), SC-7(a), SC-7(b), SC-7(c), SC-25
S3 buckets should prohibit public write accessEnforcedAC-2(6), AC-3(4), AC-3(7), AC-4(21), AC-6, AC-17(1), AC-17(4)(a), AC-17(9), AC-17(10), AC-17(b), AC-3, CM-6(a), CM-9(b), MP-2, SC-7(2), SC-7(3), SC-7(7), SC-7(9)(a), SC-7(11), SC-7(12), SC-7(16), SC-7(20), SC-7(21), SC-7(24)(b), SC-7(25), SC-7(26), SC-7(27), SC-7(28), SC-7(a), SC-7(b), SC-7(c), SC-25
S3 buckets with versioning enabled should have lifecycle policies configuredEnforcedAU-11, SI-14(2)
S3 buckets should have versioning enabledEnforcedAU-9(2), CP-1(2), CP-2(5), CP-6(1), CP-6(2), CP-6(a), CP-9(a), CP-9(b), CP-9(c), CP-10(2), PM-11(b), PM-17(b), SC-5(2), SC-16(1), SI-1(a)(2), SI-13(5), CP-10
S3 public access should be blocked at account levelEnforcedSC-25
S3 public access should be blocked at bucket levelEnforcedAU-9(2), SC-25
SNS topics should be encrypted at restEnforcedAU-9(3), CP-9(d), SC-8(3), SC-8(4), SC-13(a), SC-28(1)
VPC Security groups should only allow unrestricted incoming traffic for authorized portsEnforcedSC-7, SC-7(13)
VPC security groups should restrict ingress from 0.0.0.0/0 or ::/0 to cassandra ports 7199 or 9160 or 8888EnforcedSC-7(13)
VPC subnet auto assign public IP should be disabledEnforcedSC-25
API Gateway REST API stages should have a client certificate configuredMappedAC-4(22), AC-17(2), AC-24(1), AU-9(3), CA-9(b), IA-5(1)(c), AC-4, PM-17(b), SC-7(4)(b), SC-7(4)(g), SC-7(5), SC-8(1), SC-8(2), SC-8(3), SC-8(4), SC-8(5), SC-13(a), SC-23, SI-1(a)(2), SC-8
API Gateway stages should have logging enabledMappedAC-4(26), AU-2(b), AU-3(a), AU-3(b), AU-3(c), AU-3(d), AU-3(e), AU-3(f), AU-6(3), AU-6(4), AU-6(6), AU-6(9), AU-8(b), AU-12(1), AU-12(2), AU-12(3), AU-12(4), AU-12(a), AU-12(c), AU-14(3), AU-14(a), AU-14(b), CA-7(b), CM-5(1)(b), PM-31, IA-3(3)(b), MA-4(1)(a), AU-10, PM-14(a)(1), PM-14(b), SC-7(9)(b), SI-4(17), SI-7(8)
CloudFormation stacks should have notifications enabledMappedCM-8(3)
CloudTrail trails should be integrated with CloudWatch logsMappedAC-2(4), AC-3(1), AC-3(10), AC-4(26), AC-6(9), AU-2(b), AU-3(a), AU-3(b), AU-3(c), AU-3(d), AU-3(e), AU-3(f), AU-4(1), AU-6(1), AU-6(3), AU-6(4), AU-6(5), AU-6(6), AU-6(9), AU-7(1), AU-8(b), AU-9(7), AU-12(1), AU-12(2), AU-12(3), AU-12(4), AU-12(a), AU-12(c), AU-14(3), AU-14(a), AU-14(b), CA-7(b), CM-5(1)(b), CM-6(a), CM-9(b), PM-31, AU-16, IA-3(3)(b), MA-4(1)(a), AU-10, PM-14(a)(1), PM-14(b), SC-7(9)(b), SI-1(1)(c), SI-3(8)(b), SI-4(2), SI-4(17), SI-4(20), SI-7(8), SI-10(1)(c)
CloudTrail trails should have logs encrypted using a customer managed KMS keyMappedAU-9(3), CM-6(a), CM-9(b), CP-9(d), SC-8(3), SC-8(4), SC-13(a), SC-28(1), SI-19(4)
CloudTrail trails should have log file validation enabledMappedAU-9(a), CM-6(a), CM-9(b), PM-11(b), PM-17(b), SA-1(1), SA-10(1), SC-16(1), SI-1(a)(2), SI-4(d), SI-7(1), SI-7(3), SI-7(7), SI-7(a)
ES domain encryption at rest should be enabledMappedAU-9(3), CP-9(d), SC-8(3), SC-8(4), SC-13(a), SC-28(1), SI-19(4)
ES domains should be in a VPCMappedSC-25
Elasticsearch domain should send logs to CloudWatchMappedAU-10
Elasticsearch domain node-to-node encryption should be enabledMappedAC-4(22), AC-24(1), AU-9(3), CA-9(b), AC-4, PM-17(b), SC-7(4)(b), SC-7(4)(g), SC-8(1), SC-8(2), SC-8(3), SC-8(4), SC-8(5), SC-13(a), SC-23, SI-1(a)(2), SC-8
IAM password policies should have minimum length set to 14 or greaterMappedAC-2(1), AC-2(3), AC-2(3)(a), AC-2(3)(b), AC-2(3)(c), AC-2(3)(d), AC-2(d)(1), AC-3(3), AC-3(3)(a), AC-3(3)(b)(1), AC-3(3)(c), AC-3(4), AC-3(4)(a), AC-3(4)(b), AC-3(4)(c), AC-3(4)(d), AC-3(4)(e), AC-3(8), AC-3(12)(a), AC-3(13), AC-3(15)(a), AC-3(15)(b), AC-4(28), AC-7(4), AC-7(4)(a), AC-24, CM-5(1)(a), CM-6(a), CM-9(b), CM-12(b), IA-4(d), IA-5, IA-5(1)(f), IA-5(1)(g), IA-5(1)(h), IA-5(18)(a), IA-5(18)(b), IA-5(b), IA-5(c), IA-5(d), IA-5(f), IA-5(h), IA-8(2)(b), MA-4(c), SC-23(3)
SageMaker notebook instances should not have direct internet accessMappedAC-2(6), AC-3(7), AC-4(21), AC-6, AC-17(1), AC-17(4)(a), AC-17(9), AC-17(10), AC-17(b), AC-3, MP-2, SC-7(2), SC-7(3), SC-7(7), SC-7(9)(a), SC-7(11), SC-7(12), SC-7(16), SC-7(20), SC-7(21), SC-7(24)(b), SC-7(25), SC-7(26), SC-7(27), SC-7(28), SC-7(a), SC-7(b), SC-7(c), SC-25
SageMaker notebook instance encryption should be enabledMappedAU-9(3), CP-9(d), SC-8(3), SC-8(4), SC-13(a), SC-28(1), SI-19(4)

Enforced or mapped without a named NIST 800-53 clause

The catalog lists these 34 controls under NIST 800-53 but names no NIST 800-53 clause for them, so the register and the counts in F.3 leave them out. Each still links to its docs page.

ControlStatus
CloudFront distributions should use the recommended TLS security policyEnforced
EC2 instances should have EBS optimization enabledEnforced
EFS file systems should be encrypted with CMKEnforced
ElastiCache Redis clusters should have automatic backups enabled with a retention period of 15 days or greaterEnforced
ELB application and network load balancers should use recommended security policiesEnforced
ELB application and network load balancer listeners should use ACM certificatesEnforced
ELB application and network load balancer listeners should use secure protocolsEnforced
ELB classic load balancers should have cross-zone load balancing enabledEnforced
Lambda functions should be configured with a dead-letter queueEnforced
RDS DB clusters should have automatic minor version upgrade enabledEnforced
RDS clusters should have deletion protection enabledEnforced
RDS DB instance automatic minor version upgrade should be enabledEnforced
RDS DB instances backup retention period should be greater than or equal to 7Enforced
RDS DB instances should have logging enabledEnforced
RDS for MariaDB DB instances should publish logs to CloudWatch LogsEnforced
RDS DB instances should not use public subnetEnforced
RDS for PostgreSQL DB instances should publish logs to CloudWatch LogsEnforced
RDS for SQL Server DB instances should publish logs to CloudWatch LogsEnforced
Redshift clusters should have automatic snapshots enabledEnforced
Redshift cluster encryption in transit should be enabledEnforced
Redshift clusters should have audit logging and encryption enabledEnforced
Redshift clusters should have enhanced VPC routing enabledEnforced
Redshift clusters should have KMS encryption enabledEnforced
Redshift clusters should have required maintenance settingsEnforced
S3 buckets should have cross-region replication enabledEnforced
S3 buckets should have lifecycle policies configuredEnforced
S3 buckets should have policies that prohibit public accessEnforced
Secrets Manager secrets should be encrypted using CMKEnforced
API Gateway stages should have cache encryption at rest enabledMapped
CloudTrail trails should have at least one enabled trail present in a regionMapped
IAM password policies should have strong configurations with minimum length of 8 or greaterMapped
IAM password policies should have strong configurationsMapped
S3 buckets should have object logging enabledMapped
SageMaker endpoint configuration encryption should be enabledMapped

Clause IDs for the assessor. Your stack stays as it is.

Compliance.tf works alongside your scanners, plan policy, CSPM and GRC tool. It sets the controls in the modules and lists the clause each one is there for.

F.5

Evidence

F.5.1

What compliance.tf gives your assessor

  • The NIST 800-53 clause IDs behind each enforced setting, with stable control IDs and public docs pages.
  • The config snapshot bound to each environment, and the per-action audit log of promotions between environments.
F.5.2

What comes from your AWS account and GRC tool

Evidence of what actually runs comes from your own account, for example AWS Config and your CSPM. Your GRC tool keeps tracking policies and audit workflows.

F.6

Plans for NIST 800-53

NIST 800-53 is in the 30-day trial and in Full Access, $1,000 a year on AWS Marketplace. Schedule of fees.

F.7

Questions about NIST 800-53

F.7.1

Is this Rev 4 or Rev 5?

Compliance.tf maps controls to NIST 800-53 Revision 5, the current version published in September 2020. Rev 5 added privacy controls and reorganized several control families. If you need Rev 4 mappings for legacy authorization packages, contact us.

F.7.2

Which control families does this cover?

Compliance.tf enforces controls from the families tied to infrastructure configuration, for example Access Control (AC), Audit and Accountability (AU), System and Communications Protection (SC), Contingency Planning (CP), System and Information Integrity (SI), Configuration Management (CM), Identification and Authentication (IA), Assessment, Authorization, and Monitoring (CA), and System and Services Acquisition (SA). The control register lists every family with its controls.

F.7.3

Can I adopt this gradually, or is it all-or-nothing?

Fully incremental. Start with one module in one environment. Your existing modules continue working untouched. If you use Terragrunt or Terramate to orchestrate your runs, nothing changes - you're only swapping the module source line. There is no global policy agent to deploy, no wrapper binary, no sidecar. Each module source line is independent.

F.7.4

What if we want to switch back?

Each module keeps the inputs and outputs of its terraform-aws-modules counterpart and needs no state migration, so switching back is the same source line change in reverse.