Skip to content

Commit 622a4e1

Browse files
Jimmy Gaussenmergify[bot]
authored andcommitted
feat(eks): retrieve ami with ssm (#4156)
* feat(eks): retrieve ami with ssm * package-lock changes * chore: remove deprecated, delete ami.ts, move into cluster * chore: refactor EksOptimizedAmiProps -> EksOptimizedImageProps * chore: add missing - to JSDoc * chore: rename NodeType.NORMAL -> STANDARD * remove note about environment-agnostic stacks in README * chore: revert package-lock
1 parent b3973d0 commit 622a4e1

10 files changed

+119
-197
lines changed

packages/@aws-cdk/aws-eks/README.md

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,6 @@ cluster.addResource('mypod', {
4545
});
4646
```
4747

48-
**NOTE**: in order to determine the default AMI for for Amazon EKS instances the
49-
`eks.Cluster` resource must be defined within a stack that is configured with an
50-
explicit `env.region`. See [Environments](https://docs.aws.amazon.com/cdk/latest/guide/environments.html)
51-
in the AWS CDK Developer Guide for more details.
52-
5348
Here is a [complete sample](https://github.com/aws/aws-cdk/blob/master/packages/%40aws-cdk/aws-eks/test/integ.eks-kubectl.lit.ts).
5449

5550
### Capacity

packages/@aws-cdk/aws-eks/lib/ami.ts

Lines changed: 0 additions & 183 deletions
This file was deleted.

packages/@aws-cdk/aws-eks/lib/cluster.ts

Lines changed: 77 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import ec2 = require('@aws-cdk/aws-ec2');
33
import { Subnet } from '@aws-cdk/aws-ec2';
44
import iam = require('@aws-cdk/aws-iam');
55
import lambda = require('@aws-cdk/aws-lambda');
6+
import ssm = require('@aws-cdk/aws-ssm');
67
import { CfnOutput, Construct, Duration, IResource, Resource, Stack, Tag } from '@aws-cdk/core';
78
import path = require('path');
8-
import { EksOptimizedAmi, nodeTypeForInstanceType } from './ami';
99
import { AwsAuth } from './aws-auth';
1010
import { ClusterResource } from './cluster-resource';
1111
import { CfnCluster, CfnClusterProps } from './eks.generated';
@@ -449,7 +449,7 @@ export class Cluster extends Resource implements ICluster {
449449
const asg = new autoscaling.AutoScalingGroup(this, id, {
450450
...options,
451451
vpc: this.vpc,
452-
machineImage: new EksOptimizedAmi({
452+
machineImage: new EksOptimizedImage({
453453
nodeType: nodeTypeForInstanceType(options.instanceType),
454454
kubernetesVersion: this.version,
455455
}),
@@ -769,3 +769,78 @@ class ImportedCluster extends Resource implements ICluster {
769769
}
770770
}
771771
}
772+
773+
/**
774+
* Properties for EksOptimizedImage
775+
*/
776+
export interface EksOptimizedImageProps {
777+
/**
778+
* What instance type to retrieve the image for (standard or GPU-optimized)
779+
*
780+
* @default NodeType.STANDARD
781+
*/
782+
readonly nodeType?: NodeType;
783+
784+
/**
785+
* The Kubernetes version to use
786+
*
787+
* @default - The latest version
788+
*/
789+
readonly kubernetesVersion?: string;
790+
}
791+
792+
/**
793+
* Construct an Amazon Linux 2 image from the latest EKS Optimized AMI published in SSM
794+
*/
795+
export class EksOptimizedImage implements ec2.IMachineImage {
796+
private readonly nodeType?: NodeType;
797+
private readonly kubernetesVersion?: string;
798+
799+
private readonly amiParameterName: string;
800+
801+
/**
802+
* Constructs a new instance of the EcsOptimizedAmi class.
803+
*/
804+
public constructor(props: EksOptimizedImageProps) {
805+
this.nodeType = props && props.nodeType;
806+
this.kubernetesVersion = props && props.kubernetesVersion || LATEST_KUBERNETES_VERSION;
807+
808+
// set the SSM parameter name
809+
this.amiParameterName = `/aws/service/eks/optimized-ami/${this.kubernetesVersion}/`
810+
+ ( this.nodeType === NodeType.STANDARD ? "amazon-linux-2/" : "" )
811+
+ ( this.nodeType === NodeType.GPU ? " amazon-linux2-gpu/" : "" )
812+
+ "recommended/image_id";
813+
}
814+
815+
/**
816+
* Return the correct image
817+
*/
818+
public getImage(scope: Construct): ec2.MachineImageConfig {
819+
const ami = ssm.StringParameter.valueForStringParameter(scope, this.amiParameterName);
820+
return {
821+
imageId: ami,
822+
osType: ec2.OperatingSystemType.LINUX
823+
};
824+
}
825+
}
826+
827+
const LATEST_KUBERNETES_VERSION = '1.13';
828+
829+
/**
830+
* Whether the worker nodes should support GPU or just standard instances
831+
*/
832+
export enum NodeType {
833+
/**
834+
* Standard instances
835+
*/
836+
STANDARD = 'Standard',
837+
838+
/**
839+
* GPU instances
840+
*/
841+
GPU = 'GPU',
842+
}
843+
844+
export function nodeTypeForInstanceType(instanceType: ec2.InstanceType) {
845+
return instanceType.toString().startsWith('p2') || instanceType.toString().startsWith('p3') ? NodeType.GPU : NodeType.STANDARD;
846+
}

packages/@aws-cdk/aws-eks/lib/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
export * from './cluster';
2-
export * from './ami';
32
export * from './aws-auth-mapping';
43
export * from './k8s-resource';
54
export * from './aws-auth';

packages/@aws-cdk/aws-eks/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
"@aws-cdk/aws-ec2": "^1.9.0",
7676
"@aws-cdk/aws-iam": "^1.9.0",
7777
"@aws-cdk/aws-lambda": "^1.9.0",
78+
"@aws-cdk/aws-ssm": "^1.9.0",
7879
"@aws-cdk/core": "^1.9.0"
7980
},
8081
"homepage": "https://github.com/aws/aws-cdk",
@@ -84,6 +85,7 @@
8485
"@aws-cdk/aws-ec2": "^1.9.0",
8586
"@aws-cdk/aws-iam": "^1.9.0",
8687
"@aws-cdk/aws-lambda": "^1.9.0",
88+
"@aws-cdk/aws-ssm": "^1.8.0",
8789
"@aws-cdk/core": "^1.9.0"
8890
},
8991
"engines": {

packages/@aws-cdk/aws-eks/test/integ.eks-cluster.defaults.expected.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1050,7 +1050,9 @@
10501050
"ClusterDefaultCapacityLaunchConfig72790CF7": {
10511051
"Type": "AWS::AutoScaling::LaunchConfiguration",
10521052
"Properties": {
1053-
"ImageId": "ami-12345",
1053+
"ImageId": {
1054+
"Ref": "SsmParameterValueawsserviceeksoptimizedami113amazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
1055+
},
10541056
"InstanceType": "m5.large",
10551057
"IamInstanceProfile": {
10561058
"Ref": "ClusterDefaultCapacityInstanceProfile70387741"
@@ -1207,6 +1209,10 @@
12071209
"ClusterKubernetesResourceHandlerCodeArtifactHash27D4393F": {
12081210
"Type": "String",
12091211
"Description": "Artifact hash for asset \"eks-integ-defaults/Cluster/KubernetesResourceHandler/Code\""
1212+
},
1213+
"SsmParameterValueawsserviceeksoptimizedami113amazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter": {
1214+
"Type": "AWS::SSM::Parameter::Value<String>",
1215+
"Default": "/aws/service/eks/optimized-ami/1.13/amazon-linux-2/recommended/image_id"
12101216
}
12111217
},
12121218
"Outputs": {

packages/@aws-cdk/aws-eks/test/integ.eks-cluster.kubectl-disabled.expected.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -836,7 +836,9 @@
836836
"EKSClusterNodesLaunchConfig921F1106": {
837837
"Type": "AWS::AutoScaling::LaunchConfiguration",
838838
"Properties": {
839-
"ImageId": "ami-12345",
839+
"ImageId": {
840+
"Ref": "SsmParameterValueawsserviceeksoptimizedami113amazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
841+
},
840842
"InstanceType": "t2.medium",
841843
"IamInstanceProfile": {
842844
"Ref": "EKSClusterNodesInstanceProfile0F2DB3B9"
@@ -929,6 +931,12 @@
929931
}
930932
}
931933
},
934+
"Parameters": {
935+
"SsmParameterValueawsserviceeksoptimizedami113amazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter": {
936+
"Type": "AWS::SSM::Parameter::Value<String>",
937+
"Default": "/aws/service/eks/optimized-ami/1.13/amazon-linux-2/recommended/image_id"
938+
}
939+
},
932940
"Outputs": {
933941
"EKSClusterConfigCommand3809C9C9": {
934942
"Value": {

packages/@aws-cdk/aws-eks/test/integ.eks-cluster.lit.expected.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1050,7 +1050,9 @@
10501050
"EKSClusterNodesLaunchConfig921F1106": {
10511051
"Type": "AWS::AutoScaling::LaunchConfiguration",
10521052
"Properties": {
1053-
"ImageId": "ami-12345",
1053+
"ImageId": {
1054+
"Ref": "SsmParameterValueawsserviceeksoptimizedami113amazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter"
1055+
},
10541056
"InstanceType": "t2.medium",
10551057
"IamInstanceProfile": {
10561058
"Ref": "EKSClusterNodesInstanceProfile0F2DB3B9"
@@ -1207,6 +1209,10 @@
12071209
"EKSClusterKubernetesResourceHandlerCodeArtifactHashA13FF2C6": {
12081210
"Type": "String",
12091211
"Description": "Artifact hash for asset \"eks-integ-test-basic/EKSCluster/KubernetesResourceHandler/Code\""
1212+
},
1213+
"SsmParameterValueawsserviceeksoptimizedami113amazonlinux2recommendedimageidC96584B6F00A464EAD1953AFF4B05118Parameter": {
1214+
"Type": "AWS::SSM::Parameter::Value<String>",
1215+
"Default": "/aws/service/eks/optimized-ami/1.13/amazon-linux-2/recommended/image_id"
12101216
}
12111217
},
12121218
"Outputs": {

0 commit comments

Comments
 (0)