Some methods of organization for large scale
Infrastructure-as-a-Code deployments.
The purpose of IaC is to provide a dynamic, reliable, and
repeatable infrastructure suitable for cases where manual approaches and
management practices cannot keep up. When automation increases to the point of
becoming a cloud-based service responsible for the deployment of cloud
resources and stamps that provision other services that are diverse, consumer
facing and public cloud general availability services, some learnings can be
called out that apply universally across a large spectrum of industry clouds.
A service that deploys other services must accept IaC
deployment logic with templates, intrinsics, and deterministic execution that
works much like any other workflow management system. This helps to determine the order in which to run them and
with retries. The tasks are self-described. The automation consists of a
scheduler to trigger scheduled workflows and to submit tasks to the executor to
run, an executor to run the tasks, a web server for a management interface, a
folder for the directed acyclic graph representing the deployment logic
artifacts, and a metadata database to store state. The workflows don’t restrict
what can be specified as a task which can be an Operator or a predefined task
using say Python, a Sensor which is entirely about waiting for an external
event to happen, and a Custom task that can be specified via a Python function
decorated with a @task.
The organization
of such artifacts posed two necessities. First, to leverage the builtin
templates and deployment capabilities of the target IaC provider as well as
their packaging in the format suitable to the automation that demands certain
declarations, phases, and sequences to be called out. Second the co—ordination
of context management switches between automation service and IaC provider.
This involved a preamble and an epilogue to a context switch for bookkeeping
and state reconciliation.
This taught us
that large IaC authors are best served by uniform, consistent and global naming
conventions, registries that can be published by the system for cross
subscription and cross region lookups, parametrizing diligently at every scope
including hierarchies, leveraging dependency declarations, and reducing the
need for scriptability in favor of system and user defined organizational units
of templates. Leveraging supportability via read-only stores and frequently
publishing continuous and up-to-date information on the rollout helps alleviate
the operations from the design and development of IaC.
IaC writers
frequently find themselves in positions where the separation between pipeline
automation and IaC declarations are not clean, self-contained or require
extensive customizations. One of the approaches that worked on this front is to
have multiple passes on the development. With one pass providing initial deployment
capability and another pass consolidating and providing best practice via
refactoring and reusability. Enabling the development pass to be DevOps based,
feature centric and agile helps converge to a working solution with learnings
that can be carried from iteration to iteration. The refactoring pass is more
generational in nature. It provides cross-cutting perspectives and non-functional
guarantees.
A library of
routines, operators, data types, global parameters and registries are almost
inevitable with large scale IaC deployments but unlike the support for programming
language-based packages, these are often organically curated in most cases and
often self-maintained. Leveraging tracking and versioning support of source
control, its possible to provide compatibility as capabilities are made native
to the IaC provider or automation service.
Reference: IaC shortcomings and resolutions.
No comments:
Post a Comment