Free tool
API Gateway integration role policy generator
Pick the services your API Gateway calls and get the integration role it needs — scoped to the right ARNs, with the reason behind every action.
1. Which thing needs the role?
The compute that makes the calls. It assumes the role; everything else is a resource the role points at.
Changing this opens that principal’s own page.
2. What does it call?
Only connections the knowledge base records IAM requirements for. Tick what your API Gateway actually talks to.
3. Fill in your account (optional)
Leave these blank and the ARNs keep visible placeholders, so a half-finished policy fails instead of quietly granting more than you meant.
Your role
Nothing selected yet, so the role below can be assumed but grants nothing. Tick a service above.
{
"Version": "2012-10-17",
"Statement": []
}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "APIGatewayAssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
Before you apply this
- These are the actions this integration typically needs — not a least-privilege proof. After you deploy, narrow the policy with IAM Access Analyzer, which generates one from the calls the principal actually made.
- No permissions were generated. The role below can be assumed but grants nothing — pick at least one service this principal calls.
Worth knowing about a API Gateway integration role
- API Gateway calls the backend service with this role, not with the caller's credentials. (Knowledge base, API Gateway → DynamoDB.)
- This is not the account-level CloudWatch Logs role API Gateway uses for access logging — that one is configured once per account and is a different role.
- The trust policy lets any apigateway.amazonaws.com resource in any account assume this role. AWS recommends narrowing it with an aws:SourceArn (and aws:SourceAccount) condition naming the specific resource that may assume it — add that once you know the ARN.
Grounded in the same data that validates diagrams
Design Beaver models AWS connections so it can tell you when a diagram is wrong. Part of that model is which IAM actions each integration needs and why — researched against AWS documentation, not inferred. This tool reads that data directly, which is why it can explain every statement instead of just emitting one.
It also means the tool knows what it doesn’t know. A connection the knowledge base has no IAM data for is skipped and named, never filled in with a plausible guess. Where an action comes from somewhere other than the knowledge base, it is labelled.
What a API Gateway integration role can be scoped to
API Gateway assumes this role through the apigateway.amazonaws.com service principal. These are the 2 connections the knowledge base records IAM requirements for:
- API Gateway → DynamoDB
Direct AWS service integration — API Gateway maps HTTP methods straight onto DynamoDB actions (GetItem/PutItem/Query/etc.) with no Lambda in between, for a simple CRUD passthrough
dynamodb:GetItemdynamodb:PutItemdynamodb:Querydynamodb:UpdateItemdynamodb:DeleteItemAttach an IAM role to the integration granting the specific DynamoDB actions the API needs — API Gateway calls DynamoDB with that role, not the caller's credentials
Write request/response mapping templates (VTL) to translate between the HTTP request and the DynamoDB API shape — there's no automatic proxy for service integrations the way there is for Lambda
- API Gateway → Step Functions
Direct AWS service integration — an API method starts a Step Functions execution (StartExecution for a Standard workflow, or StartSyncExecution for an Express workflow when the caller needs the result back synchronously), turning an HTTP request into a workflow run with no Lambda in between
states:StartExecutionstates:StartSyncExecutionAttach an IAM role to the integration granting states:StartExecution (or states:StartSyncExecution) on the target state machine — API Gateway starts the workflow with that role, not the caller's credentials
Write request/response mapping templates (VTL) to translate the HTTP request into the StartExecution input and shape the response — as with any non-proxy service integration, there's no automatic passthrough
Generate a role for something else
- EC2instance profile roleDynamoDB · EventBridge · Lambda · S3 · Secrets Manager · SES · SNS · SQS
- Lambdaexecution roleDynamoDB · EventBridge · S3 · Secrets Manager · SES · SNS · SQS
- IoT Corerule action roleDynamoDB · Lambda · S3 · SNS · SQS · Step Functions
- Step Functionsstate machine execution roleDynamoDB · EventBridge · Lambda · S3 · SNS · SQS
- CodeBuildservice roleCodeArtifact · CodeCommit · ECR · S3 · Secrets Manager
- ECStask roleDynamoDB · S3 · Secrets Manager · SNS · SQS
- App Runnerinstance roleDynamoDB · S3 · Secrets Manager
Questions
Where do the actions come from?
Is this a least-privilege policy?
How is this different from the other IAM policy generators?
Does anything I type leave my browser?
Why are there two policies?
Draw it instead, and the role attaches itself
Design Beaver knows which connections need a role because it checks them as you draw. Drop an IAM Role node onto a function and the warnings it resolves disappear. Free, in your browser — sign in with Google or GitHub to save your work.
Sign up for free! →Prefer email? Get new features in your inbox: