Skip to content

Commit 95c49ab

Browse files
authored
fix(ec2): fixing vpc endpoint pattern for ecr and ecr docker (#31434)
### Issue # (if applicable) Closes #. Internal Tracking ticket P150271569 ### Reason for this change Expected Endpoints for ECR in some isolated regions are as below gov.ic.hci.csp.us-isof-name.ecr.api, gov.ic.hci.csp.us-isof-name.ecr.dkr, uk.adc-e.cloud.eu-isoe-name.ecr.api, uk.adc-e.cloud.eu-isoe-name.ecr.dkr, ### Description of changes As discussed with the ECR Service team, endpoints for the service are being generated in reverse order of the domain suffix. Since some of the endpoints for other services are still using `com.amazonaws` , added fix only for the partitions and service(ECR) flagged. Cannot do for cn regions on the basis of suffix as both regions have different services under exceptions. ### Description of how you validated changes Added unit test for validation of endpoint, keeping the region names as `us-isoe-test-1` as the regions are in build stage and could be confidential. No changes to integration test as the fix is for isolated regions. ### Checklist - [x] My code adheres to the [CONTRIBUTING GUIDE](https://github.com/aws/aws-cdk/blob/main/CONTRIBUTING.md) and [DESIGN GUIDELINES](https://github.com/aws/aws-cdk/blob/main/docs/DESIGN_GUIDELINES.md) ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
1 parent b6ad97f commit 95c49ab

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

packages/aws-cdk-lib/aws-ec2/lib/vpc-endpoint.ts

+15-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { ISubnet, IVpc, SubnetSelection } from './vpc';
99
import * as iam from '../../aws-iam';
1010
import * as cxschema from '../../cloud-assembly-schema';
1111
import { Aws, ContextProvider, IResource, Lazy, Resource, Stack, Token } from '../../core';
12+
import { PARTITION_MAP } from '../../region-info/build-tools/fact-tables';
1213

1314
/**
1415
* A VPC endpoint.
@@ -666,8 +667,21 @@ export class InterfaceVpcEndpointAwsService implements IInterfaceVpcEndpointServ
666667
'redshift', 'redshift-data', 's3', 'sagemaker.api', 'sagemaker.featurestore-runtime', 'sagemaker.runtime', 'securityhub',
667668
'servicecatalog', 'sms', 'sqs', 'states', 'sts', 'sync-states', 'synthetics', 'transcribe', 'transcribestreaming', 'transfer',
668669
'workspaces', 'xray'],
670+
'us-isof-': ['ecr.api', 'ecr.dkr'],
671+
'eu-isoe-': ['ecr.api', 'ecr.dkr'],
669672
};
670-
if (VPC_ENDPOINT_SERVICE_EXCEPTIONS[region]?.includes(name)) {
673+
674+
const regionPartition = region.split('-').slice(0, 2).join('-');
675+
const partitionDetails = PARTITION_MAP[`${regionPartition}-`];
676+
677+
// Check for specific service name under isolated region prefix
678+
const serviceInExceptions = VPC_ENDPOINT_SERVICE_EXCEPTIONS[`${regionPartition}-`]?.includes(name);
679+
680+
if (serviceInExceptions) {
681+
// Endpoints generated in reverse of domain suffix for the services mentioned in map
682+
const reverseString = partitionDetails.domainSuffix.split('.').reverse().join('.');
683+
return reverseString;
684+
} else if (VPC_ENDPOINT_SERVICE_EXCEPTIONS[region]?.includes(name)) {
671685
return 'cn.com.amazonaws';
672686
} else {
673687
return 'com.amazonaws';

packages/aws-cdk-lib/aws-ec2/test/vpc-endpoint.test.ts

+31
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,37 @@ describe('vpc endpoint', () => {
694694
});
695695

696696
});
697+
698+
test.each([
699+
['us-isof-test-1', 'gov.ic.hci.csp'],
700+
['eu-isoe-test-1', 'uk.adc-e.cloud'],
701+
['us-east-1', 'com.amazonaws'],
702+
['us-gov-west-1', 'com.amazonaws'],
703+
['cn-northwest-1', 'cn.com.amazonaws'],
704+
['cn-north-1', 'cn.com.amazonaws'],
705+
])('test vpc interface endpoint for ECR can be created correctly in all regions', (region : string, domain: string) => {
706+
//GIVEN
707+
const stack = new Stack(undefined, 'TestStack', { env: { account: '123456789012', region: region } });
708+
const vpc = new Vpc(stack, 'VPC');
709+
710+
//WHEN
711+
vpc.addInterfaceEndpoint('ECR Endpoint', {
712+
service: InterfaceVpcEndpointAwsService.ECR,
713+
});
714+
715+
vpc.addInterfaceEndpoint('ECR Docker Endpoint', {
716+
service: InterfaceVpcEndpointAwsService.ECR_DOCKER,
717+
});
718+
719+
//THEN
720+
Template.fromStack(stack).hasResourceProperties('AWS::EC2::VPCEndpoint', {
721+
ServiceName: `${domain}.${region}.ecr.api`,
722+
});
723+
Template.fromStack(stack).hasResourceProperties('AWS::EC2::VPCEndpoint', {
724+
ServiceName: `${domain}.${region}.ecr.dkr`,
725+
});
726+
});
727+
697728
test.each([
698729
['transcribe', InterfaceVpcEndpointAwsService.TRANSCRIBE],
699730
])('test vpc interface endpoint with .cn suffix for %s can be created correctly in China regions', (name: string, given: InterfaceVpcEndpointAwsService) => {

0 commit comments

Comments
 (0)