Minimum Permissions Policies
The following policies are designed from the principle of least privilege. You can use these policies to narrow the permissions Palette requires to operate instead of using the Core IAM Policies.
Step 1: Add Minimum Permissions Policies to IAM User or Role
Create an IAM User or Role with at least one of the policies listed based on your use case.
- Minimum EKS Dynamic Permissions
- Minimum EKS Static Permissions
- Minimum IaaS Dynamic Permissions
- Minimum IaaS Static Permissions
The following policy allows Palette to operate and create Virtual Private Cloud (VPC) resources as needed while retaining minimal permissions for deploying Amazon Web Services (AWS) Elastic Kubernetes Service (EKS) clusters through Palette.
Last Update: November 3, 2026
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ASGDescribe",
"Effect": "Allow",
"Action": "autoscaling:DescribeAutoScalingGroups",
"Resource": "*"
},
{
"Sid": "EC2Permissions",
"Effect": "Allow",
"Action": [
"ec2:AuthorizeSecurityGroupIngress",
"ec2:DeleteSubnet",
"ec2:DescribeAddresses",
"ec2:DescribeInstances",
"ec2:CreateNatGateway",
"ec2:DescribeRegions",
"ec2:CreateVpc",
"ec2:AttachInternetGateway",
"ec2:DescribeVpcAttribute",
"ec2:DeleteRouteTable",
"ec2:ModifySubnetAttribute",
"ec2:AssociateRouteTable",
"ec2:DescribeInternetGateways",
"ec2:DescribeNetworkInterfaces",
"ec2:DescribeAvailabilityZones",
"ec2:CreateRoute",
"ec2:CreateInternetGateway",
"ec2:CreateSecurityGroup",
"ec2:ModifyVpcAttribute",
"ec2:DeleteInternetGateway",
"ec2:DescribeKeyPairs",
"ec2:DescribeRouteTables",
"ec2:ReleaseAddress",
"ec2:CreateTags",
"ec2:DeleteNetworkInterface",
"ec2:CreateRouteTable",
"ec2:DetachInternetGateway",
"ec2:DescribeNatGateways",
"ec2:DisassociateRouteTable",
"ec2:AllocateAddress",
"ec2:DescribeSecurityGroups",
"ec2:DescribeVpcs",
"ec2:DeleteSecurityGroup",
"ec2:DeleteNatGateway",
"ec2:DescribeVpcEndpoints",
"ec2:DeleteVpc",
"ec2:CreateSubnet",
"ec2:DescribeSubnets",
"ec2:DescribeTags",
"ec2:DescribeVolumes"
],
"Resource": "*"
},
{
"Sid": "EKSPermissions",
"Effect": "Allow",
"Action": [
"eks:DeleteCluster",
"eks:DescribeNodegroup",
"eks:DeleteNodegroup",
"eks:TagResource",
"eks:ListAddons",
"eks:DescribeCluster",
"eks:CreateNodegroup",
"eks:CreateCluster"
],
"Resource": "*"
},
{
"Sid": "IAMListOpenIDConnectProviders",
"Effect": "Allow",
"Action": "iam:ListOpenIDConnectProviders",
"Resource": "*"
},
{
"Sid": "IAMOpenIDConnectProviderPermissions",
"Effect": "Allow",
"Action": [
"iam:DeleteOpenIDConnectProvider",
"iam:GetOpenIDConnectProvider",
"iam:TagOpenIDConnectProvider",
"iam:CreateOpenIDConnectProvider"
],
"Resource": [
"arn:aws:iam::*:oidc-provider/*"
]
},
{
"Sid": "IAMRolePermissions",
"Effect": "Allow",
"Action": [
"iam:GetRole",
"iam:PassRole",
"iam:ListAttachedRolePolicies"
],
"Resource": [
"arn:*:iam::*:role/*.cluster-api-provider-aws.sigs.k8s.io"
]
},
{
"Sid": "IAMClusterRoles",
"Effect": "Allow",
"Action": [
"iam:CreateRole",
"iam:DeleteRole",
"iam:GetRole",
"iam:TagRole",
"iam:PassRole",
"iam:AttachRolePolicy",
"iam:DetachRolePolicy",
"iam:ListAttachedRolePolicies",
"iam:PutRolePolicy",
"iam:DeleteRolePolicy",
"iam:ListRolePolicies"
],
"Resource": [
"arn:*:iam::*:role/*-iam-service-role",
"arn:*:iam::*:role/ng-role_*"
]
},
{
"Sid": "IAMAWSManagedPolicyRead",
"Effect": "Allow",
"Action": [
"iam:GetPolicy"
],
"Resource": [
"arn:*:iam::aws:policy/*"
]
},
{
"Sid": "EKSServiceLinkedRoles",
"Effect": "Allow",
"Action": [
"iam:CreateServiceLinkedRole"
],
"Resource": [
"arn:*:iam::*:role/aws-service-role/eks.amazonaws.com/AWSServiceRoleForAmazonEKS",
"arn:*:iam::*:role/aws-service-role/eks-nodegroup.amazonaws.com/AWSServiceRoleForAmazonEKSNodegroup"
]
},
{
"Sid": "EKSOptimizedAMILookup",
"Effect": "Allow",
"Action": [
"ssm:GetParameter"
],
"Resource": [
"arn:*:ssm:*:*:parameter/aws/service/eks/optimized-ami/*"
]
},
{
"Sid": "EKSServiceLinkedRoleRead",
"Effect": "Allow",
"Action": [
"iam:GetRole"
],
"Resource": [
"arn:*:iam::*:role/aws-service-role/eks.amazonaws.com/AWSServiceRoleForAmazonEKS",
"arn:*:iam::*:role/aws-service-role/eks-nodegroup.amazonaws.com/AWSServiceRoleForAmazonEKSNodegroup",
"arn:*:iam::*:role/aws-service-role/eks-fargate-pods.amazonaws.com/AWSServiceRoleForAmazonEKSForFargate"
]
},
{
"Sid": "ASGManagement",
"Effect": "Allow",
"Action": [
"autoscaling:CreateOrUpdateTags",
"autoscaling:DeleteTags",
"autoscaling:UpdateAutoScalingGroup",
"autoscaling:StartInstanceRefresh",
"autoscaling:CancelInstanceRefresh"
],
"Resource": [
"arn:*:autoscaling:*:*:autoScalingGroup:*:autoScalingGroupName/*"
]
},
{
"Sid": "ASGDescribeMore",
"Effect": "Allow",
"Action": [
"autoscaling:DescribeInstanceRefreshes",
"autoscaling:DescribeTags"
],
"Resource": [
"*"
]
}
]
}
The following policy allows Palette to operate within an existing VPC while retaining minimal permissions for deploying AWS EKS clusters through Palette.
Last Update: February 21, 2026
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ASGDescribe",
"Effect": "Allow",
"Action": "autoscaling:DescribeAutoScalingGroups",
"Resource": "*"
},
{
"Sid": "EC2Permissions",
"Effect": "Allow",
"Action": [
"ec2:AuthorizeSecurityGroupIngress",
"ec2:DescribeAddresses",
"ec2:DescribeInstances",
"ec2:DeleteTags",
"ec2:DescribeTags",
"ec2:CreateTags",
"ec2:DescribeRegions",
"ec2:DescribeNatGateways",
"ec2:DescribeSecurityGroups",
"ec2:DescribeNetworkInterfaces",
"ec2:DescribeAvailabilityZones",
"ec2:DescribeVpcs",
"ec2:CreateSecurityGroup",
"ec2:DeleteSecurityGroup",
"ec2:DescribeSubnets",
"ec2:DescribeKeyPairs",
"ec2:DescribeRouteTables"
],
"Resource": "*"
},
{
"Sid": "EKSPermissions",
"Effect": "Allow",
"Action": [
"eks:DeleteCluster",
"eks:DescribeNodegroup",
"eks:DeleteNodegroup",
"eks:TagResource",
"eks:ListAddons",
"eks:DescribeCluster",
"eks:CreateNodegroup",
"eks:CreateCluster"
],
"Resource": "*"
},
{
"Sid": "IAMListOpenIDConnectProviders",
"Effect": "Allow",
"Action": "iam:ListOpenIDConnectProviders",
"Resource": "*"
},
{
"Sid": "IAMOpenIDConnectProviderPermissions",
"Effect": "Allow",
"Action": [
"iam:DeleteOpenIDConnectProvider",
"iam:GetOpenIDConnectProvider",
"iam:TagOpenIDConnectProvider",
"iam:CreateOpenIDConnectProvider"
],
"Resource": [
"arn:aws:iam::*:oidc-provider/*"
]
},
{
"Sid": "IAMRolePermissions",
"Effect": "Allow",
"Action": [
"iam:GetRole",
"iam:PassRole",
"iam:ListAttachedRolePolicies"
],
"Resource": [
"arn:*:iam::*:role/*.cluster-api-provider-aws.sigs.k8s.io"
]
}
]
}
The following policy allows Palette to operate and create VPC resources as needed while retaining minimal permissions for deploying AWS Infrastructure as a Service (IaaS) clusters through Palette.
Last Update: October 27, 2026
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EC2Permissions",
"Effect": "Allow",
"Action": [
"ec2:AuthorizeSecurityGroupIngress",
"ec2:GetInstanceMetadataDefaults",
"ec2:DeleteSubnet",
"ec2:DescribeAddresses",
"ec2:DescribeInstances",
"ec2:CreateNatGateway",
"ec2:DescribeRegions",
"ec2:CreateVpc",
"ec2:DescribeDhcpOptions",
"ec2:AttachInternetGateway",
"ec2:DescribeVpcAttribute",
"ec2:DeleteRouteTable",
"ec2:ModifySubnetAttribute",
"ec2:AssociateRouteTable",
"ec2:DescribeInternetGateways",
"ec2:DescribeNetworkInterfaces",
"ec2:DescribeAvailabilityZones",
"ec2:CreateRoute",
"ec2:CreateInternetGateway",
"ec2:CreateSecurityGroup",
"ec2:ModifyVpcAttribute",
"ec2:DescribeKeyPairs",
"ec2:DescribeRouteTables",
"ec2:ReleaseAddress",
"ec2:TerminateInstances",
"ec2:CreateTags",
"ec2:CreateRouteTable",
"ec2:RunInstances",
"ec2:DetachInternetGateway",
"ec2:DescribeNatGateways",
"ec2:DisassociateRouteTable",
"ec2:AllocateAddress",
"ec2:DescribeSecurityGroups",
"ec2:RevokeSecurityGroupIngress",
"ec2:DescribeImages",
"ec2:DescribeVpcs",
"ec2:DeleteSecurityGroup",
"ec2:DescribeInstanceTypes",
"ec2:DeleteNatGateway",
"ec2:DescribeVpcEndpoints",
"ec2:DeleteVpc",
"ec2:CreateSubnet",
"ec2:DescribeSubnets"
],
"Resource": "*"
},
{
"Sid": "ELBPermissions",
"Effect": "Allow",
"Action": [
"elasticloadbalancing:DeleteLoadBalancer",
"elasticloadbalancing:DescribeLoadBalancerAttributes",
"elasticloadbalancing:DescribeLoadBalancers",
"elasticloadbalancing:CreateLoadBalancer",
"elasticloadbalancing:DescribeTags",
"elasticloadbalancing:ConfigureHealthCheck",
"elasticloadbalancing:AddTags",
"elasticloadbalancing:RegisterInstancesWithLoadBalancer",
"elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
"elasticloadbalancing:ModifyLoadBalancerAttributes"
],
"Resource": "*"
},
{
"Sid": "IAMPassRole",
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": [
"arn:*:iam::*:role/*.cluster-api-provider-aws.sigs.k8s.io"
]
},
{
"Sid": "IAMBootstrapDriftProbe",
"Effect": "Allow",
"Action": [
"iam:GetRole",
"iam:GetInstanceProfile"
],
"Resource": [
"arn:*:iam::*:role/*.cluster-api-provider-aws.sigs.k8s.io",
"arn:*:iam::*:instance-profile/*.cluster-api-provider-aws.sigs.k8s.io"
]
},
{
"Sid": "IAMBootstrapStackTagging",
"Effect": "Allow",
"Action": [
"iam:TagRole",
"iam:UntagRole"
],
"Resource": [
"arn:*:iam::*:role/*.cluster-api-provider-aws.sigs.k8s.io"
]
},
{
"Sid": "SecretsManagerPermissions",
"Effect": "Allow",
"Action": [
"secretsmanager:CreateSecret",
"secretsmanager:DeleteSecret",
"secretsmanager:TagResource"
],
"Resource": [
"arn:*:secretsmanager:*:*:secret:aws.cluster.x-k8s.io/*"
]
}
]
}
The following policy allows Palette to operate within an existing VPC while retaining minimal permissions for deploying AWS Infrastructure as a Service (IaaS) clusters through Palette.
Last Update: February 21, 2026
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EC2Permissions",
"Effect": "Allow",
"Action": [
"ec2:AuthorizeSecurityGroupIngress",
"ec2:DescribeAddresses",
"ec2:DescribeInstances",
"ec2:TerminateInstances",
"ec2:DeleteTags",
"ec2:DescribeTags",
"ec2:CreateTags",
"ec2:DescribeDhcpOptions",
"ec2:RunInstances",
"ec2:DescribeNatGateways",
"ec2:DescribeSecurityGroups",
"ec2:RevokeSecurityGroupIngress",
"ec2:DescribeImages",
"ec2:DescribeNetworkInterfaces",
"ec2:DescribeAvailabilityZones",
"ec2:DescribeVpcs",
"ec2:CreateSecurityGroup",
"ec2:DeleteSecurityGroup",
"ec2:DescribeSubnets",
"ec2:DescribeRouteTables"
],
"Resource": "*"
},
{
"Sid": "ELBPermissions",
"Effect": "Allow",
"Action": [
"elasticloadbalancing:DeleteLoadBalancer",
"elasticloadbalancing:DescribeLoadBalancerAttributes",
"elasticloadbalancing:DescribeLoadBalancers",
"elasticloadbalancing:CreateLoadBalancer",
"elasticloadbalancing:DescribeTags",
"elasticloadbalancing:ConfigureHealthCheck",
"elasticloadbalancing:AddTags",
"elasticloadbalancing:RegisterInstancesWithLoadBalancer",
"elasticloadbalancing:ModifyLoadBalancerAttributes"
],
"Resource": "*"
},
{
"Sid": "IAMPassRole",
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": [
"arn:*:iam::*:role/*.cluster-api-provider-aws.sigs.k8s.io"
]
},
{
"Sid": "SecretsManagerPermissions",
"Effect": "Allow",
"Action": [
"secretsmanager:CreateSecret",
"secretsmanager:DeleteSecret",
"secretsmanager:TagResource"
],
"Resource": [
"arn:*:secretsmanager:*:*:secret:aws.cluster.x-k8s.io/*"
]
}
]
}
-
These permissions specified do not include all the permissions required for all possible use cases and for taking full advantage of all Palette features. Additional permissions may be required based on the specific use case. Review the Additional IAM Policies for Specific Use Cases section for more information.
-
These IAM policies cannot be used as inline policies because they exceed AWS's 2048 non-whitespace-character limit. We recommend breaking the policy into multiple inline policies or creating new managed policies.
-
The following IAM warning is expected and can be ignored.
These policies define some actions, resources, or conditions that do not provide permissions. To grant access, policies must have an action that has an applicable resource or condition.
Step 2: Choose CloudFormation Stack Management Option
Once you have created the IAM User or Role, there are two options for using minimum permissions policies:
-
Option 1 - If you want Palette to manage the CloudFormation stack automatically, add the additional policies listed in the Option 1: Automatic CloudFormation Stack Management section.
-
Option 2 - If you want to manage the CloudFormation stack manually and avoid adding additional permissions, follow the steps in the Option 2: Manual CloudFormation Stack Management section to create the stack and configure your cluster profiles to use it.
If you want to use option 2 for deploying AWS Infrastructure as a Service (IaaS) clusters, you must use the Palette eXtended Kubernetes (PXK) pack for the Kubernetes layer of your cluster profiles.
Only the PXK pack supports the manageCloudFormationStackManually property required to reference a manually
created CloudFormation stack.
Option 1: Automatic CloudFormation Stack Management
Assign the following additional permissions policy on top of the minimum permissions policies to your IAM User or Role. These permissions allow Palette to manage the creation and lifecycle of the CloudFormation stack used for provisioning the required Cluster API Provider AWS (CAPA) roles automatically.
Keep iam:TagRole and iam:UntagRole in this policy, even if a policy audit reports them as unused. AWS
CloudFormation, not Palette, uses these actions to tag the IAM roles in the CloudFormation stack that Palette uses, and
stack updates fail without them.
Last Update: November 3, 2026
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CloudFormationStackPermissions",
"Effect": "Allow",
"Action": [
"cloudformation:CreateStack",
"cloudformation:DescribeStacks",
"cloudformation:UpdateStack",
"cloudformation:DescribeStackEvents",
"cloudformation:DescribeStackResources",
"cloudformation:ListStackResources",
"cloudformation:GetTemplate",
"cloudformation:ContinueUpdateRollback",
"cloudformation:DeleteStack"
],
"Resource": "*"
},
{
"Sid": "IAMCAPARolePermissions",
"Effect": "Allow",
"Action": [
"iam:CreateRole",
"iam:AttachRolePolicy",
"iam:TagRole",
"iam:UntagRole",
"iam:UpdateAssumeRolePolicy",
"iam:GetPolicyVersion",
"iam:CreatePolicyVersion",
"iam:DeletePolicyVersion",
"iam:GetPolicy",
"iam:ListPolicyVersions",
"iam:GetRole",
"iam:GetInstanceProfile",
"iam:DetachRolePolicy",
"iam:CreatePolicy",
"iam:TagPolicy",
"iam:CreateInstanceProfile",
"iam:AddRoleToInstanceProfile",
"iam:TagInstanceProfile",
"iam:DeletePolicy",
"iam:DeleteRole",
"iam:DeleteInstanceProfile",
"iam:RemoveRoleFromInstanceProfile"
],
"Resource": "*"
}
]
}
Option 2: Manual CloudFormation Stack Management
After adding the minimum permissions policies to your IAM User or Role, you must complete the additional steps outlined in the following sections:
Create CloudFormation Stacks for Palette
When using the minimum permissions policies, you must manually create the CloudFormation stack that Palette uses to create the required Cluster API Provider AWS (CAPA) roles.
-
Create a file named
palette-cloudformation-input-template.yamland copy the contents of the following CloudFormation template. This template is used for creating the required CAPA roles.Last Update: February 14, 2026
AWSTemplateFormatVersion: 2010-09-09
Resources:
AWSIAMInstanceProfileControlPlane:
Properties:
InstanceProfileName: control-plane.cluster-api-provider-aws.sigs.k8s.io
Roles:
- Ref: AWSIAMRoleControlPlane
Type: AWS::IAM::InstanceProfile
AWSIAMInstanceProfileControllers:
Properties:
InstanceProfileName: controllers.cluster-api-provider-aws.sigs.k8s.io
Roles:
- Ref: AWSIAMRoleControllers
Type: AWS::IAM::InstanceProfile
AWSIAMInstanceProfileNodes:
Properties:
InstanceProfileName: nodes.cluster-api-provider-aws.sigs.k8s.io
Roles:
- Ref: AWSIAMRoleNodes
Type: AWS::IAM::InstanceProfile
AWSIAMManagedPolicyCloudProviderControlPlane:
Properties:
Description: For the Kubernetes Cloud Provider AWS Control Plane
ManagedPolicyName: control-plane.cluster-api-provider-aws.sigs.k8s.io
PolicyDocument:
Statement:
- Action:
- autoscaling:DescribeAutoScalingGroups
- autoscaling:DescribeLaunchConfigurations
- autoscaling:DescribeTags
- ec2:AssignIpv6Addresses
- ec2:DescribeInstances
- ec2:DescribeImages
- ec2:DescribeRegions
- ec2:DescribeRouteTables
- ec2:DescribeSecurityGroups
- ec2:DescribeSubnets
- ec2:DescribeVolumes
- ec2:CreateSecurityGroup
- ec2:CreateTags
- ec2:CreateVolume
- ec2:ModifyInstanceAttribute
- ec2:ModifyVolume
- ec2:AttachVolume
- ec2:AuthorizeSecurityGroupIngress
- ec2:CreateRoute
- ec2:DeleteRoute
- ec2:DeleteSecurityGroup
- ec2:DeleteVolume
- ec2:DetachVolume
- ec2:RevokeSecurityGroupIngress
- ec2:DescribeVpcs
- elasticloadbalancing:AddTags
- elasticloadbalancing:AttachLoadBalancerToSubnets
- elasticloadbalancing:ApplySecurityGroupsToLoadBalancer
- elasticloadbalancing:CreateLoadBalancer
- elasticloadbalancing:CreateLoadBalancerPolicy
- elasticloadbalancing:CreateLoadBalancerListeners
- elasticloadbalancing:ConfigureHealthCheck
- elasticloadbalancing:DeleteLoadBalancer
- elasticloadbalancing:DeleteLoadBalancerListeners
- elasticloadbalancing:DescribeLoadBalancers
- elasticloadbalancing:DescribeLoadBalancerAttributes
- elasticloadbalancing:DetachLoadBalancerFromSubnets
- elasticloadbalancing:DeregisterInstancesFromLoadBalancer
- elasticloadbalancing:ModifyLoadBalancerAttributes
- elasticloadbalancing:RegisterInstancesWithLoadBalancer
- elasticloadbalancing:SetLoadBalancerPoliciesForBackendServer
- elasticloadbalancing:CreateListener
- elasticloadbalancing:CreateTargetGroup
- elasticloadbalancing:DeleteListener
- elasticloadbalancing:DeleteTargetGroup
- elasticloadbalancing:DeregisterTargets
- elasticloadbalancing:DescribeListeners
- elasticloadbalancing:DescribeLoadBalancerPolicies
- elasticloadbalancing:DescribeTargetGroups
- elasticloadbalancing:DescribeTargetHealth
- elasticloadbalancing:ModifyListener
- elasticloadbalancing:ModifyTargetGroup
- elasticloadbalancing:RegisterTargets
- elasticloadbalancing:SetLoadBalancerPoliciesOfListener
- iam:CreateServiceLinkedRole
- kms:DescribeKey
Effect: Allow
Resource:
- '*'
Version: 2012-10-17
Roles:
- Ref: AWSIAMRoleControlPlane
Type: AWS::IAM::ManagedPolicy
AWSIAMManagedPolicyCloudProviderNodes:
Properties:
Description: For the Kubernetes Cloud Provider AWS nodes
ManagedPolicyName: nodes.cluster-api-provider-aws.sigs.k8s.io
PolicyDocument:
Statement:
- Action:
- ec2:AssignIpv6Addresses
- ec2:DescribeInstances
- ec2:DescribeRegions
- ec2:CreateTags
- ec2:DescribeTags
- ec2:DescribeNetworkInterfaces
- ec2:DescribeInstanceTypes
- ecr:GetAuthorizationToken
- ecr:BatchCheckLayerAvailability
- ecr:GetDownloadUrlForLayer
- ecr:GetRepositoryPolicy
- ecr:DescribeRepositories
- ecr:ListImages
- ecr:BatchGetImage
Effect: Allow
Resource:
- '*'
- Action:
- secretsmanager:DeleteSecret
- secretsmanager:GetSecretValue
Effect: Allow
Resource:
- arn:*:secretsmanager:*:*:secret:aws.cluster.x-k8s.io/*
- Action:
- ssm:UpdateInstanceInformation
- ssmmessages:CreateControlChannel
- ssmmessages:CreateDataChannel
- ssmmessages:OpenControlChannel
- ssmmessages:OpenDataChannel
- s3:GetEncryptionConfiguration
Effect: Allow
Resource:
- '*'
Version: 2012-10-17
Roles:
- Ref: AWSIAMRoleControlPlane
- Ref: AWSIAMRoleNodes
Type: AWS::IAM::ManagedPolicy
AWSIAMManagedPolicyControllers:
Properties:
Description: For the Kubernetes Cluster API Provider AWS Controllers
ManagedPolicyName: controllers.cluster-api-provider-aws.sigs.k8s.io
PolicyDocument:
Statement:
- Action:
- ec2:AttachNetworkInterface
- ec2:DetachNetworkInterface
- ec2:AllocateAddress
- ec2:AssignIpv6Addresses
- ec2:AssignPrivateIpAddresses
- ec2:UnassignPrivateIpAddresses
- ec2:AssociateRouteTable
- ec2:AttachInternetGateway
- ec2:AuthorizeSecurityGroupIngress
- ec2:CreateInternetGateway
- ec2:CreateEgressOnlyInternetGateway
- ec2:CreateNatGateway
- ec2:CreateNetworkInterface
- ec2:CreateRoute
- ec2:CreateRouteTable
- ec2:CreateSecurityGroup
- ec2:CreateSubnet
- ec2:CreateTags
- ec2:CreateVpc
- ec2:ModifyVpcAttribute
- ec2:DeleteInternetGateway
- ec2:DeleteEgressOnlyInternetGateway
- ec2:DeleteNatGateway
- ec2:DeleteRouteTable
- ec2:ReplaceRoute
- ec2:DeleteSecurityGroup
- ec2:DeleteSubnet
- ec2:DeleteTags
- ec2:DeleteVpc
- ec2:DescribeAccountAttributes
- ec2:DescribeAddresses
- ec2:DescribeAvailabilityZones
- ec2:DescribeInstances
- ec2:DescribeInstanceTypes
- ec2:DescribeInternetGateways
- ec2:DescribeEgressOnlyInternetGateways
- ec2:DescribeInstanceTypes
- ec2:DescribeImages
- ec2:DescribeNatGateways
- ec2:DescribeNetworkInterfaces
- ec2:DescribeNetworkInterfaceAttribute
- ec2:DescribeRouteTables
- ec2:DescribeSecurityGroups
- ec2:DescribeSubnets
- ec2:DescribeVpcs
- ec2:DescribeVpcAttribute
- ec2:DescribeVolumes
- ec2:DescribeTags
- ec2:DetachInternetGateway
- ec2:DisassociateRouteTable
- ec2:DisassociateAddress
- ec2:ModifyInstanceAttribute
- ec2:ModifyNetworkInterfaceAttribute
- ec2:ModifySubnetAttribute
- ec2:ReleaseAddress
- ec2:RevokeSecurityGroupIngress
- ec2:RunInstances
- ec2:TerminateInstances
- tag:GetResources
- elasticloadbalancing:AddTags
- elasticloadbalancing:CreateLoadBalancer
- elasticloadbalancing:ConfigureHealthCheck
- elasticloadbalancing:DeleteLoadBalancer
- elasticloadbalancing:DeleteTargetGroup
- elasticloadbalancing:DescribeLoadBalancers
- elasticloadbalancing:DescribeLoadBalancerAttributes
- elasticloadbalancing:DescribeTargetGroups
- elasticloadbalancing:ApplySecurityGroupsToLoadBalancer
- elasticloadbalancing:DescribeTags
- elasticloadbalancing:ModifyLoadBalancerAttributes
- elasticloadbalancing:RegisterInstancesWithLoadBalancer
- elasticloadbalancing:DeregisterInstancesFromLoadBalancer
- elasticloadbalancing:RemoveTags
- autoscaling:DescribeAutoScalingGroups
- autoscaling:DescribeInstanceRefreshes
- ec2:CreateLaunchTemplate
- ec2:CreateLaunchTemplateVersion
- ec2:DescribeLaunchTemplates
- ec2:DescribeLaunchTemplateVersions
- ec2:DeleteLaunchTemplate
- ec2:DeleteLaunchTemplateVersions
- ec2:DescribeKeyPairs
- ec2:ModifyInstanceMetadataOptions
Effect: Allow
Resource:
- '*'
- Action:
- autoscaling:CreateAutoScalingGroup
- autoscaling:UpdateAutoScalingGroup
- autoscaling:CreateOrUpdateTags
- autoscaling:StartInstanceRefresh
- autoscaling:DeleteAutoScalingGroup
- autoscaling:DeleteTags
Effect: Allow
Resource:
- arn:*:autoscaling:*:*:autoScalingGroup:*:autoScalingGroupName/*
- Action:
- iam:CreateServiceLinkedRole
Condition:
StringLike:
iam:AWSServiceName: autoscaling.amazonaws.com
Effect: Allow
Resource:
- arn:*:iam::*:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling
- Action:
- iam:CreateServiceLinkedRole
Condition:
StringLike:
iam:AWSServiceName: elasticloadbalancing.amazonaws.com
Effect: Allow
Resource:
- arn:*:iam::*:role/aws-service-role/elasticloadbalancing.amazonaws.com/AWSServiceRoleForElasticLoadBalancing
- Action:
- iam:CreateServiceLinkedRole
Condition:
StringLike:
iam:AWSServiceName: spot.amazonaws.com
Effect: Allow
Resource:
- arn:*:iam::*:role/aws-service-role/spot.amazonaws.com/AWSServiceRoleForEC2Spot
- Action:
- iam:PassRole
Effect: Allow
Resource:
- arn:*:iam::*:role/*.cluster-api-provider-aws.sigs.k8s.io
- Action:
- secretsmanager:CreateSecret
- secretsmanager:DeleteSecret
- secretsmanager:TagResource
Effect: Allow
Resource:
- arn:*:secretsmanager:*:*:secret:aws.cluster.x-k8s.io/*
Version: 2012-10-17
Roles:
- Ref: AWSIAMRoleControllers
- Ref: AWSIAMRoleControlPlane
Type: AWS::IAM::ManagedPolicy
AWSIAMManagedPolicyControllersEKS:
Properties:
Description: For the Kubernetes Cluster API Provider AWS Controllers
ManagedPolicyName: controllers-eks.cluster-api-provider-aws.sigs.k8s.io
PolicyDocument:
Statement:
- Action:
- ssm:GetParameter
Effect: Allow
Resource:
- arn:*:ssm:*:*:parameter/aws/service/eks/optimized-ami/*
- Action:
- iam:CreateServiceLinkedRole
Condition:
StringLike:
iam:AWSServiceName: eks.amazonaws.com
Effect: Allow
Resource:
- arn:*:iam::*:role/aws-service-role/eks.amazonaws.com/AWSServiceRoleForAmazonEKS
- Action:
- iam:CreateServiceLinkedRole
Condition:
StringLike:
iam:AWSServiceName: eks-nodegroup.amazonaws.com
Effect: Allow
Resource:
- arn:*:iam::*:role/aws-service-role/eks-nodegroup.amazonaws.com/AWSServiceRoleForAmazonEKSNodegroup
- Action:
- iam:CreateServiceLinkedRole
Condition:
StringLike:
iam:AWSServiceName: eks-fargate.amazonaws.com
Effect: Allow
Resource:
- arn:aws:iam::*:role/aws-service-role/eks-fargate-pods.amazonaws.com/AWSServiceRoleForAmazonEKSForFargate
- Action:
- iam:ListOpenIDConnectProviders
- iam:GetOpenIDConnectProvider
- iam:CreateOpenIDConnectProvider
- iam:AddClientIDToOpenIDConnectProvider
- iam:UpdateOpenIDConnectProviderThumbprint
- iam:DeleteOpenIDConnectProvider
- iam:TagOpenIDConnectProvider
Effect: Allow
Resource:
- '*'
- Action:
- iam:GetRole
- iam:ListAttachedRolePolicies
Effect: Allow
Resource:
- arn:*:iam::*:role/*
- Action:
- iam:GetPolicy
Effect: Allow
Resource:
- arn:aws:iam::aws:policy/AmazonEKSClusterPolicy
- Action:
- eks:DescribeCluster
- eks:ListClusters
- eks:CreateCluster
- eks:TagResource
- eks:UpdateClusterVersion
- eks:DeleteCluster
- eks:UpdateClusterConfig
- eks:UntagResource
- eks:UpdateNodegroupVersion
- eks:DescribeNodegroup
- eks:DeleteNodegroup
- eks:UpdateNodegroupConfig
- eks:CreateNodegroup
- eks:AssociateEncryptionConfig
- eks:ListIdentityProviderConfigs
- eks:AssociateIdentityProviderConfig
- eks:DescribeIdentityProviderConfig
- eks:DisassociateIdentityProviderConfig
Effect: Allow
Resource:
- arn:*:eks:*:*:cluster/*
- arn:*:eks:*:*:nodegroup/*/*/*
- Action:
- ec2:AssociateVpcCidrBlock
- ec2:DisassociateVpcCidrBlock
- eks:ListAddons
- eks:CreateAddon
- eks:DescribeAddonVersions
- eks:DescribeAddon
- eks:DeleteAddon
- eks:UpdateAddon
- eks:TagResource
- eks:DescribeFargateProfile
- eks:CreateFargateProfile
- eks:DeleteFargateProfile
Effect: Allow
Resource:
- '*'
- Action:
- iam:PassRole
Condition:
StringEquals:
iam:PassedToService: eks.amazonaws.com
Effect: Allow
Resource:
- '*'
- Action:
- kms:CreateGrant
- kms:DescribeKey
Condition:
ForAnyValue:StringLike:
kms:ResourceAliases: alias/cluster-api-provider-aws-*
Effect: Allow
Resource:
- '*'
Version: 2012-10-17
Roles:
- Ref: AWSIAMRoleControllers
- Ref: AWSIAMRoleControlPlane
Type: AWS::IAM::ManagedPolicy
AWSIAMRoleControlPlane:
Properties:
AssumeRolePolicyDocument:
Statement:
- Action:
- sts:AssumeRole
Effect: Allow
Principal:
Service:
- ec2.amazonaws.com
Version: 2012-10-17
RoleName: control-plane.cluster-api-provider-aws.sigs.k8s.io
Type: AWS::IAM::Role
AWSIAMRoleControllers:
Properties:
AssumeRolePolicyDocument:
Statement:
- Action:
- sts:AssumeRole
Effect: Allow
Principal:
Service:
- ec2.amazonaws.com
Version: 2012-10-17
RoleName: controllers.cluster-api-provider-aws.sigs.k8s.io
Type: AWS::IAM::Role
AWSIAMRoleEKSControlPlane:
Properties:
AssumeRolePolicyDocument:
Statement:
- Action:
- sts:AssumeRole
Effect: Allow
Principal:
Service:
- eks.amazonaws.com
Version: 2012-10-17
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonEKSClusterPolicy
RoleName: eks-controlplane.cluster-api-provider-aws.sigs.k8s.io
Type: AWS::IAM::Role
AWSIAMRoleNodes:
Properties:
AssumeRolePolicyDocument:
Statement:
- Action:
- sts:AssumeRole
Effect: Allow
Principal:
Service:
- ec2.amazonaws.com
Version: 2012-10-17
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
- arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
RoleName: nodes.cluster-api-provider-aws.sigs.k8s.io
Type: AWS::IAM::Role -
Once the file is created, use the following steps in the AWS Console or AWS CLI to create the CloudFormation stack.
- AWS Console
- AWS CLI
-
Log in to the AWS Management Console and navigate to the CloudFormation service.
-
Create a new stack by clicking on the Create stack button and selecting With new resources (standard).
-
Leave the Choose an existing template option selected, and under the Specify template section, select Upload a template file. Click Choose file and select the
palette-cloudformation-input-template.yamlfile you created earlier. Click Next. -
Provide the Stack name as
cluster-api-provider-aws-sigs-k8s-ioand click Next. -
On the Configure stack options page, check the box for I acknowledge that AWS CloudFormation might create IAM resources with customized names.
Configure any additional options as needed and click Next.
-
Review the stack configuration and click Submit to create the CloudFormation stack.
-
Wait for the stack creation to complete. You can monitor the progress in the CloudFormation console.
-
From the same directory where the
palette-cloudformation-input-template.yamlfile is located, execute the following command to create the CloudFormation stack using AWS CLI. Replace<aws-region>with the AWS region you are using for your cluster deployments.aws cloudformation create-stack \
--stack-name cluster-api-provider-aws-sigs-k8s-io \
--template-body file://palette-cloudformation-input-template.yaml \
--capabilities CAPABILITY_NAMED_IAM \
--region <aws-region>Example output{
"StackId": "arn:aws:cloudformation:us-west-1:123456789012:stack/cluster-api-provider-aws-sigs-k8s-io/8cc59d10-0364-11f1-83cd-0affdad4978f"
} -
Wait for the stack creation to complete. You can monitor the progress in the CloudFormation console.
Configure Cluster Profiles for Manual CloudFormation Stack Management
After creating the CloudFormation stack, you must configure the Kubernetes layer of your cluster profiles to use the manually created stack. This ensures that Palette uses the existing stack rather than attempting to create and manage one automatically.
- AWS IaaS Cluster Profiles
- AWS EKS Cluster Profiles
Only the Palette eXtended Kubernetes (PXK) pack
supports the manageCloudFormationStackManually configuration.
-
Log in to Palette.
-
From the left main menu, select Profiles.
-
Choose an existing cluster profile or create a new cluster profile.
-
Once in the cluster profile overview with all the layers listed, select the Kubernetes layer to view the Edit Pack page.
-
In the YAML editor, add the
manageCloudFormationStackManually.enabledfield and set the value totrueas shown below.pack:
---
kubeadmconfig:
---
manageCloudFormationStackManually:
enabled: true -
Confirm Updates to save the changes to the Kubernetes layer.
-
Save Changes to the cluster profile.
-
Log in to Palette.
-
From the left main menu, select Profiles.
-
Choose an existing cluster profile or create a new cluster profile.
-
Once in the cluster profile overview with all the layers listed, select the Kubernetes layer to view the Edit Pack page.
-
In the YAML editor, add the
manageCloudFormationStackManually.enabledfield and set the value totrueas shown below.pack:
---
managedControlPlane:
---
managedMachinePool:
---
manageCloudFormationStackManually:
enabled: true -
If you want to provide different IAM role names for node groups, you can specify them in the
managedControlPlaneandmanagedMachinePoolsections. If you do not specify role names, the default values created by the CloudFormation stack are used.These default role names are shown in the following example. You can change the role names to your desired names, but make sure to follow the IAM Role Naming Requirements.
Example role namespack:
---
managedControlPlane:
...
roleName: "eks-controlplane.cluster-api-provider-aws.sigs.k8s.io"
---
managedMachinePool:
...
roleName: "eks-nodegroup.cluster-api-provider-aws.sigs.k8s.io"
---IAM Role Naming Requirements
When manually creating and providing IAM roles for EKS clusters through pack
roleNamevalues, all role names must follow the naming pattern*.cluster-api-provider-aws.sigs.k8s.io. This includes:- Control plane roles
- Node group roles
- Fargate profile roles
The IAM permissions granted are scoped to this specific role naming pattern through the resource constraint defined in the Minimum EKS Dynamic/Static Permissions (
arn:*:iam::*:role/*.cluster-api-provider-aws.sigs.k8s.io). Deviating from this naming convention results inAccessDeniederrors when the system attempts to perform operations such asiam:GetRole,iam:PassRole, oriam:ListAttachedRolePolicies.If your organizational policies or specific use cases require a different role naming pattern, you must explicitly add the corresponding resource Amazon Resource Name (ARN) pattern to the IAM policy's Resource field to grant the necessary permissions.
Example Resource ARN pattern for custom role names...
{
"Sid": "IAMRolePermissions",
"Effect": "Allow",
"Action": [
"iam:GetRole",
"iam:PassRole",
"iam:ListAttachedRolePolicies"
],
"Resource": [
"arn:*:iam::*:role/*.cluster-api-provider-aws.sigs.k8s.io",
"arn:*:iam::*:role/my-custom-eks-role-*"
]
}
... -
Confirm Updates to save the changes to the Kubernetes layer.
-
Save Changes to the cluster profile.