Upgrade to Pro — share decks privately, control downloads, hide ads and more …

EC2 Instance Connect Endpoint をCDKで使い倒そう

kazuho cryer-shinozuka
September 25, 2024
160

EC2 Instance Connect Endpoint をCDKで使い倒そう

2023年6月にEC2 Instance Connect Endpointがリリースされました。これはVPC内のEC2インスタンスに対するSSHまたはRDP接続が、容易に実現できるサービスです。
CDK公式でのL2コンストラクトは存在していませんでしたが、2024年5月にコミュニティ主導のCDKコンストラクトライブラリであるopen-constructsにてL2が使用可能になり、非常に簡単にEIC Endpointを作成することができるようになりました。

このセッションでは実際にプライベートサブネット上のEC2インスタンスへのSSH接続を行う例に加え、RDSへのDB接続もEIC Endpointを介して行えることをCDK実装例も併せて紹介します。

kazuho cryer-shinozuka

September 25, 2024
Tweet

Transcript

  1. 自作 ニキシー管温湿度気圧計 (シュタゲのあれです) クライヤー篠塚 一帆 @nixieminton @badmintoncryer 事業会社でうすーくひろーく ソフトウェアエンジニアをしています。 AWS

    Community Builder (Dev Tools) AWS CDK Community Reviewer AWS CDK Top Contributor 73 contributions 30 / 1476 contributors AWS SAPro / IPA SC, ES バドミントンと電子工作が好きです! キャリア18年! 毎年全国大会出てます 2 年末に子どもが産まれました 育休が終わってしまって悲しい ...
  2. EC2 Instance Connect(EIC) Endpoint 5 Network Interface VPC内のEC2インスタンスに対して SSH, RDP接続を確立できるエンドポイントサービス

    特徴 • Internet Gateway不要 • EC2インスタンスへのPublic IPアタッチ不要 • VPC内からInternetへのアクセス経路不要 ◦ SSM Session Managerとの差別化 • 無料! 制約 • 1VPCに1つまで • ENIからEC2インスタンスへのSecurity Group 穴あけが必要 • port22(SSH), 3389(RDP)のみ利用可能 SSH
  3. open-constructs/aws-cdk-library 8 コミュニティ主導のAWS CDKコンストラクトライブラリ 元Core Contributorの方やgoto-kさんが運営 提供されているL2 - Cost and

    Usage Report (CostReport) - EC2 (EIC Endpoint) @badmintoncryer In Review - RedShift Serverless (Namespace, Workgroup) @mazyu36 - FSx (NetApp ONTAP FileSystem) @badmintoncryer - Route53 (ResolverEndpoint) @winteryukky - Route53 (SplitHorizonDns)
  4. EIC EndpointをCDKで作成 9 (i) aws/aws-cdkのL1 (ii) open-constructs/aws-cdk-libraryのL2 import * as

    ec2 from 'aws-cdk-lib/aws-ec2' declare const vpc: ec2.IVpc; declare const instance: ec2.IInstance; declare const eicSg: ec2.ISecurityGroup; // EIC EndpointのL1コンストラクト new ec2.CfnInstanceConnectEndpoint(this, "EicEndpoint", { subnetId: vpc.privateSubnets[0].subnetId, securityGroupIds: [eicSg.securityGroupId], }); // EIC EndpointからEC2へのSSHを許可 instance.connections.allowFrom(eicSg, ec2.Port.tcp(22)) import * as ocf from '@open-constructs/aws-cdk' import * as ec2 from 'aws-cdk-lib/aws-ec2' declare const vpc: ec2.IVpc declare const instance: ec2.IInstance // EIC EndpointのL2コンストラクト const eicEndpoint = new ocf.aws_ec2.InstanceConnectEndpoint( this, 'EicEndpoint', { vpc }, ); // EIC EndpointからEC2へのSSHを許可 eicEndpoint.connections.allowTo(instance, ec2.Port.tcp(22)); L2ならVPCを渡すだけでお手軽に作成可能! サブネットIDとセキュリティグループIDが必要 VPCのみでOK! L2コンストラクトがconnectionsを持っており、 セキュリティグループを明示的に扱わずに済むのも嬉しいポイント
  5. EC2インスタンスにアクセス 12 import * as ocf from '@open-constructs/aws-cdk' import *

    as ec2 from 'aws-cdk-lib/aws-ec2' declare const vpc: ec2.IVpc declare const instance: ec2.IInstance // EIC EndpointのL2コンストラクト const eicEndpoint = new ocf.aws_ec2.InstanceConnectEndpoint( this, 'EicEndpoint', { vpc }, ); // EIC EndpointからEC2へのSSHを許可 eicEndpoint.connections.allowTo(instance, ec2.Port.tcp(22)); new cdk.CfnOutput(this, 'InstanceId', { value: instance.instanceId, }); ① CDK実装 ② AWS CLIでSSH接続 Instance IDを出力 インターネット非公開のEC2にスムーズにアクセス
  6. RDSにアクセス 15 const auroraCluster = new rds.DatabaseCluster(this, 'Aurora', { //

    ポートを3389に変更 port: 3389, ..., }); const eicEndpoint = new ocf.aws_ec2.InstanceConnectEndpoint( this, 'EicEndpoint', { vpc } ); // EIC Endpoint -> Aurora ClusterへのSecurity Groupの穴あけ eicEndpoint.connections.allowTo( auroraCluster, ec2.Port.tcp(3389), ); // DB Endpoint (プライベートIPの取得に用いる ) new cdk.CfnOutput(this, 'AuroraEndpoint', { value: auroraCluster.clusterEndpoint.hostname, }); // EIC EndpointのID new cdk.CfnOutput(this, 'EicEndpointId', { value: eicEndpoint.instanceConnectEndpointId, }); ① CDK実装 ② RDSのプライベートIPを取得 ③ AWS CLIでトンネルを張る
  7. FAQ 18 RDSへの通信以外にも活用可能ですか? - はい VPC内のプライベートIPとlistenしているポート(22 or 3389のみ) が分かれば可能です RDSへの通信は裏技感ありますが、

    積極的に活用したほうが良いですか? - おそらくいいえ リリース当初は全ポートが開放されていましたが、一瞬で22,3389以外 closeされました。AWS的には大人しくEC2へのSSH or RDPとしてのみ使っ てほしいのだと思います。 EIC Endpoint上で通信内容も分かるため、 AWSが本気を出せばRDPかそれ以外の通信か判別できるはずです。
  8. まとめ 19 CDKで簡単にEIC Endpointが作成可能 - open-constructsのL2がおすすめ - open-constructsへのL2追加もぜひ! EIC Endpoint経由でEC2やRDSにアクセス

    - 「private subnet上に設置 & VPC外への通信経路なし」という 隔離されたインスタンスでも容易に接続可能 - listenするポートを3389にしてしまえば、 SSH, RDPに限らずあらゆる通信をプロキシ可能 完全無料で VPCへのアクセス経路を確立できるので、様々なユースケースがあるはずです。 ぜひCDKで構築&活用してみてください!