インフラ

AWS CDK ecs-patternsで作成されるALBのセキュリティグループの全許可ルールを削除する

cdk

こんにちは、ちゃりおです。

CDKのecs-patters簡単にecsの環境用意できて便利ですよね。

使ってみて1つ気になることがありました。

ecs-pattersで作成したALBのセキュリティグループ送信元全許可(0.0.0.0/0)のルールが付与されることです。(cdk version 1.115.0)
検証環境とかでIPアドレスを制限したいときがあって少し困りました。
(一応Issueも上がっているみたいです。aws/aws-cdk (ecs-patterns): Allow to disable default security group in ApplicationLoadBalancedFargateService )

結論から書くと、「addPropertyDeletionOverride」でデフォルト「0.0.0.0/0」のルールを削除しました。

ecs-patterns ApplicationLoadBalancedFargateServiceで送信元 全許可セキュリティグループが作られる

ecs-patternsで普通に作ってみる

例えばこんな感じで、ECS作ります。

import * as cdk from '@aws-cdk/core';
import * as ecs from "@aws-cdk/aws-ecs"
import * as ecsPatterns from "@aws-cdk/aws-ecs-patterns"

export class CdkSampleEcsStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    const service = new ecsPatterns.ApplicationLoadBalancedFargateService(this, 'Service', {
      memoryLimitMiB: 1024,
      cpu: 512,
      taskImageOptions: {
        image: ecs.ContainerImage.fromRegistry("amazon/amazon-ecs-sample"),
      }
    })
  }
}

生成されるCloudformationを見ると、「0.0.0.0/0」のIngressルールが作られています。
80番ポートが全世界に公開されています。

  "ServiceLBSecurityGroupF7435A5C": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupDescription": "Automatically created Security Group for ELB CdkSampleEcsStackServiceLBD4737F09",
        "SecurityGroupIngress": [
          {
            "CidrIp": "0.0.0.0/0",
            "Description": "Allow from anyone on port 80",
            "FromPort": 80,
            "IpProtocol": "tcp",
            "ToPort": 80
          }
        ],

Fargate作る前にALB作ってセキュリティグループつけた場合も同様です。

    const vpc = new ec2.Vpc(this, "vpc")
    const alb = new elb.ApplicationLoadBalancer(this, "alb", { vpc })
    const lbsg = new ec2.SecurityGroup(this, "lbsg", {
      vpc
    })
    lbsg.addIngressRule(ec2.Peer.ipv4("10.0.0.0/16"), ec2.Port.tcp(80))
    alb.addSecurityGroup(lbsg)

解決策

生成されるCFNを上書きしてルールを削除しました。
Fargateを作成後に追記しました。

    const lbsg = service.loadBalancer.node.findChild("SecurityGroup") as ec2.SecurityGroup
    const cfnLbsg = lbsg.node.findChild("Resource") as ec2.CfnSecurityGroup
    cfnLbsg.addPropertyDeletionOverride("SecurityGroupIngress")

生成されるCFNを見てみると、「0.0.0.0/0」のIngressルールが削除されているのがわかります。
あとは、「addSecurityGroup」で必要なセキュリティグループを追加します。


    "ServiceLBSecurityGroupF7435A5C": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupDescription": "Automatically created Security Group for ELB CdkSampleEcsStackServiceLBD4737F09",
        "VpcId": {
          "Ref": "EcsDefaultClusterMnL3mNNYNVpc7788A521"
        }
      },
      "Metadata": {
        "aws:cdk:path": "CdkSampleEcsStack/Service/LB/SecurityGroup/Resource"
      }
    },

所感

ecs-patterns使用する際には一工夫必要な場合もありますが、コード量をかなり抑えれるのでおすすめです。
ECSの検証で環境をさっと用意したい際などに役立つと思います。
細かく設定したい場合も、「addPropertyOverride」などを使えばなんとかなることも多そうです。

Amzonで「AWS」の本を見てみる

楽天で「AWS」の本をみてみる!!

cdk
CDK ecs-service-extensionsを使用してお手軽にAppMeshを有効化したECSサービスを作成するこんにちは、ちゃりおです。 最近AWS CDKのAmazon ECS拡張機能(ecs-service-extensions)を使ってみ...
devopsバッジ
AWS 認定 DevOps エンジニア – プロフェッショナルの勉強法こんにちは、ちゃりおです。 先日DOP取得したので、勉強法についてまとめてみます。 勉強時間なども書いたので、よかったら参考にしてくだ...
リポジトリにタスク定義ファイルを含めずにGitHub ActionsでECSにデプロイする方法こんにちは、ちゃりおです。 CDKでECS関連のリソースを作って、Github Actionsでデプロイしていました。 Github ...