Skip to main content
The Ops Playbook

Replacing Manual Multi-Cloud Work with a Verifiable AWS Workflow

Replace undocumented cross-cloud AWS trust with a bounded, evidence-led IAM workflow: staged implementation, guardrails, validation and tested rollback.

Replacing Manual Multi-Cloud Work with a Verifiable AWS Workflow
Jonah BlakeJonah Blake10 min readTier L115 min

This playbook covers

Share

#Current Method: Cross-Cloud Trust Without a Verifiable Boundary

Multi-cloud and cross-cloud architectures typically place Amazon Web Services alongside at least one other cloud platform, an on-premises identity provider, or a partner-operated environment. Somewhere at that boundary a workload, pipeline or federated identity outside AWS needs to assume permissions inside an AWS account. In most operations teams this boundary is not designed once and maintained; it accumulates. A platform engineer creates a role during a migration, a contractor widens a trust policy to unblock a deployment, and nobody removes the exception once the immediate task is done.

The actors involved are the platform team that owns the AWS account, the security team that owns policy review, and whichever external system is asking to act inside AWS: another cloud provider’s workload identity, a CI/CD runner, or a partner account. The trust boundary is the IAM role’s trust policy and the permissions attached to it. Everything on the other side of that boundary sits outside AWS’s control plane and cannot be verified from within AWS alone, which is a material assumption underlying everything that follows.

This produces predictable operational friction. When an incident or audit asks what a given cross-cloud identity can actually access, the honest answer is frequently “we would have to check”, and that answer is itself the finding.

  • Cross-cloud trust policies are widened under deadline pressure and never narrowed back.
  • No role has a documented owner or a recorded reason for its current scope.
  • There is no baseline evidence of what a role can do versus what it was intended to do.
  • Naming and tagging are inconsistent, so inventory work starts from nothing.

#Improved Workflow: A Bounded, Evidence-Led Cross-Cloud Trust Boundary

This workflow is deliberately bounded to one artefact: a single AWS IAM role that an external identity, such as a federated OIDC or SAML

principal from another cloud or a partner account, assumes to operate inside AWS. It does not attempt to redesign the whole multi-cloud estate in one pass. It gives you a repeatable method for making one cross-cloud trust relationship explicit, least-privilege and verifiable, which is then applied role by role.

The AWS Well-Architected Framework’s Security Pillar documents least privilege and traceability as design principles for protecting AWS workloads (AWS, accessed 2026-07-31), without prescribing exact commands or current service output formats. Each step below translates that documented intent into a concrete, evidence-producing action, and the exact CLI syntax and output shape should be confirmed against your account’s current AWS CLI version before use.

  1. Inventory. Consumes the existing set of IAM roles matching a cross-cloud naming or path pattern. Produces a list of principals, trust conditions and attached policies. Trade-off: this step only reads state, so it is safe to run repeatedly, but it tells you nothing about actual usage.
  2. Design a narrowed policy. Consumes the inventory plus observed CloudTrail activity for the role. Produces a draft least-privilege policy document scoped to actions actually used. Trade-off: legitimate but under-scoped edge cases may be temporarily blocked and need a documented exception path.
  3. Simulate. Consumes the draft policy. Produces a dry-run decision (allow or deny) per action without changing anything. Trade-off: simulation checks the policy logic, not live network or cross-cloud identity behaviour.
  4. Stage in non-production. Consumes the draft policy applied to a non-production copy of the role. Produces a live but low-blast-radius test of the narrowed scope.
  5. Apply with a change record. Consumes security sign-off and a saved backup of the previous policy. Produces the promoted least-privilege policy in the target account, with a rollback artefact already in hand before the change is made.
  6. Monitor. Consumes ongoing CloudTrail events and IAM Access Analyzer findings for the role. Produces the evidence that the boundary continues to behave as designed after promotion.

Rendering diagram...

#Implementation: Reproducible Steps With Expected Evidence

Low-angle shot of a high-rise building with reflective windows and clear sky.
Photo by Vladimir Srajber on Pexels

#
Prerequisites

  • A non-production AWS account or dedicated organisational unit for staging the change.
  • Permissions limited to iam:Get*, iam:List*, a scoped iam:PutRolePolicy, accessanalyzer:ListFindings, cloudtrail:LookupEvents and sts:GetCallerIdentity.
  • A confirmed AWS CLI version and credentials profile pointed at the correct account before any command is run.
  • The current role name, ARN and existing policy document identified before any change is drafted.

#
Ordered Steps

  1. Confirm the account and identity context before touching anything.

    1aws sts get-caller-identity

    Expected evidence: an account ID and ARN matching the intended non-production account. Stop condition: if the account ID does not match, stop immediately.

  2. Inventory existing cross-cloud roles by naming or path convention.

    1aws iam list-roles --path-prefix /cross-cloud/

    Expected evidence: a list of candidate role names and ARNs to work through one at a time.

  3. Inspect the specific role and capture a backup of its current inline policy before any change.

    1aws iam get-role-policy --role-name <ROLE_NAME> --policy-name <POLICY_NAME> > backup-policy.json

    Expected evidence: a saved, timestamped policy document. Stop condition: do not proceed to any change step without this file existing and being reviewed.

  4. Check the account’s current IAM Access Analyzer findings for this role before narrowing anything.

    1aws accessanalyzer list-findings --analyzer-arn <ANALYZER_ARN>

    Expected evidence: a baseline set of findings to compare against after the change.

  5. Simulate the narrowed policy against the actions the workload actually needs.

    1aws iam simulate-principal-policy --policy-source-arn <ROLE_ARN> --action-names <ACTION_LIST> --resource-arns <RESOURCE_ARNS>

    Expected evidence: explicit allow decisions for required actions and explicit deny decisions for everything else. Stop condition: if a required action returns deny, revise the draft policy before proceeding, not after promotion.

  6. Apply the narrowed policy, first in the non-production role, then in the target role once staged results are clean.

    1aws iam put-role-policy --role-name <ROLE_NAME> --policy-name <POLICY_NAME> --policy-document file://least-privilege-policy.json

    Expected evidence: the put-role-policy call returns success, and a subsequent get-role-policy shows the new document. Stop condition: if Access Analyzer reports a new, unexpected external access finding after this change, stop, do not proceed to further roles, and roll back using the backup file before investigating.

#Guardrails: Boundaries and Residual Risk

The trust policy should scope the principal using organisation-aware conditions such as aws:PrincipalOrgID where the external identity is another AWS account, and a fixed sts:ExternalId where the external identity is a third-party or non-AWS system, so a leaked role ARN alone is not sufficient to assume the role. An AWS Organizations service control policy can act as an account-level backstop that prevents the role’s permissions from being widened beyond an agreed ceiling even if a future change attempts it. CloudTrail logging must remain enabled for the account, since it is the only evidence source for the monitoring step of this workflow.

The residual risk that AWS-side controls cannot remove is the hygiene of the external identity itself. AWS Access Analyzer and IAM policy simulation can tell you what the AWS side of the boundary permits; they cannot tell you whether the other cloud’s identity provider, credential rotation or workload identity federation is itself trustworthy. That remains a documented assumption requiring independent attestation from whichever team owns the external side of the relationship, and it should be recorded, not implied.

  • Caution: never widen an existing cross-cloud trust policy to unblock a deployment without recording the change and holding a rollback artefact first.
  • Danger: do not attach broad administrative access or wildcard resource permissions to a cross-cloud role, even temporarily; this defeats the boundary the workflow exists to create.
  • Advisory: exact IAM Access Analyzer finding categories and CLI output fields can change between AWS CLI versions; confirm current behaviour against your account before treating output as a pass or fail signal.

#Validation: Confirming the Boundary Behaves as Designed

  • Run IAM Access Analyzer against the target role after promotion and confirm no new, unexpected external access finding appears compared with the pre-change baseline.
  • Re-run simulate-principal-policy against a set of deliberately out-of-scope actions and confirm each returns an explicit deny.
  • Review CloudTrail events for the role over a defined observation window, typically five to ten working days, and confirm only the expected API calls from the expected external principal appear.
  • Record explicit security team sign-off referencing the backup file, the simulation output and the observation window before treating the role as adopted.
Mechanic working on replacing a tire in a professional automotive garage setting.
Photo by Grégory Costa on Pexels

#Common Mistakes

  • Reading the account-level Access Analyzer summary and treating it as sufficient, instead of checking findings scoped to the specific role that changed.
  • Accepting a clean simulation dry run as proof of correctness without also completing a live CloudTrail observation window, since simulation cannot see real external-identity behaviour.
  • Dropping the PrincipalOrgID or ExternalId condition because the original, unscoped integration did not require it, which quietly reopens the boundary the workflow was built to close.
  • Promoting a narrowed policy without first saving backup-policy.json, which removes the rollback path before it is needed.

#Recovery: Diagnosis, Rollback and Post-Recovery Verification

If Access Analyzer reports a new external access finding after a change, or CloudTrail shows API calls outside the expected action set, treat this as a stop condition rather than a monitoring curiosity.

  1. Diagnose using the Access Analyzer finding detail and the CloudTrail event record to identify exactly which action or principal is unexpected.
  2. Roll back by restoring the pre-change document captured in step three of the implementation sequence.
  3. Re-run get-role-policy to confirm the restored document matches backup-policy.json exactly.
  4. Re-run Access Analyzer and confirm the finding profile returns to the pre-change baseline.
  5. Notify the security team and the owner of the external identity before attempting the narrowing step again.
  6. Do not re-attempt promotion to further roles until the root cause of the unexpected finding is understood and documented.

#Measurable Outcome: Baseline, Signal, Cadence and Threshold

Baseline: the number of active cross-cloud roles that currently lack a recorded owner or a saved backup policy document at the start of this workflow. Success signal: every in-scope role has a captured baseline policy, a narrowed least-privilege replacement, and a clean Access Analyzer finding profile after its observation window. Measurement method: a monthly export of Access Analyzer findings compared against the role inventory. Review cadence: monthly for the first quarter of adoption, then quarterly once the backlog of legacy roles is cleared. Decision threshold: if more than one role in the current review lacks a backup artefact, or produces a new unexpected finding, treat the rollout as not yet ready to extend to additional roles and address the gap first.

#Multi-Cloud Trust Boundary Checklist and the Next Safe Decision

  • Backup of the pre-change policy document exists and has been reviewed.
  • Simulation against required and out-of-scope actions returns the expected allow and deny decisions.
  • Narrowed policy has been staged and observed in a non-production role first.
  • Access Analyzer finding profile is clean for the target role after promotion.
  • CloudTrail observation window has been completed with no unexpected calls.
  • Security sign-off is recorded against the specific role and change.

Once every item is checked for one role, the next safe decision is to apply the same bounded workflow to the next role in the inventory, not to batch-promote several roles at once. Batching removes the per-role evidence trail this workflow depends on.

Jonah Blake

Jonah Blake

Ops Playbook Architect

Jonah Blake is a Site Reliability Engineer dedicated to scalable service operations and incident response.

Published
View Profile
Reader Interaction

Comments

Add a thoughtful note on Replacing Manual Multi-Cloud Work with a Verifiable AWS Workflow. Comments are checked for spam and held for moderation before appearing.

Loading comments...
Comment submission is disabled until Cloudflare Turnstile keys are configured.

Discover more

Learn More About KBY

Was this useful?

Operate smarter, with fewer recurring tickets.

Receive new operational playbooks, incident-prevention guidance, automation scripts and recovery runbooks.