IAM policies (JSON structure) in AWS - Time & Space Complexity
Start learning this pattern below
Jump into concepts and practice - no test required
When working with IAM policies in AWS, it's important to understand how the time to process these policies grows as they get bigger or more complex.
We want to know how the number of policy statements affects the time AWS takes to evaluate permissions.
Analyze the time complexity of evaluating an IAM policy with multiple statements.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::example_bucket"
},
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::example_bucket/*"
}
]
}
This policy has multiple statements that AWS evaluates to decide if a request is allowed.
When AWS checks permissions, it looks at each statement in the policy one by one.
- Primary operation: Evaluating each policy statement against the request.
- How many times: Once per statement in the policy.
As the number of statements grows, AWS must check more statements to find a match.
| Input Size (n) | Approx. API Calls/Operations |
|---|---|
| 10 | 10 checks |
| 100 | 100 checks |
| 1000 | 1000 checks |
Pattern observation: The number of checks grows directly with the number of statements.
Time Complexity: O(n)
This means the time to evaluate the policy grows in a straight line as you add more statements.
[X] Wrong: "Adding more statements won't affect evaluation time much because AWS is very fast."
[OK] Correct: Even though AWS is fast, each statement adds work. More statements mean more checks, so evaluation time grows with policy size.
Understanding how policy size affects evaluation helps you design efficient permissions and shows you can think about system performance clearly.
"What if the policy had nested conditions inside statements? How would that affect the time complexity?"
Practice
Solution
Step 1: Understand IAM policy role
An IAM policy is a JSON document that specifies permissions for AWS users, groups, or roles.Step 2: Identify main function
Its main function is to control what actions are allowed or denied on AWS resources.Final Answer:
To define permissions for users and resources -> Option BQuick Check:
IAM policy = permissions definition [OK]
- Confusing IAM policies with data storage
- Thinking IAM policies monitor network traffic
- Assuming IAM policies create virtual machines
Solution
Step 1: Recall IAM policy statement keys
IAM policy statements include keys like Effect, Action, Resource, and optionally Condition.Step 2: Identify key for permission type
The key that specifies whether to allow or deny is "Effect".Final Answer:
"Effect" -> Option DQuick Check:
Effect key = permission type [OK]
- Using "Permission" instead of "Effect"
- Confusing "Action" with permission type
- Mistaking "Resource" for effect
{
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::example-bucket"
}What permission does this statement grant?
Solution
Step 1: Understand the Action "s3:ListBucket"
This action allows listing the bucket itself and its metadata, not the objects inside.Step 2: Match Resource and Action
The resource is the bucket ARN, so permission is to list the bucket (its properties), not the objects inside the bucket.Final Answer:
Allows listing the bucket itself -> Option AQuick Check:
s3:ListBucket = list bucket (not objects) [OK]
- Confusing ListBucket with listing objects inside the bucket
- Assuming permission to delete or upload
- Ignoring the resource ARN level
{
"Effect": "Allow",
"Action": ["ec2:StartInstances", "ec2:StopInstances"],
"Resource": "*",
"Condition": {
"StringEquals": {
"ec2:Region": "us-west-2"
}
}
}Solution
Step 1: Check Condition usage with EC2 actions
EC2 supports conditions like StringEquals on ec2:Region to restrict actions by region.Step 2: Verify Resource and structure
Resource "*" is valid for EC2 start/stop actions because they apply to instances across resources.Final Answer:
The policy is valid and has no errors -> Option CQuick Check:
Condition on ec2:Region with Resource "*" is valid [OK]
- Thinking Condition is invalid for EC2
- Assuming Resource "*" is always wrong
- Misplacing Condition inside Action
Solution
Step 1: Identify required permissions
The user needs permission to read objects only, which is "s3:GetObject" on the bucket's objects.Step 2: Check for delete denial
Not including "s3:DeleteObject" means no delete permission is granted. Explicit deny is not required if no allow exists.Step 3: Validate resource ARN
The resource must include "/*" to specify objects inside the bucket, not the bucket itself.Final Answer:
Allow s3:GetObject on objects in my-data-bucket only -> Option AQuick Check:
Allow read only, no delete = { "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": "arn:aws:s3:::my-data-bucket/*" } [OK]
- Allowing delete by mistake
- Using bucket ARN without /* for objects
- Using wildcard s3:* granting too many permissions
