| Pattern | Isolation | Cost | Complexity |
|---|---|---|---|
| Silo | Strong (separate resources per tenant) | High | High |
| Pool | Weak (shared resources, tenant_id filter) | Low | Medium |
| Bridge | Mixed (shared compute, separate data) | Medium | Medium |
Tenant A → Account A → DynamoDB Table A, S3 Bucket A
Tenant B → Account B → DynamoDB Table B, S3 Bucket B
Tenant A → Shared DynamoDB Table (PK: tenant_a#...)
Tenant B → Shared DynamoDB Table (PK: tenant_b#...)
{
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:Query"
],
"Resource": "arn:aws:dynamodb:*:*:table/SharedTable",
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": ["${cognito-identity.amazonaws.com:sub}"]
}
}
}
dynamodb:LeadingKeys: Restrict access to items where PK matches user’s identity{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject"],
"Resource": "arn:aws:s3:::shared-bucket/${cognito-identity.amazonaws.com:sub}/*"
}
Exam Tip: dynamodb:LeadingKeys = most common DynamoDB multi-tenant pattern. S3 prefix + policy variables cho S3 isolation. Pool model = cost-effective nhưng cần careful IAM policies.