internal/deployers/eksapi/templates/infra.yaml (517 lines of code) (raw):
---
AWSTemplateFormatVersion: "2010-09-09"
Description: "kubetest2-eksapi infrastructure"
Parameters:
VpcBlock:
Type: String
Default: 192.168.0.0/16
Description: The CIDR range for the VPC. This should be a valid private (RFC 1918) CIDR range.
PublicSubnet01Block:
Type: String
Default: 192.168.0.0/18
Description: CidrBlock for public subnet 01 within the VPC
PublicSubnet02Block:
Type: String
Default: 192.168.64.0/18
Description: CidrBlock for public subnet 02 within the VPC
PrivateSubnet01Block:
Type: String
Default: 192.168.128.0/18
Description: CidrBlock for private subnet 01 within the VPC
PrivateSubnet02Block:
Type: String
Default: 192.168.192.0/18
Description: CidrBlock for private subnet 02 within the VPC
AdditionalClusterRoleServicePrincipal:
Type: String
Default: ""
Description: Additional service principal with sts:AssumeRole permissions on the ClusterRole
ResourceId:
Type: String
Subnet01AZ:
Type: String
Subnet02AZ:
Type: String
AutoMode:
Type: String
AllowedValues:
- "true"
- "false"
Default: "false"
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
- Label:
default: "Worker Network Configuration"
Parameters:
- VpcBlock
- PublicSubnet01Block
- PublicSubnet02Block
- PrivateSubnet01Block
- PrivateSubnet02Block
Conditions:
HasAdditionalClusterRoleServicePrincipal:
Fn::Not:
- Fn::Equals:
- ""
- !Ref AdditionalClusterRoleServicePrincipal
IsAutoMode: !Equals [!Ref AutoMode, "true"]
Resources:
#
# Public VPC
#
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VpcBlock
EnableDnsHostnames: true
EnableDnsSupport: true
Tags:
- Key: Name
Value:
Fn::Sub: "${AWS::StackName}/VPC"
IPv6CidrBlock:
Type: AWS::EC2::VPCCidrBlock
Properties:
AmazonProvidedIpv6CidrBlock: true
VpcId:
Ref: VPC
#
# Internet gateways (ipv4, and egress for ipv6)
#
InternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value:
Fn::Sub: "${AWS::StackName}/InternetGateway"
VPCGatewayAttachment:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
InternetGatewayId:
Ref: InternetGateway
VpcId:
Ref: VPC
EgressOnlyInternetGateway:
Type: AWS::EC2::EgressOnlyInternetGateway
Properties:
VpcId:
Ref: VPC
#
# Nat gateways
#
NATGateway01:
Type: AWS::EC2::NatGateway
DependsOn:
- NatGatewayEIP1
- SubnetPublic01
- VPCGatewayAttachment
Properties:
AllocationId:
Fn::GetAtt:
- NatGatewayEIP1
- AllocationId
SubnetId:
Ref: SubnetPublic01
Tags:
- Key: Name
Value:
Fn::Sub: "${AWS::StackName}/NATGateway01"
NATGateway02:
Type: AWS::EC2::NatGateway
DependsOn:
- NatGatewayEIP2
- SubnetPublic02
- VPCGatewayAttachment
Properties:
AllocationId:
Fn::GetAtt:
- NatGatewayEIP2
- AllocationId
SubnetId:
Ref: SubnetPublic02
Tags:
- Key: Name
Value:
Fn::Sub: "${AWS::StackName}/NATGateway02"
#
# Nat Gateway IPs
#
NatGatewayEIP1:
Type: AWS::EC2::EIP
DependsOn:
- VPCGatewayAttachment
Properties:
Domain: vpc
Tags:
- Key: Name
Value:
Fn::Sub: "${AWS::StackName}/NatGatewayEIP1"
NatGatewayEIP2:
Type: AWS::EC2::EIP
DependsOn:
- VPCGatewayAttachment
Properties:
Domain: vpc
Tags:
- Key: Name
Value:
Fn::Sub: "${AWS::StackName}/NatGatewayEIP2"
#
# Routing - public subnets
#
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId:
Ref: VPC
Tags:
- Key: Name
Value:
Fn::Sub: "${AWS::StackName}/PublicRouteTable"
PublicSubnetDefaultRoute:
Type: AWS::EC2::Route
DependsOn:
- InternetGateway
- VPCGatewayAttachment
Properties:
DestinationCidrBlock: 0.0.0.0/0
GatewayId:
Ref: InternetGateway
RouteTableId:
Ref: PublicRouteTable
PublicSubnetDefaultIpv6Route:
Type: AWS::EC2::Route
DependsOn:
- InternetGateway
- VPCGatewayAttachment
Properties:
DestinationIpv6CidrBlock: ::/0
GatewayId:
Ref: InternetGateway
RouteTableId:
Ref: PublicRouteTable
#
# Routing - private subnets
# Route tables
#
PrivateRouteTable01:
Type: AWS::EC2::RouteTable
Properties:
VpcId:
Ref: VPC
Tags:
- Key: Name
Value:
Fn::Sub: "${AWS::StackName}/PrivateRouteTable01"
PrivateRouteTable02:
Type: AWS::EC2::RouteTable
Properties:
VpcId:
Ref: VPC
Tags:
- Key: Name
Value:
Fn::Sub: "${AWS::StackName}/PrivateRouteTable02"
#
# Nat IPv4 Private Routes
#
PrivateSubnetDefaultRoute01:
Type: AWS::EC2::Route
DependsOn:
- VPCGatewayAttachment
- NATGateway01
Properties:
DestinationCidrBlock: 0.0.0.0/0
NatGatewayId:
Ref: NATGateway01
RouteTableId:
Ref: PrivateRouteTable01
PrivateSubnetDefaultRoute02:
Type: AWS::EC2::Route
DependsOn:
- VPCGatewayAttachment
- NATGateway02
Properties:
DestinationCidrBlock: 0.0.0.0/0
NatGatewayId:
Ref: NATGateway02
RouteTableId:
Ref: PrivateRouteTable02
#
# EOIG IPv6 Private Routes
#
PrivateSubnetDefaultIpv6Route01:
Type: AWS::EC2::Route
Properties:
DestinationIpv6CidrBlock: ::/0
EgressOnlyInternetGatewayId:
Ref: EgressOnlyInternetGateway
RouteTableId:
Ref: PrivateRouteTable01
PrivateSubnetDefaultIpv6Route02:
Type: AWS::EC2::Route
Properties:
DestinationIpv6CidrBlock: ::/0
EgressOnlyInternetGatewayId:
Ref: EgressOnlyInternetGateway
RouteTableId:
Ref: PrivateRouteTable02
#
# Public subnets
SubnetPublic01:
Type: AWS::EC2::Subnet
Metadata:
Comment: Subnet 01
DependsOn: IPv6CidrBlock
Properties:
AvailabilityZone:
Ref: Subnet01AZ
CidrBlock:
Ref: PublicSubnet01Block
Ipv6CidrBlock:
!Select [0, !Cidr [!Select [0, !GetAtt VPC.Ipv6CidrBlocks], 8, 64]]
AssignIpv6AddressOnCreation: true
MapPublicIpOnLaunch: true
Tags:
- Key: kubernetes.io/role/elb
Value: "1"
- Key: Name
Value:
Fn::Sub: "${AWS::StackName}/SubnetPublic01"
VpcId:
Ref: VPC
SubnetPublic02:
Type: AWS::EC2::Subnet
DependsOn: IPv6CidrBlock
Properties:
AvailabilityZone:
Ref: Subnet02AZ
CidrBlock:
Ref: PublicSubnet02Block
Ipv6CidrBlock:
!Select [1, !Cidr [!Select [0, !GetAtt VPC.Ipv6CidrBlocks], 8, 64]]
AssignIpv6AddressOnCreation: true
MapPublicIpOnLaunch: true
Tags:
- Key: kubernetes.io/role/elb
Value: "1"
- Key: Name
Value:
Fn::Sub: "${AWS::StackName}/SubnetPublic02"
VpcId:
Ref: VPC
#
# Public route table associations
#
RouteTableAssociationPublic01:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId:
Ref: PublicRouteTable
SubnetId:
Ref: SubnetPublic01
RouteTableAssociationPublic02:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId:
Ref: PublicRouteTable
SubnetId:
Ref: SubnetPublic02
#
# Private subnets
#
SubnetPrivate01:
Type: AWS::EC2::Subnet
DependsOn: IPv6CidrBlock
Properties:
AvailabilityZone:
Ref: Subnet01AZ
CidrBlock:
Ref: PrivateSubnet01Block
Ipv6CidrBlock:
!Select [2, !Cidr [!Select [0, !GetAtt VPC.Ipv6CidrBlocks], 8, 64]]
AssignIpv6AddressOnCreation: true
Tags:
- Key: kubernetes.io/role/internal-elb
Value: "1"
- Key: Name
Value:
Fn::Sub: "${AWS::StackName}/SubnetPrivate01"
VpcId:
Ref: VPC
SubnetPrivate02:
Type: AWS::EC2::Subnet
DependsOn: IPv6CidrBlock
Properties:
AvailabilityZone:
Ref: Subnet02AZ
CidrBlock:
Ref: PrivateSubnet02Block
Ipv6CidrBlock:
!Select [3, !Cidr [!Select [0, !GetAtt VPC.Ipv6CidrBlocks], 8, 64]]
AssignIpv6AddressOnCreation: true
Tags:
- Key: kubernetes.io/role/internal-elb
Value: "1"
- Key: Name
Value:
Fn::Sub: "${AWS::StackName}/SubnetPrivate02"
VpcId:
Ref: VPC
#
# Private route table associations
#
RouteTableAssociationPrivate01:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId:
Ref: PrivateRouteTable01
SubnetId:
Ref: SubnetPrivate01
RouteTableAssociationPrivate02:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId:
Ref: PrivateRouteTable02
SubnetId:
Ref: SubnetPrivate02
ClusterRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Action:
- "sts:AssumeRole"
- "sts:TagSession"
Effect: Allow
Principal:
Service:
Fn::If:
- HasAdditionalClusterRoleServicePrincipal
- - "eks.amazonaws.com"
- !Ref AdditionalClusterRoleServicePrincipal
- - "eks.amazonaws.com"
ManagedPolicyArns:
- !Join
- ""
- - "arn:"
- !Ref "AWS::Partition"
- ":iam::aws:policy/AmazonEKSClusterPolicy"
- !If
- IsAutoMode
- !Join
- ""
- - "arn:"
- !Ref "AWS::Partition"
- ":iam::aws:policy/AmazonEKSBlockStoragePolicy"
- !Ref "AWS::NoValue"
- !If
- IsAutoMode
- !Join
- ""
- - "arn:"
- !Ref "AWS::Partition"
- ":iam::aws:policy/AmazonEKSComputePolicy"
- !Ref "AWS::NoValue"
- !If
- IsAutoMode
- !Join
- ""
- - "arn:"
- !Ref "AWS::Partition"
- ":iam::aws:policy/AmazonEKSLoadBalancingPolicy"
- !Ref "AWS::NoValue"
- !If
- IsAutoMode
- !Join
- ""
- - "arn:"
- !Ref "AWS::Partition"
- ":iam::aws:policy/AmazonEKSNetworkingPolicy"
- !Ref "AWS::NoValue"
NodeRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Action: "sts:AssumeRole"
Effect: Allow
Principal:
Service: ec2.amazonaws.com
ManagedPolicyArns:
- !Join
- ""
- - "arn:"
- !Ref "AWS::Partition"
- ":iam::aws:policy/AmazonEKSWorkerNodePolicy"
- !Join
- ""
- - "arn:"
- !Ref "AWS::Partition"
- ":iam::aws:policy/AmazonEC2ContainerRegistryReadOnly"
- !Join
- ""
- - "arn:"
- !Ref "AWS::Partition"
- ":iam::aws:policy/AmazonEKS_CNI_Policy"
- !Join
- ""
- - "arn:"
- !Ref "AWS::Partition"
- ":iam::aws:policy/AmazonSSMManagedInstanceCore"
- !Join
- ""
- - "arn:"
- !Ref "AWS::Partition"
- ":iam::aws:policy/AmazonS3FullAccess"
VPCCNIIPv6Policy:
Type: AWS::IAM::Policy
Properties:
PolicyDocument: |
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:AssignIpv6Addresses",
"ec2:DescribeInstances",
"ec2:DescribeTags",
"ec2:DescribeNetworkInterfaces",
"ec2:DescribeInstanceTypes"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ec2:CreateTags"
],
"Resource": [
"arn:*:ec2:*:*:network-interface/*"
]
}
]
}
PolicyName: AmazonEKS_CNI_IPv6_Policy
Roles:
- !Ref NodeRole
Outputs:
SubnetsPrivate:
Value:
Fn::Join:
- ","
- - Ref: SubnetPrivate01
- Ref: SubnetPrivate02
Export:
Name:
Fn::Sub: "${AWS::StackName}::SubnetsPrivate"
SubnetsPublic:
Value:
Fn::Join:
- ","
- - Ref: SubnetPublic01
- Ref: SubnetPublic02
Export:
Name:
Fn::Sub: "${AWS::StackName}::SubnetsPublic"
VPC:
Value:
Ref: VPC
Export:
Name:
Fn::Sub: "${AWS::StackName}::VPC"
ClusterRole:
Value:
Fn::Join:
- ""
- - "arn:"
- !Ref "AWS::Partition"
- ":iam::"
- !Ref "AWS::AccountId"
- ":role/"
- !Ref ClusterRole
Export:
Name:
Fn::Sub: "${AWS::StackName}::ClusterRole"
NodeRole:
Value:
Fn::Join:
- ""
- - "arn:"
- !Ref "AWS::Partition"
- ":iam::"
- !Ref "AWS::AccountId"
- ":role/"
- !Ref NodeRole
Export:
Name:
Fn::Sub: "${AWS::StackName}::NodeRole"