Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions packages/@aws-cdk/aws-ec2-alpha/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,31 @@ new SubnetV2(this, 'subnetA', {
})
```

### Availability Zone Specification

SubnetV2 supports two ways to specify the availability zone:

1. **Availability Zone Name** (`availabilityZone`): Standard AZ name like 'us-east-1a'
2. **Availability Zone ID** (`availabilityZoneId`): AZ ID like 'use1-az1' for cross-account consistency

**When to use AZ IDs**: Use `availabilityZoneId` when you need consistent placement across AWS accounts, as AZ names can map to different physical zones per account, but AZ IDs remain consistent.

**Important**: AZ IDs are account-specific. The same AZ ID (e.g., 'use1-az1') may not exist in all accounts.

```ts
const myVpc = new VpcV2(this, 'MyVpc', {
primaryAddressBlock: IpAddresses.ipv4('10.0.0.0/16'),
});

// Using AZ ID for cross-account consistency
new SubnetV2(this, 'CrossAccountSubnet', {
vpc: myVpc,
availabilityZoneId: 'use1-az1',
ipv4CidrBlock: new IpCidr('10.0.1.0/24'),
subnetType: SubnetType.PUBLIC,
})
```

Since `VpcV2` does not create subnets automatically, users have full control over IP addresses allocation across subnets.

## IP Addresses Management
Expand Down
33 changes: 31 additions & 2 deletions packages/@aws-cdk/aws-ec2-alpha/lib/subnet-v2.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,21 @@ export interface SubnetV2Props {

/**
* Custom AZ for the subnet
*
* Either `availabilityZone` or `availabilityZoneId` must be specified, but not both.
*
* @default - No availability zone specified, must provide availabilityZoneId instead
*/
readonly availabilityZone: string;
readonly availabilityZone?: string;

/**
* The AZ ID of the subnet
*
* Either `availabilityZone` or `availabilityZoneId` must be specified, but not both.
*
* @default - No availability zone ID specified, must provide availabilityZone instead
*/
readonly availabilityZoneId?: string;

/**
* Custom Route for subnet
Expand Down Expand Up @@ -270,6 +283,14 @@ export class SubnetV2 extends Resource implements ISubnetV2 {
// Enhanced CDK Analytics Telemetry
addConstructMetadata(this, props);

// Validate availability zone specification
if (!props.availabilityZone && !props.availabilityZoneId) {
throw new UnscopedValidationError('Either availabilityZone or availabilityZoneId must be specified');
}
if (props.availabilityZone && props.availabilityZoneId) {
throw new UnscopedValidationError('Cannot specify both availabilityZone and availabilityZoneId. Use either availabilityZone or availabilityZoneId');
}

const ipv4CidrBlock = props.ipv4CidrBlock.cidr;
const ipv6CidrBlock = props.ipv6CidrBlock?.cidr;

Expand Down Expand Up @@ -307,6 +328,7 @@ export class SubnetV2 extends Resource implements ISubnetV2 {
cidrBlock: ipv4CidrBlock,
ipv6CidrBlock: ipv6CidrBlock,
availabilityZone: props.availabilityZone,
availabilityZoneId: props.availabilityZoneId,
assignIpv6AddressOnCreation: props.assignIpv6AddressOnCreation,
mapPublicIpOnLaunch: props.mapPublicIpOnLaunch,
});
Expand All @@ -315,7 +337,7 @@ export class SubnetV2 extends Resource implements ISubnetV2 {
this.ipv4CidrBlock = props.ipv4CidrBlock.cidr;
this.ipv6CidrBlock = props.ipv6CidrBlock?.cidr;
this.subnetId = subnet.ref;
this.availabilityZone = props.availabilityZone;
this.availabilityZone = props.availabilityZone || subnet.attrAvailabilityZone;

this._networkAcl = NetworkAcl.fromNetworkAclId(this, 'Acl', subnet.attrNetworkAclAssociationId);

Expand Down Expand Up @@ -395,6 +417,13 @@ export interface SubnetV2Attributes {
*/
readonly availabilityZone: string;

/**
* The AZ ID of the subnet
*
* @default - No AZ ID information
*/
readonly availabilityZoneId?: string;

/**
* The IPv4 CIDR block associated with the subnet
*
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading