Foundations of DevOps and Agile Methodologies

Chapter 9
Infrastructure Automation, Cloud and Platform Engineering

Post Graduate Program in Dev Ops
Foundations of DevOps and Agile Methodologies   •   Post Graduate

9. Infrastructure Automation, Cloud and Platform Engineering

Introduction and Context

DevOps is not achieved merely by placing development and operations teams in the same organizational structure. Its deeper purpose is to create a reliable system in which software can move from idea to production through repeatable, observable, and controlled processes. Infrastructure is central to that system. Applications depend on networks, compute resources, storage, databases, identity services, security controls, monitoring systems, and deployment environments. When these resources are created manually or managed through undocumented procedures, delivery becomes slow and operational risk increases.

Infrastructure automation addresses this problem by representing infrastructure and operational configuration as repeatable, machine-executable instructions. Cloud computing extends the possibilities of automation by providing programmable resources that can be provisioned on demand. Containers package applications with their runtime dependencies, while orchestration platforms manage large populations of containers. Platform engineering builds an organizational and technical layer that makes these capabilities usable by development teams without requiring every team to become an expert in infrastructure administration.

This chapter examines the relationship among infrastructure as code, configuration management, containers, orchestration, cloud operating models, immutable infrastructure, GitOps, and internal developer platforms. These are not isolated technologies. Together, they form an operating model for modern software delivery. Their value depends not only on technical implementation but also on governance, team design, security, financial control, and the quality of developer experience.

Learning Objectives

By the end of this chapter, students should be able to:

1. Explain the purpose and operating principles of infrastructure automation.

2. Distinguish infrastructure as code from configuration management and describe how they complement one another.

3. Evaluate containers, orchestration platforms, and immutable infrastructure for different delivery contexts.

4. Compare major cloud operating models and identify their organizational implications.

5. Explain GitOps and assess its strengths and limitations.

6. Describe the role of internal developer platforms and platform teams.

7. Analyze the security, governance, cost, reliability, and ethical risks associated with automated infrastructure.

8. Recommend an appropriate automation and platform strategy for a given organization.

From Handcrafted Servers to Programmable Infrastructure

Traditional infrastructure operations often relied on manually configured servers, ticket-based requests, and the personal knowledge of experienced administrators. Such practices can work at small scale, but they produce configuration drift: over time, nominally identical environments become different because of undocumented changes. Troubleshooting then becomes an exercise in reconstructing history, and recovery depends on individual expertise.

Infrastructure automation treats environments as systems that can be described, created, tested, changed, and destroyed through code. The desired state is made explicit. A provisioning tool can create a network, compute instances, access policies, and databases from a version-controlled specification. A configuration tool can install packages, place configuration files, manage services, and enforce operating-system settings. Automation therefore changes infrastructure from an artisanal activity into an engineered product.

Automation does not mean that every decision should be delegated to a script. Poorly designed automation can distribute errors rapidly, create excessive privileges, or make an environment difficult to understand. The objective is controlled repeatability: changes should be visible, reviewable, tested, reversible where possible, and subject to appropriate approval.

Infrastructure as Code and Configuration Management

Infrastructure as code (IaC) is the practice of defining infrastructure resources in machine-readable files that are maintained through software-development practices. These files normally reside in a version-control system and are changed through review, automated validation, and a controlled deployment process. IaC may be declarative or imperative.

A declarative approach specifies the desired end state. For example, it may state that a virtual network must contain three subnets and that a service must run with a particular capacity. The tool determines which operations are required to reach that state. An imperative approach specifies the sequence of actions, such as creating a network, attaching a route, and then assigning a security rule. Declarative approaches are often easier to reason about for long-term state management, although imperative logic remains useful for complex workflows and procedural tasks.

The principal IaC lifecycle is:

1. Authoring: engineers define resources, variables, dependencies, and policies.

2. Validation: syntax, formatting, security rules, and organizational standards are checked.

3. Planning: the tool calculates the difference between the declared state and the current state.

4. Review: proposed changes are inspected by authorized reviewers.

5. Application: approved changes are executed against the target environment.

6. Observation: the resulting environment is tested and monitored for drift or failure.

IaC must manage state carefully. The state records what resources are believed to exist and how they relate to declarations. If state is lost, shared improperly, or modified manually, the tool may make unsafe decisions. Remote state storage, locking, encryption, access control, and backup are therefore important operational requirements.

Configuration management focuses more specifically on the state and behavior of operating systems, middleware, and applications after infrastructure has been provisioned. It may install a web server, configure a database, manage users, apply security baselines, or ensure that a service is running. Provisioning and configuration are complementary: IaC may create a virtual machine, while configuration management establishes the software and settings inside it.

A useful distinction is between desired state and observed state. Desired state is what the organization intends; observed state is what actually exists. Automation continuously or periodically compares the two. However, reconciliation should be designed carefully. Automatic correction is valuable for some resources, but it may be dangerous when a manual change is part of an emergency response or when an external system has not yet been updated.

Containers and Orchestration

A container packages an application and its dependencies into an isolated execution unit that shares the host operating system kernel. Containers are generally lighter and faster to start than full virtual machines because they do not require a separate guest operating system for each workload. Their portability makes them useful for development, testing, continuous integration, and production deployment.

Containerization improves consistency, but it does not automatically create security or operational maturity. Images may contain vulnerable libraries, excessive privileges, embedded secrets, or unnecessary software. Images should therefore be built from trusted minimal bases, scanned, signed where appropriate, and promoted through controlled registries. A container image should be treated as a versioned artifact rather than as a mutable server installation.

A single container host is insufficient for large-scale systems. Orchestration platforms schedule containers, restart failed workloads, provide service discovery, manage networking, support rolling updates, and maintain desired replica counts. Kubernetes is a prominent example, but the conceptual principles apply to other orchestrators as well.

Orchestration introduces an abstraction layer. Engineers describe workloads, services, policies, and resource requirements; the platform attempts to maintain the desired condition. This improves resilience and scalability, but it also introduces complexity. Networking, storage, identity, admission control, observability, upgrades, and cluster capacity must be designed deliberately. A team that adopts an orchestrator without acquiring the operational capability to manage it may replace server administration with platform administration without reducing risk.

The decision to use containers or orchestration should be based on workload characteristics. Stateless web services with frequent releases may benefit substantially. A small internal application with infrequent change may be better served by a managed runtime or a simpler virtual-machine model. Technological sophistication is not itself a valid selection criterion.

Immutable Infrastructure

Immutable infrastructure is an operating principle in which deployed infrastructure components are not modified in place. When a change is required, a new image or resource version is built, tested, and deployed; the previous version is then retired. This differs from mutable infrastructure, where administrators log into running servers and update them directly.

Immutability reduces configuration drift and makes deployments more reproducible. It also supports rapid rollback when previous versions are retained. In containerized environments, immutable application images are common. The principle can also apply to virtual-machine images and other infrastructure artifacts.

Immutability is not absolute. Data stores, logs, and user-generated content require persistence and must be managed separately from replaceable compute resources. Operational procedures must also address migrations, backup, disaster recovery, and emergency access. A rigid interpretation that prevents all intervention can be impractical; the important distinction is that routine change should occur through a controlled build-and-replace process rather than ad hoc modification.

Cloud Operating Models and Shared Responsibility

Cloud computing provides on-demand access to computing resources through programmable interfaces and consumption-based pricing. Its importance to DevOps lies not simply in outsourcing hardware but in enabling rapid provisioning, elastic capacity, managed services, automation, and global reach.

Common service models include:

  • Infrastructure as a Service: the provider supplies virtualized compute, storage, and networking while the customer manages much of the operating system and application stack.
  • Platform as a Service: the provider manages more of the runtime and infrastructure, allowing teams to concentrate on application code and data.
  • Software as a Service: a complete application is consumed as a service, with limited control over underlying infrastructure.

Organizations may also choose public, private, hybrid, or multi-cloud arrangements. These are operating-model decisions, not merely technical configurations. They affect skills, procurement, compliance, resilience, vendor dependence, and financial accountability.

The shared-responsibility model clarifies that cloud providers and customers have different security obligations. The provider may secure physical facilities and foundational services, while the customer remains responsible for identity, data classification, access policies, workload configuration, and often operating-system security. The exact division varies by service. Assuming that “the cloud provider handles security” is therefore a serious governance error.

Cloud adoption also requires financial operations, commonly called FinOps. Teams must understand resource consumption, unit costs, reservations, scaling behavior, idle resources, and cost allocation. A technically efficient system may still be financially unsustainable if it creates uncontrolled storage, oversized clusters, or unnecessary data transfer. Cost should be treated as an engineering signal and a design constraint rather than as an accounting issue considered only after deployment.

GitOps: Version Control as an Operational Control Plane

GitOps applies software-delivery principles to infrastructure and operational configuration. The desired state is stored in a Git repository, changes are proposed through pull requests, and an automated agent reconciles the target environment with the repository. The repository becomes the authoritative source for declared state, while the reconciliation controller detects and corrects divergence.

GitOps provides an auditable history, peer review, separation of duties, and a common workflow for application and infrastructure changes. It can reduce direct administrative access to production because authorized automation performs the deployment. It also supports reproducibility and disaster recovery: rebuilding an environment begins with retrieving the declared configuration and required artifacts.

GitOps has boundaries. Git is not a substitute for secrets management, runtime observability, incident response, or sound architecture. Secrets should not be committed in plaintext; references to a secure secret store or encrypted secret mechanism are preferable. Reconciliation can also create undesirable outcomes if a faulty change is merged, so validation, progressive delivery, policy checks, and rapid rollback are essential.

A mature GitOps process distinguishes between the desired state and evidence about actual state. Metrics, logs, traces, alerts, and security events should inform operators, but they do not necessarily belong in the configuration repository. The repository defines what should exist; observability reveals what does exist and how it behaves.

Platform Engineering and Internal Developer Platforms

Platform engineering emerged from the recognition that development teams need infrastructure capabilities but should not each build their own complex delivery systems. A platform team creates a supported internal product that provides reusable paths for common activities such as creating a service, obtaining a database, deploying to an environment, configuring observability, and meeting security requirements.

An internal developer platform (IDP) may include templates, APIs, deployment workflows, infrastructure modules, service catalogs, policy controls, documentation, and self-service interfaces. Its purpose is not to hide all complexity or impose a single technology regardless of context. Its purpose is to offer a reliable “golden path” for common use cases while preserving an escape hatch for legitimate exceptions.

Platform teams should treat developers as users. They must understand user journeys, measure time to first deployment, identify failure points, provide clear documentation, and maintain product-quality support. A platform that technically works but is difficult to use will encourage workarounds and shadow infrastructure.

Platform engineering also changes organizational boundaries. The platform team owns the usability and reliability of the platform, but application teams retain responsibility for their services. This is sometimes described as a product-oriented platform model: the platform is a product, developers are customers, and adoption is earned through useful capabilities rather than enforced solely through mandates.

A Decision Framework for Selecting Automation Approaches

No single automation model is optimal for every organization. A useful evaluation considers the following dimensions:

Scale and variability: Large environments with many similar resources gain more from reusable modules and automated provisioning. Small, stable environments may need only modest automation.

Change frequency: Frequent releases favor immutable artifacts, automated testing, and progressive delivery. Infrequent change may justify simpler operational processes.

Regulatory and security requirements: Strong auditability, segregation of duties, encryption, policy enforcement, and evidence collection may determine tool and workflow choices.

Team capability: An organization must assess whether it can operate an orchestrator, manage cloud identity, secure pipelines, and respond to failures. Managed services may be preferable where specialized skills are limited.

Portability and lock-in: Abstraction can improve portability but may sacrifice provider-specific capabilities. Attempting to make every workload portable can increase complexity without producing meaningful strategic value.

Cost and value: Automation has an initial investment. Its return comes through reduced manual effort, fewer failures, faster recovery, improved compliance, and greater delivery capacity. These benefits should be measured rather than assumed.

A practical architecture often combines approaches: IaC provisions cloud resources, image pipelines create immutable artifacts, an orchestrator runs services, GitOps manages declared state, and an internal platform presents these capabilities through reusable workflows.

Applied Case: A Fictional Retail Platform Modernization

Background

Northstar Retail, a fictional regional retailer, operates an online store and a warehouse-ordering system. Its applications run on manually configured virtual machines in two data centers. Releases occur approximately once every three weeks. Production incidents are difficult to investigate because the environments differ and configuration changes are poorly documented.

Situation and Problem

The business plans to introduce personalized recommendations and expects seasonal demand to vary substantially. The technology department proposes moving all workloads immediately to Kubernetes in a public cloud. Senior leadership is concerned about cost, compliance, and operational readiness.

Analysis

An assessment identifies three distinct workload types. The customer-facing web service is stateless and changes frequently. The warehouse system relies on a stateful database and has strict availability requirements. Several reporting jobs run periodically and do not require continuous service. Treating all three workloads identically would create unnecessary complexity.

The organization also discovers that its main constraint is not the absence of a container platform but the absence of reliable delivery practices. There is no common source-control workflow for infrastructure, no automated security testing, and no ownership model for cloud costs.

Approach and Strategy

Northstar adopts a staged strategy. First, it defines cloud accounts, network boundaries, identity roles, logging, and budget controls through IaC. The web service is packaged as a container and deployed to a managed container service rather than a self-operated cluster. The database is moved to a managed database offering after a separate backup and recovery assessment. Reporting jobs use a scheduled managed compute service.

The team establishes an image pipeline that performs tests and vulnerability checks before publishing images. Application and infrastructure declarations are stored in Git. A GitOps controller manages deployment configuration for the web service, while sensitive values are retrieved from a dedicated secrets service. A small platform team creates templates for new services, including logging, metrics, health checks, ownership metadata, and cost tags.

Migration occurs incrementally. A low-risk service is used to test the delivery path, rollback process, access controls, and operational dashboards. Only after the process is stable are more critical services migrated.

Outcome

The resulting architecture is less uniform than the original proposal but better aligned with workload needs. The web service gains repeatable deployments and elastic capacity. The database receives specialized operational treatment rather than being forced into a stateless container model. The organization gains a common governance layer without requiring every team to operate a complex cluster.

Learning Points

The case illustrates four principles. First, automation should address organizational and operational constraints, not merely introduce fashionable tools. Second, workload characteristics should guide platform selection. Third, managed services can be strategically valuable when they reduce undifferentiated operational work. Finally, platform engineering is effective when it combines self-service with guardrails, ownership, observability, and financial accountability.

Risks, Governance, and Professional Responsibilities

Automation can amplify both good and bad decisions. A defective infrastructure change may affect hundreds of resources. Excessive permissions in a deployment pipeline can permit large-scale compromise. Insecure images can distribute vulnerabilities across many environments. Organizations should therefore implement least privilege, separation of duties where appropriate, protected branches, code review, policy as code, artifact integrity controls, and controlled emergency procedures.

Secrets require special treatment. Credentials should be short-lived where possible, centrally managed, encrypted in transit and at rest, and excluded from source repositories and build logs. Identity federation and workload identity can reduce the need for long-lived static keys.

Compliance should be built into automation rather than treated only as a final audit activity. Infrastructure policies can check encryption, network exposure, tagging, approved regions, retention settings, and logging requirements before deployment. However, automated compliance rules must be maintained and periodically reviewed; an obsolete rule can block legitimate work or create false confidence.

Reliability engineering requires attention to failure modes. Teams should test backup restoration, regional failure, dependency outages, expired certificates, quota limits, failed deployments, and corrupted state. Disaster recovery is not demonstrated by possessing a backup; it is demonstrated by restoring service within an acceptable recovery objective.

There are also professional and ethical responsibilities. Engineers should make automation understandable to those who must operate it, document assumptions, avoid hidden access mechanisms, and communicate the consequences of destructive actions. Cloud systems may process personal or sensitive information, so data minimization, lawful processing, retention control, and access accountability remain essential. Cost transparency is likewise an ethical issue when poorly designed systems transfer financial burdens to customers or public institutions.

Common Mistakes and Best Practices

Frequent mistakes include adopting Kubernetes before defining a real need, placing secrets in Git, allowing manual production changes without recording them, creating infrastructure modules that are too abstract to understand, and building a platform around the preferences of its operators rather than the needs of developers. Another mistake is measuring platform success by the number of tools installed instead of delivery reliability and user outcomes.

Effective practice generally includes:

  • keeping infrastructure, application, and policy changes version-controlled;
  • using small, composable, documented modules rather than opaque automation;
  • validating plans before applying them and testing destructive operations;
  • separating reusable templates from workload-specific decisions;
  • treating images and infrastructure definitions as versioned artifacts;
  • applying least privilege to users, pipelines, and workloads;
  • providing observability by default;
  • using progressive delivery, health checks, and tested rollback procedures;
  • assigning explicit ownership for services, platforms, costs, and incidents; and
  • reviewing platform adoption through developer feedback, reliability measures, security findings, and financial data.

Current Developments and Emerging Directions

Several developments are influencing this field. Policy as code is becoming more common as organizations express security and compliance requirements in machine-evaluated rules. Software supply-chain security is receiving greater attention through dependency analysis, provenance records, artifact signing, and verification at deployment time. Managed Kubernetes and serverless platforms reduce infrastructure administration, although they do not remove the need for architecture, security, and cost management.

Artificial intelligence is increasingly used to summarize incidents, suggest infrastructure changes, detect anomalous behavior, and assist with code and configuration generation. Such systems can improve productivity but must not be granted unreviewed authority over critical infrastructure. Generated configurations require validation, security analysis, and human accountability. AI-assisted operations are most defensible when they support diagnosis and recommendation while retaining controlled approval for consequential changes.

Platform engineering is also moving toward more composable and federated models. Organizations seek standard paths without eliminating team autonomy. The enduring challenge is to balance consistency with context: too little standardization produces duplication and risk, while too much creates bottlenecks and discourages innovation.

Chapter Summary

Infrastructure automation makes infrastructure reproducible, reviewable, and programmable. Infrastructure as code describes and provisions resources, while configuration management establishes the software and settings within those resources. Containers package applications consistently, and orchestration platforms manage their deployment and operation at scale. Immutable infrastructure reduces drift by replacing rather than modifying deployed components.

Cloud operating models provide flexibility and managed capabilities but require clear understanding of shared responsibility, identity, resilience, compliance, and cost. GitOps uses version control and automated reconciliation to manage desired operational state. Internal developer platforms combine these capabilities into supported self-service experiences, allowing development teams to deliver software without independently mastering every infrastructure technology.

The central lesson is that tools alone do not produce DevOps performance. Effective infrastructure automation depends on appropriate abstractions, governance, security, observability, financial discipline, team ownership, and continuous learning. The best solution is selected according to workload needs and organizational capability rather than technological fashion.

Key Terms

Infrastructure as Code (IaC): The practice of defining and managing infrastructure through version-controlled, machine-readable specifications.

Declarative Configuration: A description of the desired end state that allows a tool to determine the required actions.

Imperative Configuration: A sequence of explicit commands or procedures describing how a change should be performed.

Configuration Management: The practice of maintaining the desired software, settings, services, and policies of computing systems.

Configuration Drift: Unintended divergence between systems that were expected to have the same configuration.

Desired State: The condition that an automated system is intended to create and maintain.

Infrastructure State: Recorded information about resources, attributes, and relationships managed by an IaC tool.

Container: An isolated process package containing an application and its runtime dependencies while sharing the host kernel.

Container Image: A versioned, portable artifact used to create containers.

Orchestration: Automated scheduling, networking, scaling, updating, and recovery of distributed workloads.

Immutable Infrastructure: An approach in which deployed components are replaced with new versions rather than modified in place.

Cloud Operating Model: The organizational, technical, financial, and governance arrangements used to consume and manage cloud services.

Shared Responsibility Model: A framework dividing security and operational obligations between a cloud provider and its customer.

GitOps: An operating approach in which version-controlled declarations drive automated reconciliation of infrastructure or application state.

Reconciliation: The process of comparing actual state with desired state and taking action to reduce divergence.

Internal Developer Platform: A supported collection of tools, workflows, interfaces, and standards that enables developer self-service.

Golden Path: A recommended, supported route for completing a common development or deployment task.

Policy as Code: The expression of governance, security, or compliance rules in machine-evaluable form.

FinOps: A collaborative practice for managing and optimizing cloud expenditure through engineering, finance, and business accountability.

Configuration Drift: The gradual accumulation of differences between intended and actual system configuration.

Review Questions

Short Answer Questions

1. What is the difference between infrastructure as code and configuration management?

2. Why is state management important in IaC?

3. What problem does immutable infrastructure address?

4. Define GitOps and identify its authoritative source of desired state.

5. What is the purpose of an internal developer platform?

Long Answer Questions

1. Explain the lifecycle of an infrastructure-as-code change from authoring through observation.

2. Compare mutable and immutable infrastructure, including their implications for deployment, rollback, data, and emergency operations.

3. Discuss the shared-responsibility model in cloud computing and explain why it is important for governance.

4. Explain how containers and orchestration platforms support DevOps, and analyze the operational complexity they introduce.

5. Describe how a platform team can provide self-service without eliminating application-team ownership.

Analytical / Application Questions

1. An organization has a small number of stable applications, limited platform expertise, and strict backup requirements. Should it immediately adopt a self-managed Kubernetes platform? Justify an alternative using the decision criteria in this chapter.

2. A GitOps controller repeatedly restores a configuration that an operations engineer changed during an incident. Analyze the conflict and propose a safe operating procedure.

3. A cloud bill has increased sharply after an automated deployment. Design an investigation that considers architecture, scaling, tagging, data transfer, ownership, and FinOps controls.

22. Multiple Choice Questions with Answers

Question 1

Which statement best distinguishes infrastructure as code from configuration management?

A. Infrastructure as code creates or changes infrastructure resources, while configuration management establishes software and settings on those resources.

B. Infrastructure as code is used only for containers, while configuration management is used only for databases.

C. Infrastructure as code always uses imperative commands, while configuration management always uses declarative files.

D. Infrastructure as code manages application source code, while configuration management manages financial budgets.

Correct Answer: A. Infrastructure as code creates or changes infrastructure resources, while configuration management establishes software and settings on those resources.

Question 2

A team wants to reduce configuration drift and make rollback easier by replacing servers rather than editing them in production. Which principle is it applying?

A. Shared responsibility

B. Immutable infrastructure

C. Multi-cloud portability

D. Manual reconciliation

Correct Answer: B. Immutable infrastructure

Question 3

In a GitOps model, what normally acts as the authoritative source of the desired operational state?

A. An administrator's local workstation

B. A production server's current configuration

C. A version-controlled repository

D. An incident chat channel

Correct Answer: C. A version-controlled repository

Question 4

Why might a managed container service be preferable to a self-operated orchestration cluster?

A. It eliminates the need for application testing.

B. It can reduce the organization's responsibility for operating the orchestration control plane.

C. It guarantees that containers contain no vulnerabilities.

D. It prevents all forms of cloud vendor dependence.

Correct Answer: B. It can reduce the organization's responsibility for operating the orchestration control plane.

Question 5

Which activity is most consistent with the shared-responsibility model?

A. Assuming the provider secures all customer identity policies

B. Treating customer workload configuration and access control as customer responsibilities

C. Delegating data classification entirely to the physical data-center operator

D. Assuming that a managed service removes the need for customer compliance controls

Correct Answer: B. Treating customer workload configuration and access control as customer responsibilities

Question 6

A platform team provides templates that automatically include logging, health checks, ownership metadata, and cost tags. What is the primary purpose of this design?

A. To prevent development teams from deploying any independent services

B. To create a supported golden path with built-in operational guardrails

C. To replace all application-team responsibility for production systems

D. To ensure that every workload uses identical business logic

Correct Answer: B. To create a supported golden path with built-in operational guardrails

Question 7

Which practice most directly protects sensitive credentials in a GitOps workflow?

A. Committing plaintext credentials to a private repository

B. Embedding credentials in container image labels

C. Storing secrets in a dedicated secrets mechanism and referencing them securely

D. Printing credentials in deployment logs for auditability

Correct Answer: C. Storing secrets in a dedicated secrets mechanism and referencing them securely

Question 8

A company applies the same platform technology to a stateless web service, a critical stateful database, and an occasional reporting job. What analytical error is most evident?

A. It has separated infrastructure from application code.

B. It has selected technologies without considering workload characteristics.

C. It has used too much version control.

D. It has applied the shared-responsibility model.

Correct Answer: B. It has selected technologies without considering workload characteristics.

Question 9

Which control is most useful for preventing an infrastructure change from violating encryption or approved-region requirements before deployment?

A. Policy as code

B. Manual server login

C. Unversioned shell history

D. Disabling automated validation

Correct Answer: A. Policy as code

Question 10

Why should AI-generated infrastructure configurations receive human review?

A. AI systems cannot generate any configuration syntax.

B. Generated changes may contain security, reliability, or destructive errors, and accountability remains with the organization.

C. Human review prevents all automation and therefore improves speed.

D. AI-generated configurations are legally prohibited in every cloud environment.

Correct Answer: B. Generated changes may contain security, reliability, or destructive errors, and accountability remains with the organization.

Foundations of DevOps and Agile Methodologies
Chapter 9 of 15