IaC Resolutions Part 8:
Previous articles in this regard have been discussing resolutions
for shortcomings in the use of Infrastructure-as-a-code (IaC) in various
scenarios. This section discusses the resolution for the case when changes to resources
involves breaking a deadlock in state awareness between, say a pair.
Let us make a specific association between say a firewall
and a network resource such as a gateway. The firewall must be associated with
the gateway to prevent traffic flow through that appliance. When they remain
associated, they remember the identifier and the state for each other.
Initially, the firewall may remain in detection mode where it is merely
passive. It becomes active in the prevention mode. When the modes are attempted
to be toggled, the association prevents it. Neither end of the association can
tell what state to be in without exchanging the information and when they are
deployed or updated in place, neither knows about or informs the other.
There are two ways to overcome this limitation.
First, there is a direction established between the
resources where the update to one forcibly updates the state of the other. This
is supported by the gateway when it allows the information to be written
through by the update in the state of one resource.
Second, the changes are made by the IaC provider first to
one resource and then to the other so that the update to the other picks up the
state of the first during its change. In this mode, the firewall can be activated
after the gateway knows that there is such a firewall.
If the IaC tries to form an association while updating the
state of one, the other might end up with an inconsistent state. One of the two
resolutions above works to mitigate this.
This is easy when there is a one-to-one relationship between
resources. Sometimes there are one-to-many relationships. For example, a
gateway might have more than a dozen app services as its backend members and
each member might be allowing public access. If the gateway must consolidate
access to all the app services, then there are changes required on the gateway
to route traffic to each app service as intended by the client and a
restriction on the app services to allow only private access from the gateway.
Consider the sequence in which these changes must be made
given that the final operational state of the gateway is only acceptable when
all barring none remain reachable for a client through the gateway.
If the app services toggle the access from public to gateway
sooner than the gateway becomes operational, there is some downtime to them,
and the duration is not necessarily bounded if one app service fails to listen
to the gateway. The correct sequence would involve first making the change in
the gateway to set up proper routing and then restricting the app services to
accept only the gateway. Finally, the gateway validates all the app service
flows from a client before enabling them.
Each app service might have nuances about whether the
gateway can reach it one way or another. Usually, if they are part of the same
vnet, then this is not a concern, otherwise peering might be required. Even if
the peering is made available, routing by address or resolution by name or both
might be required unless they are universally known on the world wide web. If
the public access is disabled, then the private links must be established, and
this might require both the gateway and the app service to do so. Lastly, with
each change, an app service must maintain its inbound and outbound properly for
bidirectional communication, so some vetting is required on the app service
side independent of the gateway.
Putting this altogether via IaC requires that the changes be
made in stages and each stage validated independently.
No comments:
Post a Comment