BeeX Tech blog

BeeXではクラウドネイティブアプリ開発、企業の基幹クラウド基盤構築、システム移行、運用保守を行っています。

AWS Client VPNを構築するTerraformテンプレートのご紹介

はじめに

こんにちは、半田(@handy)です。  

検証をしているとちょっとだけPrivate Subnet上のEC2にアクセスして設定内容を確認したいケース等がたまに出てくることがあります。

プライベートなEC2にアクセスする方法としては以下の3つがよく挙げられるのではないかと思います。

  • 踏み台サーバ
  • Session Manager
  • AWS Client VPN

鍵の管理などを考えると、通常であればSession Managerを利用するのが最適だとは思いますが、Session Managerが事前にセットアップされているか分からない環境だと以下のような確認をする必要があり、手早く確認したいときには少し手間がかかってしまいます。

  • SSMエージェントがインストールされているか
  • EC2にIAMロールがアタッチされているか
  • SSMエンドポイントが作成されているか
    ...

かといって、わざわざPublic Subnetに踏み台サーバを構築するのも手間的にもセキュリティ的にもやりたくありません。

そんなときにDockerとAWS認証情報があればてっとり早くAWS Client VPNを既存環境に構築することができるTerraformテンプレートを作成しましたので、紹介したいと思います。

 

テンプレート

テンプレートはGitHubで公開しています。

WSL(ubuntu)とPowerShellでコマンド実行できるところまでは確認しています。

 

github.com

 

構築構成

テンプレートを利用すると以下の構成が構築されます。
※VPCとPrivate Subnetは既存リソースを利用します



 

構築方法

構築方法としてはGitHubのREADMEに記載しているコマンドを実行するだけで良いのですが、実行時の構成としてはDockerコンテナ上でTerraformコマンドが実行されるようにしました。

自分はローカルの別フォルダーでもTerraformコードを使用しているのですが、そちらはtfenvでバージョン管理をしており、実行フォルダを変更する度にローカルのTerraformバージョンを切り替えるのが面倒というのが主な理由です。
また、DevContainerを利用する方法も考えましたが、DevContainerが使用できない環境でもデプロイできるようにしたいのもあり、このような構成にしました。



 

ポイント

今回はAWS Client VPNの認証に証明書による相互認証を使用したのですが、その場合はローカルでの各種証明書の作成を行う必要があります。


docs.aws.amazon.com

また、VPNエンドポイント作成後は「クライアント VPN エンドポイント設定ファイル」をダウンロード・一部修正を実施して、VPNクライアントツールに設定する必要があります。

そのため、VPNクライアントツールの設定以外の部分はBashスクリプトを作成して、極力自動化するようにしました。
このBashスクリプトもDockerコンテナ上で実行されるため、コマンド実行がWSLでもPowerShellでも挙動が変わらないように工夫しています。

 

おわりに

元々は自分用にカスタマイズしたAWS Client VPN構築用Terraformコードを実装していたのですが、社内のメンバーから共有してほしい要望をいただいたので、せっかくなので汎用的になるように作り直してみました。

この記事の内容がどなたかの参考になれば幸いです。