Skip to content

Commit

Permalink
feat(ec2): add support for al2022 and amzn2 with kernel 5.x (aws#18117)
Browse files Browse the repository at this point in the history
This PR is aimed to expand CDK ability to support `al2022` and `amzn2` with kernel 5.x

```
"/aws/service/ami-amazon-linux-latest/al2022-ami-kernel-5.10-arm64"
"/aws/service/ami-amazon-linux-latest/al2022-ami-minimal-kernel-5.10-arm64"
"/aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-ebs"
"/aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-gp2"
"/aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-s3"
"/aws/service/ami-amazon-linux-latest/amzn-ami-minimal-hvm-x86_64-s3"
"/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-arm64-gp2"
"/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-ebs"
"/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
"/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-x86_64-ebs"
"/aws/service/ami-amazon-linux-latest/al2022-ami-kernel-5.10-x86_64"
"/aws/service/ami-amazon-linux-latest/al2022-ami-minimal-kernel-5.10-x86_64"
"/aws/service/ami-amazon-linux-latest/amzn-ami-minimal-hvm-x86_64-ebs"
"/aws/service/ami-amazon-linux-latest/amzn-ami-minimal-pv-x86_64-ebs"
"/aws/service/ami-amazon-linux-latest/amzn-ami-minimal-pv-x86_64-s3"
"/aws/service/ami-amazon-linux-latest/amzn-ami-pv-x86_64-ebs"
"/aws/service/ami-amazon-linux-latest/amzn-ami-pv-x86_64-s3"
"/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-arm64-gp2"
"/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-x86_64-gp2"
"/aws/service/ami-amazon-linux-latest/amzn2-ami-minimal-hvm-arm64-ebs"
"/aws/service/ami-amazon-linux-latest/amzn2-ami-minimal-hvm-x86_64-ebs"
```

----

*By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
  • Loading branch information
robertd authored and TikiTDO committed Feb 21, 2022
1 parent 513ac4a commit 5a669d7
Show file tree
Hide file tree
Showing 4 changed files with 171 additions and 6 deletions.
40 changes: 40 additions & 0 deletions packages/@aws-cdk/aws-ec2/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -854,6 +854,46 @@ You can use the `Instance` class to start up a single EC2 instance. For producti
you use an `AutoScalingGroup` from the `aws-autoscaling` module instead, as AutoScalingGroups will take
care of restarting your instance if it ever fails.

```ts
declare const vpc: ec2.Vpc;
declare const instanceType: ec2.InstanceType;

// AWS Linux
new ec2.Instance(this, 'Instance1', {
vpc,
instanceType,
machineImage: new ec2.AmazonLinuxImage(),
});

// AWS Linux 2
new ec2.Instance(this, 'Instance2', {
vpc,
instanceType,
machineImage: new ec2.AmazonLinuxImage({
generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2,
}),
});

// AWS Linux 2 with kernel 5.x
new ec2.Instance(this, 'Instance3', {
vpc,
instanceType,
machineImage: new ec2.AmazonLinuxImage({
generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2,
kernel: ec2.AmazonLinuxKernel.KERNEL5_X,
}),
});

// AWS Linux 2022
new ec2.Instance(this, 'Instance4', {
vpc,
instanceType,
machineImage: new ec2.AmazonLinuxImage({
generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2022,
}),
});
```

### Configuring Instances using CloudFormation Init (cfn-init)

CloudFormation Init allows you to configure your instances by writing files to them, installing software
Expand Down
48 changes: 43 additions & 5 deletions packages/@aws-cdk/aws-ec2/lib/machine-image.ts
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,13 @@ export interface AmazonLinuxImageProps {
*/
readonly edition?: AmazonLinuxEdition;

/**
* What kernel version of Amazon Linux to use
*
* @default -
*/
readonly kernel?: AmazonLinuxKernel;

/**
* Virtualization type
*
Expand Down Expand Up @@ -376,13 +383,29 @@ export class AmazonLinuxImage extends GenericSSMParameterImage {
public static ssmParameterName(props: AmazonLinuxImageProps = {}) {
const generation = (props && props.generation) || AmazonLinuxGeneration.AMAZON_LINUX;
const edition = (props && props.edition) || AmazonLinuxEdition.STANDARD;
const virtualization = (props && props.virtualization) || AmazonLinuxVirt.HVM;
const storage = (props && props.storage) || AmazonLinuxStorage.GENERAL_PURPOSE;
const cpu = (props && props.cpuType) || AmazonLinuxCpuType.X86_64;
let kernel = (props && props.kernel) || undefined;
let virtualization: AmazonLinuxVirt | undefined;
let storage: AmazonLinuxStorage | undefined;

if (generation === AmazonLinuxGeneration.AMAZON_LINUX_2022) {
kernel = AmazonLinuxKernel.KERNEL5_X;
if (props && props.storage) {
throw new Error('Storage parameter does not exist in smm parameter name for Amazon Linux 2022.');
}
if (props && props.virtualization) {
throw new Error('Virtualization parameter does not exist in smm parameter name for Amazon Linux 2022.');
}
} else {
virtualization = (props && props.virtualization) || AmazonLinuxVirt.HVM;
storage = (props && props.storage) || AmazonLinuxStorage.GENERAL_PURPOSE;
}

const parts: Array<string|undefined> = [
generation,
'ami',
edition !== AmazonLinuxEdition.STANDARD ? edition : undefined,
kernel,
virtualization,
cpu,
storage,
Expand Down Expand Up @@ -427,6 +450,21 @@ export enum AmazonLinuxGeneration {
* Amazon Linux 2
*/
AMAZON_LINUX_2 = 'amzn2',

/**
* Amazon Linux 2022
*/
AMAZON_LINUX_2022 = 'al2022',
}

/**
* Amazon Linux Kernel
*/
export enum AmazonLinuxKernel {
/**
* Standard edition
*/
KERNEL5_X = 'kernel-5.10',
}

/**
Expand All @@ -441,7 +479,7 @@ export enum AmazonLinuxEdition {
/**
* Minimal edition
*/
MINIMAL = 'minimal'
MINIMAL = 'minimal',
}

/**
Expand All @@ -456,7 +494,7 @@ export enum AmazonLinuxVirt {
/**
* PV virtualization
*/
PV = 'pv'
PV = 'pv',
}

export enum AmazonLinuxStorage {
Expand All @@ -468,7 +506,7 @@ export enum AmazonLinuxStorage {
/**
* S3-backed storage
*/
S3 = 'ebs',
S3 = 's3',

/**
* General Purpose-based storage (recommended)
Expand Down
2 changes: 1 addition & 1 deletion packages/@aws-cdk/aws-ec2/test/example.images.lit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ const amznLinux = ec2.MachineImage.latestAmazonLinux({
const windows = ec2.MachineImage.latestWindows(ec2.WindowsVersion.WINDOWS_SERVER_2019_ENGLISH_FULL_BASE);

// Read AMI id from SSM parameter store
const ssm = ec2.MachineImage.fromSSMParameter('/my/ami', ec2.OperatingSystemType.LINUX);
const ssm = ec2.MachineImage.fromSsmParameter('/my/ami', { os: ec2.OperatingSystemType.LINUX });

// Look up the most recent image matching a set of AMI filters.
// In this case, look up the NAT instance AMI, by using a wildcard
Expand Down
87 changes: 87 additions & 0 deletions packages/@aws-cdk/aws-ec2/test/machine-image.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,93 @@ test('cached lookups of Amazon Linux', () => {
]);
});

test('cached lookups of Amazon Linux 2', () => {
// WHEN
const ami = ec2.MachineImage.latestAmazonLinux({
cachedInContext: true,
generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2,
}).getImage(stack).imageId;

// THEN
expect(ami).toEqual('dummy-value-for-/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2');
expect(app.synth().manifest.missing).toEqual([
{
key: 'ssm:account=1234:parameterName=/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2:region=testregion',
props: {
account: '1234',
region: 'testregion',
parameterName: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2',
},
provider: 'ssm',
},
]);
});

test('cached lookups of Amazon Linux 2 with kernel 5.x', () => {
// WHEN
const ami = ec2.MachineImage.latestAmazonLinux({
cachedInContext: true,
generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2,
kernel: ec2.AmazonLinuxKernel.KERNEL5_X,
}).getImage(stack).imageId;

// THEN
expect(ami).toEqual('dummy-value-for-/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-x86_64-gp2');
expect(app.synth().manifest.missing).toEqual([
{
key: 'ssm:account=1234:parameterName=/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-x86_64-gp2:region=testregion',
props: {
account: '1234',
region: 'testregion',
parameterName: '/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-x86_64-gp2',
},
provider: 'ssm',
},
]);
});

test('throw error if storage param is set for Amazon Linux 2022', () => {
expect(() => {
ec2.MachineImage.latestAmazonLinux({
cachedInContext: true,
generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2022,
storage: ec2.AmazonLinuxStorage.GENERAL_PURPOSE,
}).getImage(stack).imageId;
}).toThrow(/Storage parameter does not exist in smm parameter name for Amazon Linux 2022./);
});

test('throw error if virtualization param is set for Amazon Linux 2022', () => {
expect(() => {
ec2.MachineImage.latestAmazonLinux({
cachedInContext: true,
generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2022,
virtualization: ec2.AmazonLinuxVirt.HVM,
}).getImage(stack).imageId;
}).toThrow(/Virtualization parameter does not exist in smm parameter name for Amazon Linux 2022./);
});

test('cached lookups of Amazon Linux 2022 with kernel 5.x', () => {
// WHEN
const ami = ec2.MachineImage.latestAmazonLinux({
cachedInContext: true,
generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2022,
}).getImage(stack).imageId;

// THEN
expect(ami).toEqual('dummy-value-for-/aws/service/ami-amazon-linux-latest/al2022-ami-kernel-5.10-x86_64');
expect(app.synth().manifest.missing).toEqual([
{
key: 'ssm:account=1234:parameterName=/aws/service/ami-amazon-linux-latest/al2022-ami-kernel-5.10-x86_64:region=testregion',
props: {
account: '1234',
region: 'testregion',
parameterName: '/aws/service/ami-amazon-linux-latest/al2022-ami-kernel-5.10-x86_64',
},
provider: 'ssm',
},
]);
});

function isWindowsUserData(ud: ec2.UserData) {
return ud.render().indexOf('powershell') > -1;
}
Expand Down

0 comments on commit 5a669d7

Please sign in to comment.