example/hybrid-eks-cfn.yaml (133 lines of code) (raw):
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Creates the EKS cluster IAM role and EKS cluster with Remote Node Network and Remote Pod Network for hybrid nodes'
Metadata:
Version:
Number: "v0.0.7"
Parameters:
ClusterName:
Type: String
ClusterRoleName:
Type: String
Default: 'EKSClusterRole'
VpcId:
Type: String
Description: The VPC that a Security Group will be created in for the EKS Cluster, required if a SecurityGroupId is not configured
Default: ''
SubnetId1:
Type: String
Description: The ID of the first subnet in your VPC where EKS will attach ENIs
SubnetId2:
Type: String
Description: The ID of the second subnet in your VPC where EKS will attach ENIs
SecurityGroupId:
Type: String
Description: The ID of the security group that enables ingress for your RemoteNodeCIDR and optionally RemotePodCIDR. This will override the creeation of a SecurityGroup using VpcId.
Default: ''
RemoteNodeCIDR:
Type: String
Description: The CIDR blocks for hybrid nodes
RemotePodCIDR:
Type: String
Description: The CIDR blocks for workloads running on hybrid nodes
Default: ''
ClusterAuthMode:
Type: String
Description: The cluster authentication mode. Valid values are one of [API, API_AND_CONFIG_MAP]
Default: 'API_AND_CONFIG_MAP'
AllowedValues:
- 'API_AND_CONFIG_MAP'
- 'API'
ClusterEndpointConnectivity:
Type: String
Description: The cluster endpoint connectivity mode. Valid values are one of [Public, Private].
Default: 'Private'
AllowedValues:
- 'Private'
- 'Public'
K8sVersion:
Type: String
Description: The Kubernetes minor version for the EKS cluster
Default: '1.31'
Conditions:
HasRemotePodCIDR: !Not [!Equals [!Ref RemotePodCIDR, '']]
HasPublicAccess: !Equals [!Ref ClusterEndpointConnectivity, 'Public']
HasPrivateAccess: !Equals [!Ref ClusterEndpointConnectivity, 'Private']
NoSecurityGroupId: !Equals [!Ref SecurityGroupId, '']
Resources:
EKSClusterRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: eks.amazonaws.com
Action: 'sts:AssumeRole'
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonEKSClusterPolicy
RoleName: !Ref ClusterRoleName
EKSClusterSG:
Condition: NoSecurityGroupId
Type: AWS::EC2::SecurityGroup
DeletionPolicy: Delete
Properties:
GroupDescription: Security group for ingress from hybrid nodes to EKS control plane
VpcId: !Ref VpcId
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: !Ref RemoteNodeCIDR
- !If
- HasRemotePodCIDR
- IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: !Ref RemotePodCIDR
- !Ref "AWS::NoValue"
EKSCluster:
Type: AWS::EKS::Cluster
DependsOn: EKSClusterRole
Properties:
Name: !Ref ClusterName
Version: !Ref K8sVersion
RoleArn: !GetAtt EKSClusterRole.Arn
AccessConfig:
AuthenticationMode: !Ref ClusterAuthMode
ResourcesVpcConfig:
SecurityGroupIds:
- !If [NoSecurityGroupId, !Ref EKSClusterSG, !Ref SecurityGroupId]
SubnetIds:
- !Ref SubnetId1
- !Ref SubnetId2
EndpointPublicAccess: !If [HasPublicAccess, true, false]
EndpointPrivateAccess: !If [HasPrivateAccess, true, false]
RemoteNetworkConfig:
RemoteNodeNetworks:
- Cidrs: [!Ref RemoteNodeCIDR]
RemotePodNetworks: !If
- HasRemotePodCIDR
- [Cidrs: [!Ref RemotePodCIDR]]
- !Ref 'AWS::NoValue'
Outputs:
EKSClusterName:
Description: Name for the EKS Cluster
Value: !Ref EKSCluster
Export:
Name: EKSCluster
EKSClusterARN:
Description: ARN for the EKS Cluster
Value: !GetAtt EKSCluster.Arn
Export:
Name: EKSClusterARN
EKSClusterRoleName:
Description: Name for the EKS Cluster Role
Value: !Ref EKSClusterRole
Export:
Name: EKSClusterRole
EKSClusterRoleARN:
Description: ARN for the EKS Cluster Role
Value: !GetAtt EKSClusterRole.Arn
Export:
Name: EKSClusterRoleARN