🐚
AWS CDK の aws-ecs-patterns で ECS Exec を使う
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
参考にした記事。
Discussion
aws_ecs_patterns
で ECS Exec がサポートされたため、現在はこの方法を使わなくても、enableExecuteCommand: true
を設定するだけで有効にできます。この Aspects ライブラリでシュッと設定できるやりかたには結構長い間お世話になりました。ありがとうございました。