- パブリックサブネットにEC2インスタンスを構築し、セキュリティグループでアクセス制限を行っている方
- EC2インスタンスへのSSH接続やHTTP接続をよりセキュアに行いたい方
プライベートサブネット上にEC2インスタンスを構築し、EC2インスタンスにNginxをインストールする。
Session Managerを利用して以下を実現する。
- ローカル端末からプライベートサブネット上のEC2インスタンスへSSH接続する。
- ローカル端末からプライベートサブネット上のEC2インスタンス上にインストールしたNginxにHTTP接続する。
構築するシステム構成は以下の通り
黒線がデータの流れを示し、点線がデータ制御を示す。
「VPC Endpoint Network Interface」は以下の3つのエンドポイントを利用する。
このエンドポイントはSession Managerと通信を行うために利用する。SSM AgentよりHTTPSのインバウンドルールを有効にすることで、Session Managerと通信を行うことが可能。
- com.amazonaws.ap-northeast-1.ssm
- com.amazonaws.ap-northeast-1.ssmmessages
- com.amazonaws.ap-northeast-1.ec2messages
「VPC Endpoint Gateway」は以下のエンドポイントを利用する。
以下のエンドポイントを利用することで、Amazon Linux2 AMI リポジトリをホストする S3 バケットへのトラフィックを許可することが出来、そのリポジトリに対して「yum update」等のコマンドを実行することが可能となる。
- com.amazonaws.ap-northeast-1.s3
- ローカル端末にTerraformをインストール
- ローカル端末にAWS CLIをインストール
- ローカル端末にSession Managerプラグインをインストール
- 以下の権限を有するIAMポリシーに紐づいたIAMユーザーを用意し、ローカル端末でAWS CLIでIAMクレデンシャル情報を設定する。
- AmazonEC2FullAccess
- IAMFullAccess
- AmazonSSMFullAccess
- AmazonRDSFullAccess
- SSH設定ファイルを更新
- 更新手順については、AWS公式ページを参考
- SSH設定ファイル(例:C:\Users<username>.ssh\config )に以下を設定する。
# SSH over Session Manager host i-* mi-* ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p"
- ローカル環境にpqslがインストールされていること
Windows に psql コマンドだけをインストールする手順については以下のURLを参照。
https://go-journey.club/archives/14411
※環境変数も設定すること。
- main.tfファイル直下に移動し、以下のコマンドを実行する
terraform init
terraform plan
terraform apply
- ローカル環境にてPowershellを起動し、インスタンスIDを確認する。
terraform show | Select-String -Pattern "id.*=.*i-"
- ローカル環境にてPowershellを起動し、以下のコマンドを実行する。 ※以下のコマンドを利用する際、インスタンスIDについては上記で確認した内容を記載すること
aws ssm start-session --target [インスタンスID]
- ローカル環境にてPowershellを起動し、以下のコマンドでポートフォワードを行う。これによりローカル端末からHTTP接続が可能となる。但し、ポート番号10080はブラウザで制限されているため、制限されていないポート番号を利用する。ポート番号9999は制限されていないため以下で利用している。 ※以下のコマンドを利用する際、インスタンスIDについては上記で確認した内容を記載すること
aws ssm start-session --target [インスタンスID] `
--document-name AWS-StartPortForwardingSession `
--parameters '{\"portNumber\":[\"80\"],\"localPortNumber\":[\"9999\"]}'
- ブラウザで以下のURLを検索する。
http://localhost:9999/
- ローカル環境にてPowershellを起動し、以下のコマンドを実行する。
aws ssm start-session --target [インスタンスID] `
--document-name AWS-StartPortForwardingSessionToRemoteHost `
--parameters '{\"host\":[\"[RDSエンドポイント名]\"],\"portNumber\":[\"5432\"], \"localPortNumber\":[\"15432\"]}'
- ローカル環境にてコマンドプロンプトを起動し、以下のコマンドを実行する。
psql -h localhost -p 15432 -U [ロール名] -d [DB名]
- 利用を終了したい場合、以下のコマンドで削除する
terraform destroy
https://dev.classmethod.jp/articles/terraform-session-manager-linux-ec2-vpcendpoint/#toc-1
MIT.