Start adopting the expand-contract pattern.
You expand by installing a new version of the app, and then you contract by removing the old version.
Let’s say you need to rename a table column.
You expand by adding a new column with the new name.
Feed the new column with data.
Once the app uses the new column, contract by removing the old one.
You expand by duplicating the method and change the signature.
Modify all consumers to use the new signature.
Contract once all consumers are using the new signature by removing the old method.
Expand by duplicating the security group with the new name.
Use the new security group for existing EC2 instances.
Contract by removing the old security group.
When evolving the API on the same endpoint Postel’s Law should be followed which is another form of expand-contract.
#ContinuousDelivery
But, oh dear, it vastly pays back in delivery flexibility and never blocking the flow of delivery as at any time you’ll have a releasable working software system.