Skip to content

Commit eb2d7f6

Browse files
committed
Add support for full EBS device configuration
1 parent b6d3d2a commit eb2d7f6

File tree

3 files changed

+35
-36
lines changed

3 files changed

+35
-36
lines changed

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

+7-2
Original file line numberDiff line numberDiff line change
@@ -545,9 +545,14 @@ with the command `aws ec2-instance-connect send-ssh-public-key` to provide your
545545

546546
EBS volume for the bastion host can be encrypted like:
547547
```ts
548-
new BastionHostLinux(stack, 'Bastion', {
548+
const host = new ec2.BastionHostLinux(stack, 'BastionHost', {
549549
vpc,
550-
ebsVolumeEncryption: true
550+
blockDevices: [{
551+
deviceName: 'EBSBastionHost',
552+
volume: BlockDeviceVolume.ebs(10, {
553+
encrypted: true,
554+
}),
555+
}],
551556
});
552557
```
553558

packages/@aws-cdk/aws-ec2/lib/bastion-host.ts

+21-32
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { IMachineImage, MachineImage } from './machine-image';
77
import { IPeer } from './peer';
88
import { Port } from './port';
99
import { ISecurityGroup } from './security-group';
10-
import { BlockDeviceVolume } from './volume';
10+
import { BlockDevice } from './volume';
1111
import { IVpc, SubnetSelection } from './vpc';
1212

1313
/**
@@ -67,12 +67,18 @@ export interface BastionHostLinuxProps {
6767
readonly machineImage?: IMachineImage;
6868

6969
/**
70-
* Encryption for EBS volume
71-
* If true, encrypted volume will be created with a default voulme size of 10 GiB.
70+
* Specifies how block devices are exposed to the instance. You can specify virtual devices and EBS volumes.
7271
*
73-
* @default false
72+
* Each instance that is launched has an associated root device volume,
73+
* either an Amazon EBS volume or an instance store volume.
74+
* You can use block device mappings to specify additional EBS volumes or
75+
* instance store volumes to attach to an instance when it is launched.
76+
*
77+
* @see https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html
78+
*
79+
* @default - Uses the block device mapping of the AMI
7480
*/
75-
readonly ebsVolumeEncryption?: boolean;
81+
readonly blockDevices?: BlockDevice[];
7682
}
7783

7884
/**
@@ -139,33 +145,16 @@ export class BastionHostLinux extends Construct implements IInstance {
139145
super(scope, id);
140146
this.stack = Stack.of(scope);
141147

142-
if (props.ebsVolumeEncryption) {
143-
this.instance = new Instance(this, 'Resource', {
144-
vpc: props.vpc,
145-
availabilityZone: props.availabilityZone,
146-
securityGroup: props.securityGroup,
147-
instanceName: props.instanceName ?? 'BastionHost',
148-
instanceType: props.instanceType ?? InstanceType.of(InstanceClass.T3, InstanceSize.NANO),
149-
machineImage: props.machineImage ?? MachineImage.latestAmazonLinux({ generation: AmazonLinuxGeneration.AMAZON_LINUX_2 }),
150-
vpcSubnets: props.subnetSelection ?? {},
151-
blockDevices: [{
152-
deviceName: 'EBSBastionHost',
153-
volume: BlockDeviceVolume.ebs(10, {
154-
encrypted: props.ebsVolumeEncryption ?? false,
155-
}),
156-
}],
157-
});
158-
} else {
159-
this.instance = new Instance(this, 'Resource', {
160-
vpc: props.vpc,
161-
availabilityZone: props.availabilityZone,
162-
securityGroup: props.securityGroup,
163-
instanceName: props.instanceName ?? 'BastionHost',
164-
instanceType: props.instanceType ?? InstanceType.of(InstanceClass.T3, InstanceSize.NANO),
165-
machineImage: props.machineImage ?? MachineImage.latestAmazonLinux({ generation: AmazonLinuxGeneration.AMAZON_LINUX_2 }),
166-
vpcSubnets: props.subnetSelection ?? {},
167-
});
168-
}
148+
this.instance = new Instance(this, 'Resource', {
149+
vpc: props.vpc,
150+
availabilityZone: props.availabilityZone,
151+
securityGroup: props.securityGroup,
152+
instanceName: props.instanceName ?? 'BastionHost',
153+
instanceType: props.instanceType ?? InstanceType.of(InstanceClass.T3, InstanceSize.NANO),
154+
machineImage: props.machineImage ?? MachineImage.latestAmazonLinux({ generation: AmazonLinuxGeneration.AMAZON_LINUX_2 }),
155+
vpcSubnets: props.subnetSelection ?? {},
156+
blockDevices: props.blockDevices ?? undefined,
157+
});
169158
this.instance.addToRolePolicy(new PolicyStatement({
170159
actions: [
171160
'ssmmessages:*',

packages/@aws-cdk/aws-ec2/test/test.bastion-host.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { expect, haveResource } from '@aws-cdk/assert';
22
import { Stack } from '@aws-cdk/core';
33
import { Test } from 'nodeunit';
4-
import { BastionHostLinux, SubnetType, Vpc } from '../lib';
4+
import { BastionHostLinux, BlockDeviceVolume, SubnetType, Vpc } from '../lib';
55

66
export = {
77
'default instance is created in basic'(test: Test) {
@@ -62,7 +62,12 @@ export = {
6262
// WHEN
6363
new BastionHostLinux(stack, 'Bastion', {
6464
vpc,
65-
ebsVolumeEncryption: true,
65+
blockDevices: [{
66+
deviceName: 'EBSBastionHost',
67+
volume: BlockDeviceVolume.ebs(10, {
68+
encrypted: true,
69+
}),
70+
}],
6671
});
6772

6873
// THEN

0 commit comments

Comments
 (0)