Simpler.Grants.gov Public Wiki
Grants.govSimpler.Grants.govGitHubDiscourse
  • 👋Welcome
  • GET INVOLVED
    • Why open source?
    • How to contribute code
    • How to file issues
      • Report a bug
      • Request a feature
      • Report a security vulnerability
    • Community guidelines
      • Code of Conduct
      • Reporting and removing content
      • Incident response protocol
    • Community events
      • Fall 2024 Coding Challenge
        • Event Submissions & Winners
      • Spring 2025 Collaborative Coding Challenge
        • Event Submissions & Winners
    • Communication channels
  • Product
    • Roadmap
    • Deliverables
      • 🏁Static site soft launch
      • 🏁Static site public launch
      • 🏁GET Opportunities
      • 🏁Open source onboarding
      • 🏁Co-Design Group planning
    • Decisions
      • ADR Template
      • ADRs
        • Dedicated Forum for Simpler.Grants.gov Community
        • Recording Architecture Decisions
        • Task Runner for the CI / CD Pipeline
        • API Language
        • Use Figma for design prototyping
        • ADR: Chat
        • DB Choices
        • API Framework and Libraries
        • Back-end Code Quality Tools
        • Front-end Language
        • Communications Tooling: Wiki Platform
        • Use Mural for design diagrams and whiteboarding
        • Ticket Tracking
        • Front-end Framework
        • Front-end Code Quality Tools
        • Front-end Testing & Coverage
        • Backend API Type
        • Front-end Testing & Coverage
        • Deployment Strategy
        • Use U.S. Web Design System for components and utility classes
        • FE server rendering
        • Use NPM over Yarn Architectural Decision Records
        • U.S. Web Design System in React
        • Communications Tooling: Video Conferencing
        • Back-end Production Server
        • Communications Tooling: Analytics Platform
        • Commit and Branch Conventions and Release Workflow
        • Cloud Platform to Host the Project
        • Infrastructure as Code Tool
        • Data Replication Strategy & Tool
        • HHS Communications Site
        • Communications Tooling: Email Marketing
        • Communications Tooling: Listserv
        • Use Ethnio for design research
        • Uptime Monitoring
        • Database Migrations
        • 30k ft deliverable reporting strategy
        • Public measurement dashboard architecture
        • Method and technology for "Contact Us" CTA
        • E2E / Integration Testing Framework
        • Logging and Monitoring Platform
        • Dashboard Data Storage
        • Dashboard Data Tool
        • Search Engine
        • Document Storage
        • Document Sharing
        • Internal Wiki ADR
        • Shared Team Calendar Platform
        • Cross-Program Team Health Survey Tool
        • Adding Slack Users to SimplerGrants Slack Workspace
        • Repo organization
        • Internal knowledge management
        • Migrate Existing API Consumers
      • Infra
        • Use markdown architectural decision records
        • CI/CD interface
        • Use custom implementation of GitHub OIDC
        • Manage ECR in prod account module
        • Separate terraform backend configs into separate config files
        • Database module design
        • Provision database users with serverless function
        • Database migration architecture
        • Consolidate infra config from tfvars files into config module
        • Environment use cases
        • Production networking long term state
    • Analytics
      • Open source community metrics
      • API metrics
  • DESIGN & RESEARCH
    • Brand guidelines
      • Logo
      • Colors
      • Grid and composition
      • Typography
      • Iconography
      • Photos and illustrations
    • Content guidelines
      • Voice and tone
    • User research
      • Grants.gov archetypes
  • REFERENCES
    • Glossary
  • How to edit the wiki
Powered by GitBook
On this page
  • Context and Problem Statement
  • Decision Drivers
  • Options Considered
  • Decision Outcome
  • Positive Consequences
  • Negative Consequences
  • Pros and Cons of the Options
  • Terraform with Docker
  • CloudFormation with Docker
  • Cloud Development Kit with Docker
  • Chef with Ansible

Was this helpful?

Edit on GitHub
  1. Product
  2. Decisions
  3. ADRs

Infrastructure as Code Tool

PreviousCloud Platform to Host the ProjectNextData Replication Strategy & Tool

Last updated 28 days ago

Was this helpful?

  • Status: Accepted

  • Last Modified: 2023-07-14

  • Related Issue:

  • Deciders: Lucas, Aaron, Billy

  • Tags: Hosting, Infrastructure

Context and Problem Statement

Infrastructure as Code (IaC) is the process of using code to manage hosting infrastructure. IaC is desirable because it produces more efficient, reproducable, readable, and interoperable deployment workflows.

IaC tools often have overlapping feature-sets and strategies, however they can be broadly characterized by provisioning versus configuration, mutable versus immutable, and procedural versus declarative. A tool or set of tools should should be selected for the project in order to best facilitate change management.

Decision Drivers

  • Interoperability: The tools should support multiple hosting providers.

  • Declarative: The tools should support a declarative syntax.

  • Immutability: The tools should support an immutable approach to infrastructure management.

  • Support and Documentation: The tools should have excellent documentation and example use-cases.

  • Adoption: The tools should have broad adoption to make it easier for the public to utilize the project code, get assistance from outside resources if necessary, and potentially grow the team.

Options Considered

  • Terraform with Docker

  • CloudFormation with Docker

  • Cloud Development Kit with Docker

  • Chef with Ansible

Decision Outcome

The project will use Terraform with Docker for provisioning infrastructure and creating and configuring images.

Positive Consequences

  • The provisioning and configuration of infrastracture supporting the project will be captured in code using widely adopted, open source, and well-documented tools.

  • Deployments can be tested in lower environments using the same configuration as higher environments.

  • IaC supports continuous and automated deployment for lower environments and production.

  • History of changes to infratstructure is stored in version control which provides better auditability, an easy-to-read record of changes, and an easier path to reversion of changes.

  • Infrastructure updates are faster and more reliable.

Negative Consequences

  • Infrastrcture takes longer to deploy initially.

Pros and Cons of the Options

Terraform with Docker

  • Pros

    • Docker images offer a widely adopted and developer-friendly mechanism that captures most aspects of configuration management.

    • Terraform with Docker best aligns with the each of the decision drivers.

    • The engineering team has Terraform templates and modules that can be used on the project, experience using Terraform, and institutional support for the tool.

  • Cons

CloudFormation with Docker

  • Pros

    • CloudFormation is created and supported by AWS.

    • Tool is well-documented with many templates for projects and user interface tools.

    • Tool is free with AWS account.

  • Cons

    • Tool is closed-source, procedural, and not interoperable.

    • Tool is not modular which makes it harder to share recipes or configurations for similar tools or features.

    • Testing is not well supported.

    • Poor perceived developer experience.

Cloud Development Kit with Docker

  • Pros

    • Cloud Development Kit is created and supported by AWS.

    • Tool supports many of the decision drivers.

    • Allows developers to use programming languages used in the API and front-end to manage cloud infrastructure.

  • Cons

    • Tool is not open source.

    • Tool is not interoperable.

    • Tool is relatively new and not widely adopted.

    • Engineers on the team and supporting instutions have low level of experience with the tool.

Chef with Ansible

  • Pros

    • Chef and Ansible are open source, interoperable, widely adopted, and well-documented.

  • Cons

    • Tools are procedural, which can lead to unexpected outcomes and fragile deployments.

    • Docker captures most aspects of configuration management in a developer-friendly and immutable format.

Terraform is interoperable, widely adopted (with as example metric), has excellent documentation, and supports declarative and immutable strategies.

Terraform has changed its license from the which could affect the community support for and adoption of the tool.

#93
37K stars
Mozilla Public License (v2.0) to the Business Source License (v1.1)