Slide 1

Slide 1 text

EC2 Instance Connect Endpoint をCDKで使い倒そう -お手軽VPCアクセスの確立- JAWSUG CDK支部 #16 クライヤー篠塚 一帆 1

Slide 2

Slide 2 text

自作 ニキシー管温湿度気圧計 (シュタゲのあれです) クライヤー篠塚 一帆 @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 年末に子どもが産まれました 育休が終わってしまって悲しい ...

Slide 3

Slide 3 text

04 03 02 01 Introduction CDKでEIC Endpointを作成 EIC Endpointで EC2にアクセス EIC Endpointで DBにアクセス 3

Slide 4

Slide 4 text

04 03 02 01 Introduction CDKでEIC Endpointを作成 EIC Endpointで EC2にアクセス EIC Endpointで DBにアクセス 4

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

04 03 02 01 Introduction CDKでEIC Endpointを作成 EIC Endpointで EC2にアクセス EIC Endpointで DBにアクセス 6

Slide 7

Slide 7 text

EIC EndpointをCDKで作成 7 (i) aws/aws-cdkのL1コンストラクトで作成 (ii) open-constructs/aws-cdk-libraryのL2コンストラクトで作成

Slide 8

Slide 8 text

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)

Slide 9

Slide 9 text

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を持っており、 セキュリティグループを明示的に扱わずに済むのも嬉しいポイント

Slide 10

Slide 10 text

04 03 02 01 Introduction CDKでEIC Endpointを作成 EIC Endpointで EC2にアクセス EIC Endpointで DBにアクセス 10

Slide 11

Slide 11 text

EC2インスタンスにアクセス 11

Slide 12

Slide 12 text

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にスムーズにアクセス

Slide 13

Slide 13 text

04 03 02 01 Introduction CDKでEIC Endpointを作成 EIC Endpointで EC2にアクセス EIC Endpointで DBにアクセス 13

Slide 14

Slide 14 text

RDSにアクセス 14 MySQL(3306)やPostgreSQL(5432)のデフォルトポートはEIC Endpointの対象外....😓 そこで、RDSがlistenするポートを3389に変更する 荒業で乗り切ります

Slide 15

Slide 15 text

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でトンネルを張る

Slide 16

Slide 16 text

現在の状況 16 localhost:3306 DB_Endpoint:3389 localhost:3306 → DB_Endpoint:3389へのSSHポートフォワーディングを構築 SSHトンネル

Slide 17

Slide 17 text

RDSにアクセス 17 ④ DBクライアントツールでアクセス SSHポートフォワーディングで listenしている localhost:3306にアクセス GUIツールでDBへの管理アクセスを実現 接続設定

Slide 18

Slide 18 text

FAQ 18 RDSへの通信以外にも活用可能ですか? - はい VPC内のプライベートIPとlistenしているポート(22 or 3389のみ) が分かれば可能です RDSへの通信は裏技感ありますが、 積極的に活用したほうが良いですか? - おそらくいいえ リリース当初は全ポートが開放されていましたが、一瞬で22,3389以外 closeされました。AWS的には大人しくEC2へのSSH or RDPとしてのみ使っ てほしいのだと思います。 EIC Endpoint上で通信内容も分かるため、 AWSが本気を出せばRDPかそれ以外の通信か判別できるはずです。

Slide 19

Slide 19 text

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