AWS CDKを使ったEC2 Instance Connect Endpointの実装

はじめに

プライベートサブネットにおいてあるEC2に対して、Instance Connect Endpointを使って接続するということを実施しています。

docs.aws.amazon.com

ただ、セキュリティグループの設定などを毎回誤ったりするので、同じミスを繰り返さないようにCDKをもって実装することにしました。

実装

まずは、aws-cdkのバージョンを最新に上げておきます。これは、EC2 Instance Connect Endpointをつくるためのコンストラクタを使えるようにするためです。この記事を書いている段階でaws-cdkのバージョンは2.130.0なので、npm -g install aws-cdk@2.130.0としておきます。

その後、cdk init app --language typescriptでテンプレートを作成し、libディレクトリ以下にできているTypeScriptファイルを編集します。

まずはVPCを作成します。サンプルとして、プライベートサブネットだけにします。

    const vpc = new Vpc(this, 'VPC', {
      maxAzs: 1,
      subnetConfiguration: [
        {
          name: 'private',
          subnetType: SubnetType.PRIVATE_ISOLATED,
        },
      ],
    });

セキュリティグループを作成します。SSHだけを許可します。

    // EC2用のセキュリティグループ
    const securityGroupForEC2 = new SecurityGroup(this, 'SecurityGroupForEC2', {
      vpc,
    });
    // EIC用のセキュリティグループ
    const securityGroupForEIC = new SecurityGroup(this, 'SecurityGroupForEIC', {
      vpc,
      allowAllOutbound: false, // 指定のEC2のみに通信を許可するためfalseを指定
    });
    securityGroupForEC2.addIngressRule(securityGroupForEIC, Port.tcp(22));
    securityGroupForEIC.addEgressRule(securityGroupForEC2, Port.tcp(22));

Instance Connect Endpointを作成します。

    // EC2 Instance Connectを作成する
    new CfnInstanceConnectEndpoint(this, 'InstanceConnect', {
      subnetId: vpc.selectSubnets({ subnetType: SubnetType.PRIVATE_ISOLATED }).subnetIds[0],
      securityGroupIds: [securityGroupForEIC.securityGroupId],
    });

使用したL1コンストラクタのドキュメントは以下を。

docs.aws.amazon.com

実装が終わればcdk deployをすればOKです。

EC2の作成

EC2を作成します。ネットワークの設定で、サブネットを上記のCDKで作成したプライベートサブネットに配置することが注意点です。

確認

cdk deployを実行後、コンソールで確認します。

VPCが作成されています。

EC2の接続から「EC2 Instance Connect」を選択すると、エンドポイントも作成されていることが確認できます。

接続してみると、無事接続できます。

考察

CDKはAWSの更新に伴い、頻繁にバージョンアップされます。そのため、aws-cdkを定期的にバージョンアップしておかないと使用したいコンストラクタが使用できないということに陥ります。

Node.jsではnpm-check-updatesというパッケージが存在し、ncuコマンドでパッケージの更新有無が確認できるので、利用すると良いかなと思います。

www.npmjs.com

今回はEC2 Instance Connect EndpointをCDKを使って実装することをやりました。EC2 Instance Connect Endpointは簡単に設定できますが、VPCやサブネットごとに1つしか作成できないというクォーターが存在します(2024年2月現在)。

docs.aws.amazon.com

今回みたいなサンプルですと十分ですが、より複雑なネットワーク構成ですとEC2 Instance Connect Endpointのこのクォーター制限はかなり厳しいのかなと思われます。その際は別の接続手段を取ることが必要になると思われます。