🐚

AWS CDK の aws-ecs-patterns で ECS Exec を使う

2021/12/08に公開
1

tl; dr

AWS CDK には ECS でよくある構成パターンをまとめた @aws-cdk/aws-ecs-patterns というパッケージがある。
便利な反面、コンストラクタの一部プロパティが渡せなくなっており、ECS Exec が有効にできない。
でも Aspects ライブラリでシュッと設定できるよ。

実際のコード

import * as cdk from 'aws-cdk-lib';
import * as constructs from 'constructs';

import { aws_ecs as ecs } from 'aws-cdk-lib';
import { aws_ecs_patterns as ecs_patterns } from 'aws-cdk-lib';
import { aws_iam as iam } from 'aws-cdk-lib';

class EnableExecuteCommand implements cdk.IAspect {
  public visit(node: constructs.IConstruct): void {
    if (node instanceof ecs.CfnService) {
      node.addOverride('Properties.EnableExecuteCommand', true);
    }
  }
}

export class CdkEcsExecStack extends cdk.Stack {
  constructor(scope: constructs.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const service = new ecs_patterns.ApplicationLoadBalancedFargateService(this, 'Service', {
      desiredCount: 1,
      taskImageOptions: {
        image: ecs.ContainerImage.fromRegistry('public.ecr.aws/nginx/nginx:latest'),
      },
    });

    service.taskDefinition.taskRole.addToPrincipalPolicy(
      new iam.PolicyStatement({
        actions: [
          'ssmmessages:CreateControlChannel',
          'ssmmessages:CreateDataChannel',
          'ssmmessages:OpenControlChannel',
          'ssmmessages:OpenDataChannel',
        ],
        resources: ['*'],
      }),
    );

    cdk.Aspects.of(service).add(new EnableExecuteCommand());
  }
}

References

参考にした記事。

https://qiita.com/cohey0727/items/c18ea73ee788752a1873

Discussion

Hirofumi WakasugiHirofumi Wakasugi

aws_ecs_patterns で ECS Exec がサポートされたため、現在はこの方法を使わなくても、 enableExecuteCommand: true を設定するだけで有効にできます。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ecs_patterns-readme.html#ecs-exec

https://github.com/aws/aws-cdk/pull/18663

この Aspects ライブラリでシュッと設定できるやりかたには結構長い間お世話になりました。ありがとうございました。