Skip to content

IAM Reference

This page lists every permission SKE needs, organized by feature group. You only need to grant permissions for features you use — core permissions for deployment, plus optional permissions for databases, caches, networking, and custom domains.

SKE validates permissions per feature group using iam:SimulatePrincipalPolicy. Each group is checked independently, simulating each action on the kind of resource SKE uses it on (such as ske-* functions and roles) in the connection’s region, so both a role scoped to SKE’s resources and one granted the actions on * pass.

SKE doesn’t pass CloudFormation a separate service role, so CloudFormation creates, updates and deletes each stack’s resources (queues, scheduler rules, the CDN, the execution role, log groups, the network’s VPC) with your role’s own permissions. The groups below include those actions.

SKE serves a permission policy for the role it assumes: GET /api/v1/organizations/{org}/workspaces/{workspace}/cloud-providers/aws-policy returns it, split into as many managed policies as it needs to fit AWS’s size limit, along with the permissions boundary below. It grants every action the role check asks for, limited to SKE’s own ske-* resources where AWS allows and on * otherwise. It lets the role create, change and pass ske-* roles only when they carry the permissions boundary.

The dashboard’s Connect cloud provider wizard shows them on its AWS step: the Boundary policy SkeExecutionBoundary first, then each Role policy (SkeAccess1, SkeAccess2, …), each with Name and JSON copy buttons, then the Trust policy. Its steps:

  1. In IAM, Policies, create the boundary policy SkeExecutionBoundary first, from its JSON. Don’t attach it: the roles SKE creates for your functions carry it.
  2. Create each role policy under its name.
  3. Create a role for another AWS account with the trust policy, and attach the role policies to it.
  4. Enter the role ARN, pick a default region and select Validate connection.

Warnings from the check, such as a missing boundary or a low Lambda concurrency limit, show in the permission checklist and don’t stop you from continuing.

SkeExecutionBoundary is a customer-managed policy you create in the account from the boundary SKE serves, without attaching it to anything. Every execution role SKE creates for your functions carries it, so a role SKE creates can never do more than it allows: write logs, manage the functions’ VPC network interfaces, use the environment’s queues, the storage bucket and mail, and invoke its own functions (the warmer). SKE’s role can’t create or change the boundary.

  • With a role granted on *, the boundary is optional. Without it, the connection check warns, and the execution roles carry no boundary. Once it exists, each environment’s next deploy adds it to its role.
  • With the scoped policy, the boundary is required: the role can only create roles that carry it, so the connection check fails until it exists.

To move an existing environment to the scoped policy:

  1. Create SkeExecutionBoundary from the boundary SKE serves.
  2. Deploy each environment once with the role’s current policy. The deploy adds the boundary to the execution role.
  3. Replace the role’s policy with the scoped policy, then run Re-validate on the connection.

If a deploy can’t read the boundary (iam:GetPolicy), the execution role keeps whatever boundary it carries now and the deploy says so.

ecr:GetAuthorizationToken
ecr:CreateRepository
ecr:DescribeRepositories
ecr:BatchCheckLayerAvailability
ecr:GetDownloadUrlForLayer
ecr:BatchGetImage
ecr:InitiateLayerUpload
ecr:UploadLayerPart
ecr:CompleteLayerUpload
ecr:PutImage
ecr:SetRepositoryPolicy
ecr:GetRepositoryPolicy
ecr:DeleteRepository
ecr:ListImages
ecr:BatchDeleteImage
ecr:PutLifecyclePolicy
ecr:DescribeImages
ecr:ListTagsForResource
ecr:TagResource
ecr:UntagResource
lambda:CreateFunction
lambda:UpdateFunctionCode
lambda:UpdateFunctionConfiguration
lambda:GetFunction
lambda:DeleteFunction
lambda:InvokeFunction
lambda:GetFunctionConfiguration
lambda:ListFunctions
lambda:AddPermission
lambda:GetPolicy
lambda:RemovePermission
lambda:CreateAlias
lambda:UpdateAlias
lambda:GetAlias
lambda:DeleteAlias
lambda:PublishVersion
lambda:ListVersionsByFunction
lambda:PutFunctionConcurrency
lambda:DeleteFunctionConcurrency
lambda:GetFunctionConcurrency
lambda:TagResource
lambda:UntagResource
lambda:ListTags
lambda:PutFunctionEventInvokeConfig
lambda:GetFunctionEventInvokeConfig
lambda:CreateEventSourceMapping
lambda:GetEventSourceMapping
lambda:UpdateEventSourceMapping
lambda:DeleteEventSourceMapping
lambda:ListEventSourceMappings
lambda:PutProvisionedConcurrencyConfig
lambda:GetProvisionedConcurrencyConfig
lambda:DeleteProvisionedConcurrencyConfig
lambda:ListProvisionedConcurrencyConfigs
lambda:GetAccountSettings

lambda:GetAccountSettings lets the connection check read the account’s Lambda concurrency limit. Below 100 concurrent executions it warns that requests and queued jobs would be throttled under load, and says to request a higher Concurrent executions quota in the Service Quotas console.

CloudFormation — Infrastructure Provisioning

Section titled “CloudFormation — Infrastructure Provisioning”
cloudformation:CreateStack
cloudformation:UpdateStack
cloudformation:DeleteStack
cloudformation:DescribeStacks
cloudformation:DescribeStackEvents
cloudformation:DescribeStackResources
cloudformation:GetTemplate
cloudformation:ListStacks
cloudformation:ValidateTemplate
cloudformation:CreateChangeSet
cloudformation:DescribeChangeSet
cloudformation:ExecuteChangeSet
cloudformation:DeleteChangeSet
cloudformation:CancelUpdateStack
ssm:PutParameter
ssm:GetParameter
ssm:GetParameters
ssm:GetParametersByPath
ssm:DeleteParameter
ssm:DeleteParameters
ssm:DescribeParameters
ssm:AddTagsToResource
ssm:RemoveTagsFromResource
ssm:ListTagsForResource
dynamodb:CreateTable
dynamodb:DeleteTable
dynamodb:DescribeTable
dynamodb:PutItem
dynamodb:GetItem
dynamodb:UpdateItem
dynamodb:DeleteItem
dynamodb:Query
dynamodb:Scan
dynamodb:TagResource
dynamodb:UntagResource
dynamodb:ListTagsOfResource
dynamodb:UpdateTimeToLive
s3:CreateBucket
s3:DeleteBucket
s3:PutObject
s3:GetObject
s3:DeleteObject
s3:ListBucket
s3:PutBucketPolicy
s3:GetBucketPolicy
s3:PutBucketCors
s3:GetBucketCors
s3:PutBucketWebsite
s3:GetBucketWebsite
s3:PutBucketOwnershipControls
s3:PutBucketPublicAccessBlock
s3:PutBucketCORS
s3:PutBucketTagging
s3:PutLifecycleConfiguration
s3:DeleteBucketPolicy
s3:GetBucketAcl
s3:TagResource
s3:UntagResource
apigateway:POST
apigateway:GET
apigateway:DELETE
apigateway:PUT
apigateway:PATCH
logs:CreateLogGroup
logs:DeleteLogGroup
logs:DescribeLogGroups
logs:CreateLogStream
logs:DescribeLogStreams
logs:GetLogEvents
logs:FilterLogEvents
logs:PutRetentionPolicy
logs:TagLogGroup
logs:UntagLogGroup
logs:ListTagsLogGroup
logs:TagResource
logs:UntagResource
logs:ListTagsForResource
logs:DescribeResourcePolicies
logs:DescribeIndexPolicies
logs:GetDataProtectionPolicy

The environment’s metrics page reads these. Without them, it names the missing action instead of showing metrics.

cloudwatch:GetMetricData
cloudwatch:ListMetrics
iam:CreateRole
iam:DeleteRole
iam:GetRole
iam:PassRole
iam:AttachRolePolicy
iam:DetachRolePolicy
iam:PutRolePolicy
iam:DeleteRolePolicy
iam:GetRolePolicy
iam:ListRolePolicies
iam:ListAttachedRolePolicies
iam:TagRole
iam:UntagRole
iam:UpdateAssumeRolePolicy
iam:SimulatePrincipalPolicy
iam:PutRolePermissionsBoundary
iam:GetPolicy
iam:CreateServiceLinkedRole

iam:PutRolePermissionsBoundary adds the permissions boundary to an execution role created before it, and iam:GetPolicy lets the connection check and each deploy read the boundary. iam:CreateServiceLinkedRole creates RDS’s or ElastiCache’s service-linked role for the first database or cache in an account.

secretsmanager:CreateSecret
secretsmanager:DeleteSecret
secretsmanager:GetSecretValue
secretsmanager:PutSecretValue
secretsmanager:UpdateSecret
secretsmanager:DescribeSecret
secretsmanager:ListSecrets
secretsmanager:TagResource
secretsmanager:UntagResource
secretsmanager:RestoreSecret

CloudFront — Assets CDN and static sites

Section titled “CloudFront — Assets CDN and static sites”
cloudfront:CreateDistribution
cloudfront:GetDistribution
cloudfront:GetDistributionConfig
cloudfront:UpdateDistribution
cloudfront:DeleteDistribution
cloudfront:ListDistributions
cloudfront:TagResource
cloudfront:UntagResource
cloudfront:ListTagsForResource
cloudfront:ListOriginAccessControls
cloudfront:CreateOriginAccessControl
cloudfront:DeleteOriginAccessControl
cloudfront:CreateFunction
cloudfront:DescribeFunction
cloudfront:GetFunction
cloudfront:UpdateFunction
cloudfront:PublishFunction
cloudfront:DeleteFunction
cloudfront:ListFunctions
servicequotas:GetServiceQuota
events:PutRule
events:PutTargets
events:DescribeRule
events:ListTargetsByRule
events:RemoveTargets
events:DeleteRule
events:TagResource
events:UntagResource
events:ListTagsForResource
rds:CreateDBInstance
rds:DeleteDBInstance
rds:DescribeDBInstances
rds:ModifyDBInstance
rds:RebootDBInstance
rds:CreateDBSubnetGroup
rds:DeleteDBSubnetGroup
rds:DescribeDBSubnetGroups
rds:ModifyDBSubnetGroup
rds:DescribeDBProxies
rds:DescribeOrderableDBInstanceOptions
rds:DescribeDBEngineVersions
rds:CreateDBCluster
rds:DeleteDBCluster
rds:DescribeDBClusters
rds:ModifyDBCluster
rds:AddTagsToResource
rds:RemoveTagsFromResource
rds:ListTagsForResource
rds:CreateDBSnapshot
rds:DeleteDBSnapshot
rds:DescribeDBSnapshots
rds:RestoreDBInstanceFromDBSnapshot
elasticache:CreateCacheCluster
elasticache:DeleteCacheCluster
elasticache:DescribeCacheClusters
elasticache:ModifyCacheCluster
elasticache:CreateReplicationGroup
elasticache:DeleteReplicationGroup
elasticache:DescribeReplicationGroups
elasticache:ModifyReplicationGroup
elasticache:CreateCacheSubnetGroup
elasticache:DeleteCacheSubnetGroup
elasticache:DescribeCacheSubnetGroups
elasticache:ModifyCacheSubnetGroup
elasticache:CreateServerlessCache
elasticache:DeleteServerlessCache
elasticache:DescribeServerlessCaches
elasticache:ModifyServerlessCache
elasticache:DescribeReservedCacheNodesOfferings
elasticache:AddTagsToResource
elasticache:RemoveTagsFromResource
elasticache:ListTagsForResource
ec2:CreateVpc
ec2:DeleteVpc
ec2:DescribeVpcs
ec2:DescribeVpcAttribute
ec2:ModifyVpcAttribute
ec2:DescribeNetworkAcls
ec2:CreateSubnet
ec2:DeleteSubnet
ec2:DescribeSubnets
ec2:ModifySubnetAttribute
ec2:CreateSecurityGroup
ec2:DeleteSecurityGroup
ec2:DescribeSecurityGroups
ec2:DescribeSecurityGroupRules
ec2:GetSecurityGroupsForVpc
ec2:AuthorizeSecurityGroupIngress
ec2:RevokeSecurityGroupIngress
ec2:AuthorizeSecurityGroupEgress
ec2:RevokeSecurityGroupEgress
ec2:CreateInternetGateway
ec2:DeleteInternetGateway
ec2:AttachInternetGateway
ec2:DetachInternetGateway
ec2:DescribeInternetGateways
ec2:CreateNatGateway
ec2:DeleteNatGateway
ec2:DescribeNatGateways
ec2:AllocateAddress
ec2:ReleaseAddress
ec2:DescribeAddresses
ec2:DisassociateAddress
ec2:CreateRouteTable
ec2:DeleteRouteTable
ec2:DescribeRouteTables
ec2:DescribeVpcEndpoints
ec2:CreateRoute
ec2:ReplaceRoute
ec2:DeleteRoute
ec2:AssociateRouteTable
ec2:ReplaceRouteTableAssociation
ec2:DisassociateRouteTable
ec2:CreateTags
ec2:DeleteTags
ec2:DescribeTags
ec2:DescribeAvailabilityZones
ec2:DescribeAccountAttributes
ec2:DescribeNetworkInterfaces
ec2:DeleteNetworkInterface
ec2:DescribeInstances

Before a deploy into a VPC with queues or storage, SKE reads the subnets’ route tables and the VPC’s endpoints (ec2:DescribeRouteTables, ec2:DescribeVpcEndpoints). If a subnet has no route to SQS or S3, through a NAT gateway or a VPC endpoint, the deploy stops before it starts and asks for a NAT gateway, VPC endpoints or other subnets. Without the check, the app’s calls to SQS or S3 would hang until they time out.

acm:RequestCertificate
acm:DeleteCertificate
acm:DescribeCertificate
acm:ListCertificates
acm:AddTagsToCertificate
acm:RemoveTagsFromCertificate
acm:ListTagsForCertificate
route53:CreateHostedZone
route53:DeleteHostedZone
route53:GetHostedZone
route53:ListHostedZones
route53:ChangeResourceRecordSets
route53:ListResourceRecordSets
route53:GetChange
route53:ListHostedZonesByName
sqs:CreateQueue
sqs:DeleteQueue
sqs:GetQueueUrl
sqs:GetQueueAttributes
sqs:SetQueueAttributes
sqs:SendMessage
sqs:ReceiveMessage
sqs:DeleteMessage
sqs:PurgeQueue
sqs:ListQueues
sqs:TagQueue
sqs:UntagQueue
sqs:ListQueueTags
ses:SendEmail
ses:SendRawEmail
ses:GetAccount
ses:CreateEmailIdentity
ses:DeleteEmailIdentity
ses:GetEmailIdentity
ses:PutAccountDetails
ses:CreateConfigurationSet
ses:DeleteConfigurationSet
ses:CreateConfigurationSetEventDestination
ses:UpdateConfigurationSetEventDestination
ses:DeleteConfigurationSetEventDestination
ses:TagResource
sns:CreateTopic
sns:DeleteTopic
sns:Subscribe
sns:SetTopicAttributes
sns:TagResource

GCP uses predefined roles instead of individual permissions.

Role Purpose
roles/serviceusage.serviceUsageAdmin Enable and manage GCP APIs
roles/iam.serviceAccountAdmin Create service accounts for Cloud Run
roles/iam.serviceAccountUser Run Cloud Run services as those service accounts
roles/resourcemanager.projectIamAdmin Bind IAM policies to project resources
roles/datastore.owner Firestore for deployment state tracking
roles/run.admin Deploy and manage Cloud Run services
roles/artifactregistry.admin Push and manage container images, tag the live image, and set the repository’s cleanup policy
roles/secretmanager.admin Create and manage secrets
roles/cloudtasks.admin Create and manage task queues
roles/cloudscheduler.admin Create and manage scheduled jobs
roles/logging.viewer Read application logs
roles/storage.objectAdmin Upload, serve and delete old static assets
Role When needed Purpose
roles/compute.networkAdmin Networking Create VPCs, subnets, firewall rules
roles/cloudsql.admin Databases Create and manage Cloud SQL instances
roles/redis.admin Caching Create and manage Memorystore instances
roles/dns.admin Listed with the infrastructure roles Cloud DNS; custom domains use Certificate Manager and the load balancer instead

serviceusage.googleapis.com must be enabled by hand first. Connecting a provider checks the others: it stops when a critical API is off (iam, run, artifactregistry, firestore, secretmanager, cloudresourcemanager) and warns when an optional one is (cloudtasks, cloudscheduler, logging, storage, compute, sqladmin, redis, dns).

The first deploy enables all 16 APIs SKE needs: iam, run, artifactregistry, firestore, secretmanager, cloudtasks, cloudscheduler, logging, monitoring, cloudresourcemanager, storage, compute, sqladmin, redis, dns and servicenetworking (each <name>.googleapis.com).