Cloud Tech
DevOpsBeginner

AWS Fundamentals

How AWS accounts, regions, identity, and core services fit together, with a practical CLI and access-denied troubleshooting workflow.

Reviewed Jul 28, 2026Victor Nwoke7 min read

Written and maintained by Victor Nwoke. Technical behavior is reviewed against the primary references listed on this page.

Overview

AWS resources live in an account and, for regional services, a selected region made of multiple Availability Zones. The account is the fundamental billing, quota, and security isolation boundary; regions contain service endpoints, and Availability Zones provide physically separate failure domains within a region. IAM decides who can call each service API, while services such as EC2, S3, RDS, Lambda, VPC, CloudWatch, and CloudTrail provide compute, storage, databases, networking, observability, and audit history.

AWS Organizations lets many accounts be managed together: organizational units (OUs) group accounts for policy application, and Service Control Policies (SCPs) cap the maximum permissions available underneath them, on top of, never instead of, IAM policies that grant access. Tags and AWS Resource Groups provide cross-resource visibility inside an account, but they are a query mechanism rather than an ownership or deletion boundary.

Quick Reference

LevelPurposeDeleting/removing it
OrganizationRoot container managing multiple accounts centrallyRequires all member accounts to be removed first
Organizational unit (OU)Groups accounts for SCPs and policy applicationDoesn't delete member accounts, just removes grouping
Member accountBilling and security isolation boundaryClosing an account is a distinct, deliberate, multi-step process
SCPCaps maximum permissions for everything beneath itDetaching it removes the ceiling, doesn't grant new access
ScopeWhat it controlsFirst diagnostic
Profile/credentialsWhich user or role the CLI authenticates asaws sts get-caller-identity --profile <name>
RegionWhich regional endpoint and resources a command targetsaws configure get region --profile <name>
IAM and resource policiesWhich API actions the principal may performRead the complete access-denied message
Organization SCPThe maximum permissions available in a member accountCheck inherited SCPs on the account and OUs

The commands below are grouped by service, not an exhaustive reference (see the official AWS CLI command reference for every flag), but the set that covers nearly all day-to-day aws CLI work.

CommandDescriptionCopy
aws configure sso --profile <name>Configure a named CLI profile using IAM Identity Center instead of long-lived access keys.
aws sso login --profile <name>Acquire or refresh the IAM Identity Center session for a configured profile.
aws sts get-caller-identity --profile <name>Show the account ID and principal ARN currently authenticated as. This is the fastest context check.
aws configure list --profile <name>Show the profile, credential source, region, and where each value came from.

Syntax

bash
aws organizations create-organizational-unit \
  --parent-id r-abcd --name Production

aws organizations create-account \
  --email prod-payments@example.com --account-name payments-prod

Examples

scp-deny-outside-approved-regions.json, an SCP that caps every identity in the attached OU to two approved regions, no matter what their own IAM policy allows:

json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": { "aws:RequestedRegion": ["us-east-1", "eu-west-1"] }
      }
    }
  ]
}

SCPs restrict, they never grant

Attaching this SCP to an OU does not give anyone permission to do anything in us-east-1 or eu-west-1, it only blocks every action everywhere else. An identity still needs its own IAM allow within that region to do anything at all.

Troubleshooting AWS CLI and Access

I start every investigation by proving the caller, account, and region:

bash
aws configure list --profile production
aws sts get-caller-identity --profile production
aws configure get region --profile production

Then I I classify the failure:

  1. Authentication or session: if the CLI cannot load credentials or reports an expired token, run aws sso login --profile <name> and retry with the profile explicitly selected.
  2. Wrong context: compare the returned account ID, assumed-role ARN, and region with the resource ARN. A successful command against the wrong account or region often looks like a missing resource.
  3. Authorization: read the entire AccessDenied message. Effective permission is the intersection of applicable identity policies, resource policies, permissions boundaries, session policies, and Organizations SCPs; an explicit deny overrides an allow.
  4. Service boundary: if identity is correct and authorization allows the action, check service quotas, resource state, region support, and the service's own logs or events. I use CloudTrail event history and the request ID from the error to establish who called which API.

get-caller-identity is intentionally useful during failures: AWS STS returns the caller identity even when an explicit deny applies to that action. I do not debug access by attaching AdministratorAccess; identify the missing allow or explicit deny at the correct policy layer.

Visual Diagram

Common Mistakes

  • Assuming AWS Resource Groups behave like an Azure resource group, a deletion/lifecycle boundary, when they're really just a saved tag-based query with no ownership semantics.
  • Running an entire company, production included, out of a single AWS account instead of separating environments and teams by account.
  • Writing an SCP and expecting it to grant access, then being confused when everything underneath it still returns access denied without a matching IAM allow.
  • Assuming an org-wide SCP also restricts the management account itself; SCPs only ever apply to member accounts, never to the management account.
  • Debugging with an implicit default profile or region, then changing permissions in an account that the failing command was not actually using.
  • Creating long-lived IAM user access keys for people when IAM Identity Center can provide short-lived CLI sessions.
  • Skipping AWS Organizations and centralized logging entirely, leaving no org-wide guardrail against an individual account drifting out of compliance.

Performance

  • SCP evaluation happens alongside normal IAM policy evaluation and adds no meaningful latency, the real cost is organizational complexity if the OU/SCP structure isn't kept simple.
  • Account creation and OU membership changes through AWS Organizations are eventually consistent, propagation to all regions/services can take a few minutes, don't assume it's instantaneous.

Best Practices

  • Separate accounts by environment (production, staging, development) and by team or workload boundary, using AWS Organizations to manage them centrally rather than tags inside one account.
  • Apply SCPs at the OU level for guardrails that should apply organization-wide (approved regions, disallowed services), rather than repeating them per account.
  • I use a dedicated management account for billing/Organizations and a separate log-archive account for centralized CloudTrail logs, following the landing-zone pattern instead of overloading one account with every responsibility.
  • Restrict access to the Organizations management account, keep workloads out of it, and delegate supported administration to member accounts.
  • I use IAM Identity Center and short-lived role sessions for human CLI access; reserve IAM user access keys for exceptional legacy cases with an explicit rotation plan.
  • I use tags and AWS Resource Groups for cross-resource visibility and cost allocation within an account, not as a substitute for real account-level isolation.
  • Continue into AWS IAM, AWS Compute, AWS Storage, AWS Networking, and AWS Monitoring for service-specific depth.

Interview questions

What is the fundamental unit of isolation in AWS, and how does that differ from a single resource-group boundary in Azure?
In AWS, the account itself is the fundamental security and billing isolation boundary, every resource lives inside exactly one account, and account-level separation is what actually contains blast radius (a compromised credential in one account cannot directly touch resources in another). This differs from Azure, where a single subscription can contain many resource groups as an additional lifecycle boundary beneath it. AWS has no equivalent nested container inside an account for "delete everything in this group together," which is why multi-account strategies (via AWS Organizations) do the job that resource groups partly do in Azure, at the account level instead of a sub-account level.
What is a Service Control Policy (SCP), and what is the one thing it does not do?
An SCP is a policy attached to an AWS Organizations root, organizational unit, or member account that defines the maximum available permissions for every identity in that account, including that account's own administrators and its root user. What an SCP does not do is grant any permission by itself, it only sets a ceiling; an identity still needs an actual IAM allow (from an identity-based or resource-based policy) within that ceiling to do anything. An SCP with no matching IAM allow underneath it results in access denied, not access granted, which is the most common misunderstanding of how SCPs work. One exception worth knowing: SCPs never apply to the organization's management account itself, only to member accounts.
Why would an organization use multiple AWS accounts instead of one account holding all resources?
Separate accounts per environment (production, staging, development) or per team give a hard isolation boundary that a single account with tags or naming conventions cannot: a mistake or compromised credential in a development account cannot reach production resources at all, rather than merely being restricted by IAM policy within the same account. It also gives cleaner cost attribution (billing rolls up per account), independent service quotas, and a natural blast-radius limit for security incidents. AWS Organizations, and patterns built on top of it like a landing zone, exist specifically to make many accounts manageable, centralized billing, centralized logging, and org-wide SCPs, without losing that isolation.

References

ShareXLinkedInReddit
Was this page helpful?
Suggest an improvement