Packaging a cloud solution as a blueprint:
The setup and deployment of tools on hosts were facilitated
with installers that benefitted from commit and rollback transactions and
software maker defined order of execution bringing with it several decades of
experience in gaining end-user acceptance. Cloud solutions have rarely been
seen as personal computing to warrant a similar experience for end-users. This
article explains the methods for packing and shipping cloud software solutions.
Azure Blueprints can be leveraged to allow an engineer or
architect to sketch a project’s design parameters, define a repeatable set of
resources that implements and adheres to an organization’s standards, patterns
and requirements. It is a declarative way to orchestrate the deployment
of various resource templates and other artifacts such as role assignments,
policy assignments, ARM templates, and Resource Groups. Blueprint Objects are stored
in the CosmosDB and replicated to multiple Azure regions. Since it is designed
to setup the environment, it is different from resource provisioning. This
package fits nicely into a CI/CD
While Azure Functions allow extensions via new resources,
Azure Resource provider and ARM APIs provide extensions via existing resources.
This eliminates the need to have new processes introduced around new resources
and is a significant win for reusability and user convenience. Resources and
their extensions can be written only in Bicep and ARM templates. Bicep provides
more concise syntax and improved type safety, but they compile to ARM templates
which is the de facto standard to declare and use Azure resources and supported
by the unified Azure Resource Manager. Bicep is a new domain-specific language
that was recently developed for authoring ARM templates by using an easier
syntax. Bicep is typically used for resource deployments to Azure. It is
a new deployment-specific language that was recently developed. Either or both
JSON and Bicep can be used to author ARM templates and while JSON is
ubiquitous, Bicep can only be used with Resource Manager Templates. In fact,
Bicep has tooling that converts Bicep templates into standard Json Templates
for ARM Resources by a process called transpilation. This conversion happens
automatically but it can also be manually invoked. Bicep is succint so it
provides a further incentive. The use of builtin functions, conditions and
loops for repetitive resources infuses logic into the ARM templates.
With the standardization of the
template, it can bring consistency across services and their resources with
added benefits like policy as a code and repeated deployments across clouds and
regions. The need for region agnostic deployments cannot be over-emphasized for
foundational services that struggle with limitations. There are many clouds and
regions to support, and the task of deployment could have significant cost when
the services groan without the availability of suitable ARM Templates.
Other infrastructure providers like
Kubernetes have a language that articulates state so that its control loop can
reconcile these resources. The resources can be generated and infused with
specific configuration and secret using a configMap generator and a secret
generator respectively. For example, it can take an existing
application.properties file and generate a configMap that can be applied to new
resources. Kustomization allows us to override the registry for all images used
in the containers for an application. There are two advantages to using
it. First, it allows us to configure the individual components of the
application without requiring changes in them. Second, it allows us to combine
components from different sources and overlay them or even override certain
configurations. The kustomize tool provides this feature. Kustomize can add
configmaps and secrets to the deployments using their specific generators
respectively. Kustomize is static declaration. It allows adding labels across
components. We can choose the groups of Kubernetes resources dynamically using
selectors, but they must be declared as yaml. This kustomization yaml is
usually stored as manifests and applied on existing components so they refer to
other yamls. Arguably, yaml is the most succint format of templates.
Azure Blueprints differ from ARM
templates in that the former helps environment setup while the latter helps
with resource provisioning. It is a package that comprises artifacts that
declare resource groups, policies, role assignments, and ARM Template
deployments. It can be composed and versioned and included in continuous
integration and continuous delivery pipelines. The components of the package
can be assigned to a subscription in a single operation, audited, and tracked.
Although the components can be individually registered, the Blueprint
facilitates a relationship to the template and an active
connection.
There are two categories within the
Blueprint – definitions for deployment that explain what should be deployed and
the definitions for assignments that explain what was deployed. A previous
effort to author ARM Templates become reusable in Azure Blueprint. In this way,
Blueprint becomes bigger than just the templates and allows reusing an existing
process to manage new resources.
A Blueprint focuses on standards,
patterns, and requirements. The design can be reused to maintain consistency
and compliance. It differs from an Azure policy in that it supports parameters
with policies and initiatives. A policy is a self-contained manifest that
governs resource properties during deployment and for already existing
resources. Resources within a subscription adhere to the requirements and
standards. When a Blueprint comprises resource templates and Azure policy along
with parameters, it becomes holistic in cloud governance.
With the help of a blueprint, we can create resources as
deployment stamps. The names of the resources can be parametrized to differentiate
one stamp from another and as many times as they are invoked. All the resources
will be mapped to the same resource group to ensure that their lifecycle is managed
and held for the duration of the resource group.
Most of the deployment of cloud resources can be declarative
with little or no requirement for scriptability. This is preferable to make the
rollouts idempotent and preferably better tracked and managed via the portal.
Scripts are only unavoidable when they involve resource provisionings that are
outside the scope of the public cloud.
For example, a GitHub repository is not a cloud resource and sometimes keeping
track of the artifacts during the rollout process might be necessary because
other storage might not be as preferable as the source control filesystem. It’s
preferable to write the script in the form of commit, rollback and repair
options.
Another feature of the deployment logic is the state
reconciliation with the existing technologies. It is preferable to start with a
clean state each time the rollout begins. This avoids state reconciliation
altogether but when existing resources must be repaired, it is possible to
leverage state persistence for the reconciliation.
Lastly, the levels are built from the ground up. So the tear
down must be in the opposite direction so that the dependencies can be done
away with. With principles such as resource acquisition is initialization, this
reverse order can be enforced.
No comments:
Post a Comment