From 4f8036f7452ad6e23f801d150907fadbbb40f60b Mon Sep 17 00:00:00 2001 From: Andrew Hammond Date: Mon, 10 Feb 2020 09:31:27 -0800 Subject: [PATCH 1/2] fix: include serviceName in IService --- packages/@aws-cdk/aws-ecs/lib/base/base-service.ts | 7 +++++++ packages/@aws-cdk/aws-ecs/lib/ec2/ec2-service.ts | 9 ++++++++- packages/@aws-cdk/aws-ecs/lib/fargate/fargate-service.ts | 7 ++++++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/packages/@aws-cdk/aws-ecs/lib/base/base-service.ts b/packages/@aws-cdk/aws-ecs/lib/base/base-service.ts index abd4807e7e960..fe6a28b14943b 100644 --- a/packages/@aws-cdk/aws-ecs/lib/base/base-service.ts +++ b/packages/@aws-cdk/aws-ecs/lib/base/base-service.ts @@ -22,6 +22,13 @@ export interface IService extends IResource { * @attribute */ readonly serviceArn: string; + + /** + * The name of the service. + * + * @attribute + */ + readonly serviceName: string; } /** diff --git a/packages/@aws-cdk/aws-ecs/lib/ec2/ec2-service.ts b/packages/@aws-cdk/aws-ecs/lib/ec2/ec2-service.ts index 13877c0785126..7b657245216b7 100644 --- a/packages/@aws-cdk/aws-ecs/lib/ec2/ec2-service.ts +++ b/packages/@aws-cdk/aws-ecs/lib/ec2/ec2-service.ts @@ -1,4 +1,5 @@ import * as ec2 from '@aws-cdk/aws-ec2'; +import * as cdk from '@aws-cdk/core'; import { Construct, Lazy, Resource, Stack } from '@aws-cdk/core'; import { BaseService, BaseServiceOptions, IService, LaunchType, PropagatedTagSource } from '../base/base-service'; import { NetworkMode, TaskDefinition } from '../base/task-definition'; @@ -98,9 +99,15 @@ export class Ec2Service extends BaseService implements IEc2Service { * Imports from the specified service ARN. */ public static fromEc2ServiceArn(scope: Construct, id: string, ec2ServiceArn: string): IEc2Service { - class Import extends Resource implements IEc2Service { + const serviceName = cdk.Stack.of(scope).parseArn(ec2ServiceArn).serviceName; + if (!serviceName) { + throw new Error(`ECS ARN must be in the format 'arn:aws:ecs:::service/', got: '${ec2ServiceArn}'`); + } + class Import extends cdk.Resource implements IEc2Service { public readonly serviceArn = ec2ServiceArn; + public readonly serviceName = serviceName; } + return new Import(scope, id); } diff --git a/packages/@aws-cdk/aws-ecs/lib/fargate/fargate-service.ts b/packages/@aws-cdk/aws-ecs/lib/fargate/fargate-service.ts index d2c064df93d6f..5e4f4a1165b89 100644 --- a/packages/@aws-cdk/aws-ecs/lib/fargate/fargate-service.ts +++ b/packages/@aws-cdk/aws-ecs/lib/fargate/fargate-service.ts @@ -73,11 +73,16 @@ export interface IFargateService extends IService { export class FargateService extends BaseService implements IFargateService { /** - * Import a task definition from the specified task definition ARN. + * Import a service definition from the specified task definition ARN. */ public static fromFargateServiceArn(scope: cdk.Construct, id: string, fargateServiceArn: string): IFargateService { + const serviceName = cdk.Stack.of(scope).parseArn(fargateServiceArn).serviceName; + if (!serviceName) { + throw new Error(`ECS ARN must be in the format 'arn:aws:ecs:::service/', got: '${fargateServiceArn}'`); + } class Import extends cdk.Resource implements IFargateService { public readonly serviceArn = fargateServiceArn; + public readonly serviceName = serviceName; } return new Import(scope, id); } From f176cde5ef97bd61f6bb753062f4199a1b771763 Mon Sep 17 00:00:00 2001 From: Andrew Hammond Date: Mon, 10 Feb 2020 09:32:33 -0800 Subject: [PATCH 2/2] WIP: cluster support --- .../lib/ecs/deploy-action.ts | 2 +- .../@aws-cdk/aws-ecs/lib/base/base-service.ts | 5 ++++ .../@aws-cdk/aws-ecs/lib/ec2/ec2-service.ts | 22 +++++++++++++++++- .../aws-ecs/lib/fargate/fargate-service.ts | 23 ++++++++++++++++++- 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/packages/@aws-cdk/aws-codepipeline-actions/lib/ecs/deploy-action.ts b/packages/@aws-cdk/aws-codepipeline-actions/lib/ecs/deploy-action.ts index 245764f12bb56..c7bc50dccf5c8 100644 --- a/packages/@aws-cdk/aws-codepipeline-actions/lib/ecs/deploy-action.ts +++ b/packages/@aws-cdk/aws-codepipeline-actions/lib/ecs/deploy-action.ts @@ -39,7 +39,7 @@ export interface EcsDeployActionProps extends codepipeline.CommonAwsActionProps /** * The ECS Service to deploy. */ - readonly service: ecs.BaseService; + readonly service: ecs.IBaseService; } /** diff --git a/packages/@aws-cdk/aws-ecs/lib/base/base-service.ts b/packages/@aws-cdk/aws-ecs/lib/base/base-service.ts index fe6a28b14943b..cedaae243ff09 100644 --- a/packages/@aws-cdk/aws-ecs/lib/base/base-service.ts +++ b/packages/@aws-cdk/aws-ecs/lib/base/base-service.ts @@ -29,6 +29,11 @@ export interface IService extends IResource { * @attribute */ readonly serviceName: string; + +} + +export interface IBaseService extends IService { + readonly cluster: ICluster; } /** diff --git a/packages/@aws-cdk/aws-ecs/lib/ec2/ec2-service.ts b/packages/@aws-cdk/aws-ecs/lib/ec2/ec2-service.ts index 7b657245216b7..7aa13c95bd38c 100644 --- a/packages/@aws-cdk/aws-ecs/lib/ec2/ec2-service.ts +++ b/packages/@aws-cdk/aws-ecs/lib/ec2/ec2-service.ts @@ -1,7 +1,14 @@ import * as ec2 from '@aws-cdk/aws-ec2'; import * as cdk from '@aws-cdk/core'; import { Construct, Lazy, Resource, Stack } from '@aws-cdk/core'; -import { BaseService, BaseServiceOptions, IService, LaunchType, PropagatedTagSource } from '../base/base-service'; +import { + BaseService, + BaseServiceOptions, + IBaseService, + IService, + LaunchType, + PropagatedTagSource +} from '../base/base-service'; import { NetworkMode, TaskDefinition } from '../base/task-definition'; import { CfnService } from '../ecs.generated'; import { PlacementConstraint, PlacementStrategy } from '../placement'; @@ -111,6 +118,19 @@ export class Ec2Service extends BaseService implements IEc2Service { return new Import(scope, id); } + /** + * Import a service definition from the specified service attributes. + */ + public static fromEc2ServiceAttributes(scope: Construct, id: string, attributes: string): IBaseService { + class Import extends Resource implements IBaseService { + public readonly cluster = ; + public readonly serviceArn = fargateServiceArn; + public readonly serviceName = matcher.exec(fargateServiceArn)[0]; + } + return new Import(scope, id) + } + + private readonly constraints: CfnService.PlacementConstraintProperty[]; private readonly strategies: CfnService.PlacementStrategyProperty[]; private readonly daemon: boolean; diff --git a/packages/@aws-cdk/aws-ecs/lib/fargate/fargate-service.ts b/packages/@aws-cdk/aws-ecs/lib/fargate/fargate-service.ts index 5e4f4a1165b89..a681fd04be377 100644 --- a/packages/@aws-cdk/aws-ecs/lib/fargate/fargate-service.ts +++ b/packages/@aws-cdk/aws-ecs/lib/fargate/fargate-service.ts @@ -1,6 +1,13 @@ import * as ec2 from '@aws-cdk/aws-ec2'; import * as cdk from '@aws-cdk/core'; -import { BaseService, BaseServiceOptions, IService, LaunchType, PropagatedTagSource } from '../base/base-service'; +import { + BaseService, + BaseServiceOptions, + IBaseService, + IService, + LaunchType, + PropagatedTagSource +} from '../base/base-service'; import { TaskDefinition } from '../base/task-definition'; /** @@ -87,6 +94,20 @@ export class FargateService extends BaseService implements IFargateService { return new Import(scope, id); } + /** + * Import a service definition from the specified service attributes. + */ + public static fromFargateServiceAttributes(scope: cdk.Construct, id: string, attributes: string): IBaseService { + const matcher = new RegExp(/arn:[^:]+:ecs:[^:]+[^:]+:[^:]+:service\/(.*)/); + class Import extends cdk.Resource implements IBaseService { + public readonly cluster = ; + public readonly serviceArn = fargateServiceArn; + public readonly serviceName = matcher.exec(fargateServiceArn)[0]; + } + return new Import(scope, id); + } + + /** * Constructs a new instance of the FargateService class. */