Kief Morris Infrastructure as Code Designing and Delivering Dynamic Systems for the Cloud Age 3rd Edition
9 7 8 1 0 9 8 1 5 0 3 5 8 5 7 9 9 9 ISBN: 978-1-098-15035-8 US $79.99 CAN $99.99 SOF T WARE DEVELOPMENT Kief Morris is a distinguished engineer at Thoughtworks, where he helps clients and teams apply cloud and infrastructure technology to deliver stronger value more quickly and reliably. He’s been designing, building, and running automated IT server infrastructure for more than 20 years, working with everything from shell scripts and Perl to CFEngine, Puppet, Chef, Ansible, and more. The past decade has seen cloud and Infrastructure as Code move out of shadow IT and startups and into the mainstream. Many organizations rushed to adopt new technologies as part of their transformation into digital businesses, creating a sprawl of unmaintainable infrastructure codebases. Now, there’s a need to consolidate cloud-based systems into mature foundations for sustainable growth. With this book, Kief Morris describes patterns and practices for building and evolving Infrastructure as Code. This updated third edition provides a broader context for infrastructure, explaining how to design and implement infrastructure to better support the strategic goals and challenges of an organization, such as supporting growth while better managing costs. This book covers: • Foundational concepts, including an exploration of declarative and procedural infrastructure languages • Infrastructure architecture, drawing on lessons learned from software design and engineering to build infrastructure codebases that can be evolved • Patterns for building infrastructure to support platform services across the complicated, varied landscapes of real-world IT systems • Workflows and operating models that combine automation and cloud with forward-thinking approaches like Agile and DevOps Infrastructure as Code “Essential reading for anyone getting into the Infrastructure as Code space.” Yevgeniy Brikman Cofounder of Gruntwork and author of Terraform: Up and Running
Praise for Infrastructure as Code, Third Edition Infrastructure as Code is one of those fundamental approaches that everyone talks about as a high level idea, usually pointing at their favorite tool as the way to deliver it; but if you want to make it work, you need to understand the techniques involved, not just the tools. Infrastructure as Code, the book, delivers that understanding so you can work with your choice of tools and platforms as they evolve and this new edition brings one of the definitive books on the topic up to date with newer technologies like containers and serverless, and more recent tools. —Mary Branscombe, freelance technology journalist and author An essential guide to using code to manage infrastructure wherever it may be, on premises or in the cloud. —Simon Bisson, freelance technology writer Essential reading for anyone getting into the Infrastructure as Code space. This book manages to cover a lot of ground, while delivering deep insights at each step of the way, including exploring the core principles and practices of cloud infrastructure, the tools available today, and the techniques for managing servers, environments, applications, workflows, automated tests, governance, and more. —Yevgeniy Brikman, Cofounder of Gruntwork and author of Terraform: Up and Running Fair warning: this book will transform the way you approach Infrastructure as Code. It challenges you to think beyond today’s solutions and push the boundaries of infrastructure management. Its insights, attention to real-life scenarios, and understanding of the developer perspective are timeless, and will remain relevant in the ever-evolving technology landscape. —Lipi Deepaakshi Patnaik, Senior Software Developer, Zeta Suite
This 3rd edition is a natural evolution of the 1st and 2nd editions. Where the 1st edition is primarily focused on managing virtual machines, and the 2nd is on the divide between VMs and cloud, this 3rd edition is full on managing cloud infrastructure. But…staying equal to itself, it is a principles, practices, and patterns book. That is what I especially like about the Infrastructure as Code book. Although the book gives some tooling references, which can be helpful, it is not a book on how I can do something with my favorite tool. It is especially focused on understanding the baseline, i.e., mastering the principles. Once we recognize this, we can design and implement infrastructure code and resources most effectively. —Thierry de Pauw, ThinkingLabs
Kief Morris Infrastructure as Code Designing and Delivering Dynamic Systems for the Cloud Age THIRD EDITION
978-1-098-15035-8 [LSI] Infrastructure as Code by Kief Morris Copyright © 2025 Kief Morris. All rights reserved. Printed in the United States of America. Published by O’Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472. O’Reilly books may be purchased for educational, business, or sales promotional use. Online editions are also available for most titles (http://oreilly.com). For more information, contact our corporate/institutional sales department: 800-998-9938 or corporate@oreilly.com. Acquisitions Editor: John Devins Development Editor: Jill Leonard Production Editor: Beth Kelly Copyeditor: Sharon Wilkey Proofreader: Kim Cofer Indexer: Potomac Indexing, LLC Interior Designer: David Futato Cover Designer: Karen Montgomery Illustrator: Kate Dullea June 2016: First Edition December 2020: Second Edition March 2025: Third Edition Revision History for the Third Edition 2025-03-13: First Release See http://oreilly.com/catalog/errata.csp?isbn=9781098150358 for release details. The O’Reilly logo is a registered trademark of O’Reilly Media, Inc. Infrastructure as Code, the cover image, and related trade dress are trademarks of O’Reilly Media, Inc. While the publisher and the author have used good faith efforts to ensure that the information and instructions contained in this work are accurate, the publisher and the author disclaim all responsibility for errors or omissions, including without limitation responsibility for damages resulting from the use of or reliance on this work. Use of the information and instructions contained in this work is at your own risk. If any code samples or other technology this work contains or describes is subject to open source licenses or the intellectual property rights of others, it is your responsibility to ensure that your use thereof complies with such licenses and/or rights.
Table of Contents Preface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii Part I. Foundations 1. What Is Infrastructure as Code?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Infrastructure as Code 4 From the Iron Age to the Cloud Age 5 Cloud Age Approaches to Change Management 5 The Path to the Cloud Age 7 Strategic Goals and Infrastructure as Code 9 System Architecture Goals and Infrastructure as Code 12 Use Infrastructure as Code to Optimize for Change 13 Myth: Infrastructure Doesn’t Change Very Often 13 Myth: We Can Build the Infrastructure First and Automate It Later 14 Myth: Speed and Quality Are Trade-Offs 15 The Four Key Metrics 18 Core Practices for Infrastructure as Code 18 Define Everything as Code 19 Continually Test and Deliver All Work in Progress 19 Build Small, Simple Pieces That Can Change Independently 19 Conclusion 20 2. Principles of Cloud Infrastructure. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Assume Systems Are Unreliable 22 Make Everything Reproducible 22 Avoid Snowflake Systems 23 Create Disposable Things 24 v
Minimize Variation 24 Ensure That Any Procedure Can Be Repeated 28 Apply Software Design Principles to Infrastructure Code 29 Conclusion 29 3. Infrastructure Platforms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Infrastructure Platforms 33 Infrastructure Resources 36 IaaS in the Data Center 39 Multicloud 40 Engineering Platforms 41 Platform Services 42 Providing Platform Service Functionality 43 Platform Delivery Services 45 Application Delivery Services 46 Infrastructure Delivery Services 46 Platform Management Services 46 Conclusion 47 4. Infrastructure as Code Tools and Languages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 Coding Infrastructure 50 Moving Beyond Task-Based Scripting 50 Understanding What You Can Define as Code 50 Code or Configuration? 52 Defining Configuration as Code 53 Managing Your Code in a Source Code Repository 53 Infrastructure Code Processing 54 Understanding When Code Executes 54 Processing and Deploying Infrastructure Code 55 Previewing Changes 57 Tracing Infrastructure Code Execution 57 Managing Infrastructure State 58 Infrastructure as Code Tools 58 Types of Languages for Coding Infrastructure 60 Procedural and Idempotent Code 61 Imperative and Declarative Languages and Tools 63 Domain-Specific and General-Purpose Languages 64 Low-Level and High-Level Languages 66 Infrastructure from Code 66 Conclusion 68 vi | Table of Contents
Part II. Design 5. Design Principles for Infrastructure as Code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Design Considerations for Infrastructure as Code 72 CUPID Properties for Design 72 Cohesion and Coupling 73 Providers, Consumers, and Interfaces 75 Management of Interfaces Between Components 76 Use of Interfaces for Composability 77 Design Across Infrastructure Code Lifecycle Stages 80 Design Forces 81 Design Forces for Source Code 81 Design Forces for Infrastructure Packaging and Deployment 82 Design Forces for Runtime 83 Design Forces Across Lifecycle Stages 86 Conclusion 89 6. Infrastructure Components. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 The Infrastructure Components 92 The Start of Infrastructure Design: Workloads 93 Infrastructure Compositions 94 Infrastructure Deployment Stacks 96 Infrastructure Code Libraries 97 Libraries as Deployable Stacks 98 Sharing and Reuse of Infrastructure Code 99 Sharing Infrastructure Code Components 99 Sharing Stack Code Across Multiple Instances 100 Sharing Stack Instances Across Workloads 101 Application-Driven Infrastructure Design 103 Horizontal Design 103 Vertical Design 104 Shared Infrastructure Included in Vertical Design 105 Reference Application-Driven Infrastructure Design 105 Design Workflow 107 Conclusion 108 7. Designing Deployable Infrastructure Stacks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 Patterns for Sizing and Structuring Stacks 111 Full System Stack 112 Monolithic Stack 113 Application Group Stack 115 Single Service Stack 117 Table of Contents | vii
Micro Stacks 119 Shared Stack 120 Stack Patterns for Multiple Instances of Infrastructure 121 Multi-Environment Stack 122 Snowflakes as Code 124 Reusable Stack 126 Conclusion 128 8. Configuring Infrastructure Stack Instances. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 Key Concepts 130 Use Stack Parameters to Create Unique Identifiers 131 Keep Parameters Simple 131 Example Stack 132 Patterns for Configuring Stacks 133 Configuration in Code 134 Manual Stack Parameters 136 Stack Environment Variables 137 Scripted Parameters 138 Stack Configuration Files 141 Deployment Wrapper Stack 145 Pipeline Stack Parameters 147 Stack Parameter Registry 150 Implementing a Configuration Registry 152 Integrated Infrastructure Automation Tool Registries 153 Standalone Packaged Configuration Registries 153 IaaS Platform Registry Services 154 Your Own Configuration Registry 154 Single or Multiple Configuration Registries 154 Handling Secrets 155 Generating Secrets 156 Storing Secrets in Encrypted Files 157 Using a Secrets Storage Service 157 Injecting Secrets at Runtime 158 Conclusion 159 9. Integrating Infrastructure Stacks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 Example Infrastructure Deployment Stacks 161 Resource Discovery Patterns 163 Resource Matching 163 Stack State Lookup 166 Integration Registry Lookup 168 Implementing Resource Discovery 170 viii | Table of Contents
Implementing Discovery in Stack Code 170 Using Dependency Injection 172 Managing Dependencies in a Deployment Script 172 Wiring Stacks Together with a Composition 173 Conclusion 174 10. Designing Infrastructure Code Libraries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Facade Module 175 Also Known As 176 Motivation 176 Applicability 176 Consequences 176 Implementation 177 Related Patterns 177 Obfuscation Module 177 Motivation 178 Applicability 178 Consequences 178 Implementation 178 Related Patterns 178 Unshared Module 179 Motivation 179 Applicability 179 Consequences 179 Implementation 179 Bundle Module 179 Motivation 180 Applicability 181 Consequences 181 Implementation 181 Related Patterns 181 Spaghetti Module 181 Motivation 182 Consequences 183 Implementation 183 Related Patterns 183 Infrastructure Domain Entity 184 Motivation 184 Applicability 184 Implementation 185 Related Patterns 185 Stack Module 185 Table of Contents | ix
Also Known As 185 Motivation and Applicability 186 Implementation 186 Modular Monolith 186 Motivation 186 Consequences 186 Implementation 186 Related Patterns 186 Conclusion 187 11. Building Servers as Code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 Defining Servers 190 What’s on a Server 190 Where Things Come From 191 Server Configuration Code 192 Server Roles 193 Creating and Provisioning a New Server Instance 194 Creating a Server by Using Network Provisioning 194 Creating an IaaS Server by Hand 195 Creating a Server as Part of a Stack 196 Creating a Server from an Event 196 Configuring a New Server Instance 197 Baking Images and Frying Instances 198 Pull Configuration with Initialization Scripts 198 Push Configuration with External Commands 199 Updating and Changing Servers 199 Push on Change 200 Continuous Configuration Synchronization 200 Changing Servers by Replacement 201 Immutable Server 202 Building Server Images 202 Hot-Cloning an Existing Server 204 Booting an OS Installer 204 Modifying a Stock Image 204 Orchestrating Image Building 205 Conclusion 206 12. Designing Environments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 Multi-Environment Architectures 208 Multiple Delivery Environments 209 Environments Split for Alignment 211 Aligning Environments to System Architecture 212 x | Table of Contents
Aligning Environments to Organizational Structure 213 Aligning Environments to Governance Concerns 215 Multiple Environment Replicas 216 Designing Environments for Operability Scenarios 216 Distributing Environments Geographically 217 Replicating Environments for User Bases 219 Environment Implementation Layers 220 Using Design Forces to Choose the Environment Implementation Layer 221 Testing and Delivering Changes to Environment Infrastructure 222 IaaS Resource Groups and Environments 222 Environments with Multiple Stacks 224 Conclusion 226 13. Providing Application Runtime Infrastructure. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 Application-Driven Infrastructure Design 229 Application Runtime Platforms 231 Servers as Code 231 Server Clusters as Code 232 Application Clusters as Code 232 Serverless Application Infrastructure 234 Cluster Topologies 237 Multiple Environments in One Cluster 237 One Cluster per Environment 238 Multiple Clusters per Environment 238 Cross-Environment Clusters 239 Conclusion 241 Part III. Delivery 14. Core Infrastructure Delivery Workflows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 Continuous Delivery Principles for Infrastructure as Code 246 Automate the Full Process 247 Make Changes Using Only the Automated Process 247 Ensure That Environments Are Consistent 248 Deliver Changes Comprehensively 248 Keep Delivery Cycles Short 248 Keep All Code Production-Ready 249 Ensure That Code and Deployed Resources Are Consistent 249 Minimize Disruption When Deploying Changes 250 Core Infrastructure Delivery Workflow 250 Development Stage 251 Table of Contents | xi
Build Stage 251 Test Stages 251 Release Stage 251 Run Stage 252 Workflow Cycles 252 Workflows and Team Topologies for Delivering Software and Infrastructure 254 Infrastructure Instance Management Teams 256 Full Stack Infrastructure Team 258 Infrastructure Enablement Team 259 Measuring Infrastructure Delivery Effectiveness 259 Conclusion 261 15. Building and Distributing Infrastructure as Code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 Build Stage: Preparing for Distribution 263 Code Processing Steps for Building and Deploying 265 Build on Deploy Workflow 266 Build Once, Deploy Many Workflow 267 Bundling or Locking Dependencies 268 Pull Requests and Trunk-Based Development 268 Distribution of Infrastructure Code 270 Distributing Code Branches as Artifacts 271 Distributing Stack Packages as Artifacts 272 Distributing Libraries as Artifacts 273 Integration Workflows 274 Fan-in: Integrating Components During Delivery 275 Federation: Integrating Components at Runtime 276 Monorepo: Integrating Components in the Build 277 Pretesting Infrastructure 279 Infrastructure Service Teams 280 Shared Infrastructure as a Service 281 Provisioning an Infrastructure Instance on Demand 283 Providing Deployable Infrastructure as a Component 284 Multiple Infrastructure Platform Teams 285 Conclusion 286 16. Implementing Infrastructure Delivery with Pipelines. . . . . . . . . . . . . . . . . . . . . . . . . . 287 Organizing Projects in a Codebase 288 Organizing Build Projects and Repositories 288 Organizing Types of Code 292 Working on Code Locally 295 Local IaaS Emulators 296 Personal IaaS Environments 296 xii | Table of Contents
Just Enough Environment 297 Designing Infrastructure Delivery Pipelines 298 Pipeline Stage Content 299 Pipeline Stage Actions 300 Pipeline Stage Context 301 Delivery Pipeline Software and Services 302 Using Delivery Orchestration Scripts 303 Conclusion 304 17. Infrastructure Code Testing Strategy. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307 Why Continually Test Infrastructure Code? 307 What Continual Testing Means 309 Immediate Testing and Eventual Testing 309 What Should We Test with Infrastructure? 310 Challenges with Testing Infrastructure Code 312 Tests for Declarative Code Often Have Low Value 313 Unit Testing Code Generation 315 Testing Infrastructure Code Is Slow 316 Dependencies Complicate Testing Infrastructure 317 Progressive Testing 318 Test Pyramid 319 Swiss Cheese Testing Model 320 Testing in Production 321 What You Can’t Replicate Outside Production 322 Managing the Risks of Testing in Production 323 Conclusion 324 18. Infrastructure Code Testing Implementation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 Offline Testing Stages for Stacks 326 Syntax Checking 327 Offline Static Code Analysis 327 Connected Static Code Analysis 328 Supply-Chain Checks 328 Local Infrastructure Emulators 329 Use Test Fixtures to Handle Dependencies 330 Use Test Fixtures to Replace Providers 330 Use Test Fixtures to Replace Consumers 331 Refactor Components So They Can Be Isolated 332 Online Testing Stages for Stacks 333 Preview: Seeing What Changes Will Be Made 334 Verification: Making Assertions About Infrastructure Resources 334 Outcomes: Proving Infrastructure Works Correctly 336 Table of Contents | xiii
Test Instance Lifecycles 337 Persistent Test Stack 337 Ephemeral Test Stack 339 Dual Persistent and Ephemeral Stack Stages 340 Periodic Stack Rebuild 341 Continuous Stack Reset 342 Test Orchestration 344 Consider Test Orchestration Tools 345 Support Local Testing 345 Avoid Tight Coupling with Pipeline Tools 345 Conclusion 346 19. Deploying Infrastructure. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 Understanding Software Deployment Strategies 348 Push Deployment for Software 348 Pull Deployment for Software 349 GitOps Deployment for Software 349 Using Infrastructure Deployment Strategies 351 Siloed Infrastructure Deployment 351 Application Infrastructure Descriptor 352 Infrastructure from Code 353 Running Infrastructure Deployments 354 Deploying Infrastructure Code from Your Computer 354 Deploying from a Central Service 355 Deploying from a Delivery Pipeline 356 Using an Infrastructure Code Deployment Service 357 Infrastructure as Data 358 Infrastructure Deployment Scripts 360 Triggering Infrastructure Deployments 361 Using Input Materials for Deployment 361 Manually Triggering Deployment 362 Automatically Triggering Deployment 363 Implementing Triggers 364 Conclusion 364 20. Changing Existing Infrastructure. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367 Changing a System Incrementally 369 Break a Change into Increments 369 Handle Incomplete Changes 370 Safely Changing Live Infrastructure 371 Manually Remap Live Infrastructure 374 Remap Live Infrastructure in Pipelines 377 xiv | Table of Contents
Define Changes to Live Infrastructure in Code 378 Script Live Infrastructure Changes 379 Use Expand and Contract to Incrementally Change Live Infrastructure 379 Minimizing Disruption When Deploying Changes 381 Blue-Green Deployments 381 Rolling Upgrades and Canary Releases 382 Managing Data When Changing Live Infrastructure 383 Store and Load 383 Use Continuous Data Transfer 384 Segregate Data Infrastructure 384 Separate Software and Data Changes 384 Use Continuous Disaster Recovery 385 Conclusion 385 21. Governance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387 Shift Left 388 Workflow for Shifting Left 388 Team Topologies for Shifting Left 390 Compliance as Code 391 Controls by Component Design Layer 392 Controls by Workflow 392 Conclusion 394 Index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 Table of Contents | xv
(This page has no text content)
1 The original content remains on this site as of January 2025, although it hasn’t been updated since 2007. Preface I began working as a systems administrator in a team that managed Unix servers and workstations at the Computer Science department of the University of Tennessee. From then, into the dot-com days and after, I’ve been drawn to applying what I learned about software development to automate managing servers and other infrastructure. I discovered the Infrastructures.org website in 2001,1 which was an eye-opener. The authors introduced me to Mark Burgess' pioneering infrastructure tool CFEngine and the value of automatically provisioning servers in a consistent, repeatable way, something I used to build physical servers in data centers for a series of startup and scale-up companies in the 2000s. Infrastructure as Code, as a term, appeared around the same time that Andrew Clay Shafer and Patrick Debois kicked off the DevOps movement with a talk at the Agile 2008 conference. The first uses I’ve found for the term “Infrastructure as Code” are from a talk called “Agile Infrastructure” that Shafer gave at the Velocity conference in 2009 and an article John Willis wrote summarizing the talk. Adam Jacob, who cofounded Chef, and Luke Kanies, founder of Puppet, also used the term around this time. Infrastructure as Code tools create the opportunity to work in ways that help you to deliver changes more frequently, quickly, and reliably, improving the overall quality of your systems. But the benefits don’t come from the tools themselves. They come from the way you use them. Innovators are creating new tools and techniques for building and managing infrastructure using code, as well as potential new genera‐ tions of tools that move beyond the “as code” paradigm. Whatever tools we use, the trick is to leverage the technology to embed quality, reliability, and compliance into the process of making changes. xvii
Why I Wrote This Book As cloud computing and Infrastructure as Code grew from a niche into the main‐ stream in the 2010s, I learned how to put Infrastructure as Code into practice by reading blog posts, attending talks, and working with various tools with consulting clients. I waited for one of the DevOps luminaries I admired to write a book I could share as a comprehensive collection of guidance for this practice. By the middle of the decade, they had yet to write it, so I outlined my ideas for what they should write, carried on fleshing it out, and ended up with the first edition of this book in 2016. The first edition focused on server configuration using tools like Chef and Puppet. The second edition in 2020 shifted to infrastructure “stacks” using tools like Amazon Web Services (AWS) Cloud Development Kit (CDK) and Terraform, with more interest in cloud native application runtimes like container clusters and serverless. With this third edition, the shift to using infrastructure code to provide application runtimes based on containers and serverless over configuring server images is much further along. More people are interested in coding infrastructure using general- purpose languages, as enabled by CDK and Pulumi, and are curious about shifting to integrating application and infrastructure code. As infrastructure engineers and architects, we need to know how infrastructure ena‐ bles value for the organization. We must move beyond infrastructure spaghetti code that creates a sprawl of unmanageable environments. This edition shares emerging patterns and practices for a more componentized, composable approach to Infra‐ structure as Code. In this book I share approaches that are widely used today, but I don’t believe we’re anywhere near the end of the journey of finding better ways to manage digital infrastructure. I hope this edition will help you manage your infrastructure more effectively. And I also hope it will inspire you to push beyond current practices. We may eventually move beyond using code to define infrastructure. But whatever spe‐ cific tools we use, I believe that thoughtful use of effective software design principles and techniques can help us do better, and I hope this new edition will help. What This Book Is and Isn’t This book’s thesis is that practices, patterns, and techniques can be applied across infrastructure platforms using various infrastructure tools. It focuses less on specific tools and more on how to use them. Although I discuss available tools, you won’t find details of how to work with any particular one. You will find patterns, practices, and techniques that should be relevant to whatever tools and platforms you use. xviii | Preface
Comments 0
Loading comments...
Reply to Comment
Edit Comment