
AWS IAM
AWS’s identity and access management: JSON policies decide which users, roles and services may call which AWS APIs on which resources.
- What it is
- Identity & access (IAM)
- Type
- Managed service on AWS
- Made by
- Amazon Web Services
- License
- Proprietary
- Facts checked
- 5 October 2026
What it is
AWS Identity and Access Management checks every AWS API call. The caller is a principal: an IAM user with long-lived access keys, or, far more often, a role. A role has no password; EC2 instances, Lambda functions, containers or a CI job assume it through AWS STS and get temporary credentials that last from 15 minutes to 12 hours (one hour by default). What a principal may do is written in JSON policies, each statement naming an Effect, the Actions, the Resource ARNs and optional Conditions on tags, source IP, MFA and more.
Evaluation starts from deny. Within one account, a request is allowed if an identity-based or a resource-based policy (such as an S3 bucket policy) allows it, and any explicit Deny anywhere wins. Permissions boundaries, and AWS Organizations’ service control policies (SCPs) and resource control policies (RCPs), can only narrow that: the action has to be allowed by each of them. IAM, IAM Identity Center (single sign-on for people) and STS cost nothing extra.
Why teams pick it
- Fine-grained control over every API action and resource ARN, with conditions on tags, network, MFA and time
- Roles hand workloads short-lived credentials that rotate on their own, so there are no keys to store; OIDC federation does the same for CI systems
- One model that every AWS service uses, and no additional charge
- Organization-wide guardrails (SCPs and RCPs) that no account admin can override
Watch out for
- Many policy types interact, and it can be hard to work out why a call gets
AccessDenied - Size limits bite on large setups: 6,144 characters per managed policy and 20 managed policies per role by default (25 at most)
- Eventually consistent: a new role or policy change may not take effect everywhere straight away, so it doesn’t belong in a hot code path
- It controls access to AWS only; for your own app’s sign-ups and logins AWS offers Amazon Cognito instead
How it fits with other technologies
What uses AWS IAM
- Amazon EC2gets instance credentials from a role inAWS IAM
- Amazon EKSmaps cluster access and Pod roles toAWS IAM
- AWS IoT Coreruns rule actions with roles fromAWS IAM
- AWS Lake Formationadds database-style grants on top ofAWS IAM
- GitHub Actionsgets short-lived credentials over OIDC fromAWS IAM
- Terraformcreates roles and policies inAWS IAM
- Dopplerassumes a role throughAWS IAM
- HashiCorp Vaultissues short-lived AWS credentials throughAWS IAM
A trust policy that lets one GitHub repository assume a role over OIDC · json
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": { "Federated": "arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com" },
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": { "token.actions.githubusercontent.com:aud": "sts.amazonaws.com" },
"StringLike": { "token.actions.githubusercontent.com:sub": "repo:acme/infra:*" }
}
}]
}See it in a real stack
No architecture uses AWS IAM yet. Drop it into the playground and wire it up yourself.Open playground →Worth exploring
kubectl apply a Function manifest that points at code in S3. It explains why you might (one GitOps and RBAC model for pods and functions) but, being AWS’s own post, not the drawbacks.aws-auth ConfigMap, and it routes application traffic through the cluster’s control plane.Where it came from2010–2024
An AWS account starts with a single identity, the root user, which has complete access to every service and resource in it. Before IAM, that was effectively the only identity an account had, so a company with many engineers and programs had to share the same all-powerful credentials, with no way to give each person or program only the permissions it needed.
AWS previewed Identity and Access Management in September 2010 and launched it in May 2011. It let customers create users and groups and attach policy documents to them, covering fifteen AWS services, and set the model AWS still uses: fine-grained permissions on actions and resources, with conditions on when a policy applies. Federation with existing corporate identities and short-lived credentials followed in August 2011, and in June 2012 IAM roles for EC2 took over what AWS called “the muck” of getting access keys onto servers.
As customers spread across many accounts, guardrails moved up a level: service control policies arrived with AWS Organizations in 2017 and resource control policies in 2024. By 2021 IAM was evaluating more than 400 million API calls per second, up from a couple of thousand per second in 2011.
Why it’s built this way
- Deny by default; an explicit deny always wins
- A request succeeds only if some policy allows it and none denies it. That makes the safe outcome the default and lets an administrator block something with certainty, however many other policies allow it.
- Policies as JSON over actions, resources and conditions
- One grammar covers every AWS service, and because policies are data, tools can generate and check them. AWS later built Zelkova (2018), which translates policies into logic so automated reasoning can find misconfigurations.
- Roles with temporary credentials
- Copying long-lived access keys onto servers meant distributing and guarding secrets by hand. Roles make credentials available automatically and let them expire, first for EC2 instances in 2012 and now for Lambda, containers and outside systems over OIDC.
Timeline
- 2010
IAM previewed in September
- 2011
Launches in May; identity federation and temporary credentials in August
- 2012
IAM roles for EC2 instances
- 2017
AWS Organizations brings service control policies
- 2019
IAM Access Analyzer launches
- 2024
Resource control policies set an organization-wide data perimeter
- AWS News Blog: Happy 10th birthday, AWS IAM (2021)
- AWS What’s New: IAM Preview Beta (Sept 2010)
- AWS News Blog: IAM, now with identity federation (Aug 2011)
- AWS What’s New: IAM roles for EC2 instances (June 2012)
- Backes et al.: Semantic-based automated reasoning for AWS access policies using SMT (Zelkova, 2018)
- AWS News Blog: Introducing resource control policies (Nov 2024)
- AWS News Blog: IAM Access Analyzer launches (Dec 2019)
Sources12 · facts checked 5 October 2026
- IAM User Guide: What is IAM? (eventual consistency, no additional charge)
- IAM User Guide: AWS account root user
- AWS STS API Reference: AssumeRole (session duration)
- IAM User Guide: IAM JSON policy elements
- IAM User Guide: AWS global condition context keys
- IAM User Guide: Policy evaluation logic
- AWS Organizations docs: Service control policies
- AWS Organizations docs: Resource control policies
- IAM User Guide: IAM and AWS STS quotas
- IAM Identity Center docs: What is IAM Identity Center?
- Amazon Cognito docs: What is Amazon Cognito?
- GitHub Docs: Configuring OpenID Connect in AWS