CDKで作成したEKSクラスタのノードにセキュリティグループを設定する

awskubernetes

CDK の aws_eks.Cluster には securityGroup というフィールドがあるが、 これはコントロールプレーンの ENI に紐づく SG となっており、渡さない場合は自動で作成される。

ではノードの SG の設定はどこにあるかというとノードグループのAutoScalingGroupにある。

CDK で EKS クラスタを作成する場合、DefaultCapacityType がデフォルトの NODEGROUP のとき、 defaultCapacity の数のノードから構成され、EKS によって drain などが行われるマネージドノードグループが作られる。

ただ、このマネージドノードグループを参照するために Cluster の defaultCapacity を参照しても何も起こらない。 なぜなら、このフィールドは DefaultCapacityType が EC2 のときのみしか値が入らないからだ。 NODEGROUP の場合は代わりに defaultNodegroup を用いる。 ただしこのフィールドは AutoScalingGroup を返す前者と異なり、Nodegroup を返すため、 addSecurityGroup() のようなインタフェースを持たない。

そこで defaultCapacity を 0 にしてデフォルトでノードグループが作られないようにして AutoScalingGroup を返す addAutoScalingGroupCapacity() で SG を追加した。

const cluster = new eks.Cluster(this, 'Cluster', {
  ...
  defaultCapacity: 0,
})

const securityGroup = new ec2.SecurityGroup(this, 'EKSClusterDefaultCapacitySecurityGroup', {
  vpc,
  allowAllOutbound: true,
})

const defaultCapacityAsg = cluster.addAutoScalingGroupCapacity('EKSClusterDefaultCapacity', {
  instanceType: new ec2.InstanceType('t3.small'),
  minCapacity:  2,
})

defaultCapacityAsg.connections.addSecurityGroup(securityGroup)

既存の SG を追加する場合は注意が必要で、自動で追加される設定と重複するものが既にある場合、リソースの削除時にまとめて消されてしまう。 そのため使い回さずに新規に作った方が良いと考えている。