はじめに
プライベートサブネットにおいてあるEC2に対して、Instance Connect Endpointを使って接続するということを実施しています。
ただ、セキュリティグループの設定などを毎回誤ったりするので、同じミスを繰り返さないように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コンストラクタのドキュメントは以下を。
実装が終わればcdk deploy
をすればOKです。
EC2の作成
EC2を作成します。ネットワークの設定で、サブネットを上記のCDKで作成したプライベートサブネットに配置することが注意点です。
確認
cdk deploy
を実行後、コンソールで確認します。
VPCが作成されています。
EC2の接続から「EC2 Instance Connect」を選択すると、エンドポイントも作成されていることが確認できます。
接続してみると、無事接続できます。
考察
CDKはAWSの更新に伴い、頻繁にバージョンアップされます。そのため、aws-cdkを定期的にバージョンアップしておかないと使用したいコンストラクタが使用できないということに陥ります。
Node.jsではnpm-check-updatesというパッケージが存在し、ncu
コマンドでパッケージの更新有無が確認できるので、利用すると良いかなと思います。
今回はEC2 Instance Connect EndpointをCDKを使って実装することをやりました。EC2 Instance Connect Endpointは簡単に設定できますが、VPCやサブネットごとに1つしか作成できないというクォーターが存在します(2024年2月現在)。
今回みたいなサンプルですと十分ですが、より複雑なネットワーク構成ですとEC2 Instance Connect Endpointのこのクォーター制限はかなり厳しいのかなと思われます。その際は別の接続手段を取ることが必要になると思われます。