SSMのポートフォワーディングがリモートホストに対応したので、これを使ってVPC内OpenSearchドメインのOpenSearch Dashboardに、VPC外から接続してみる。
やりたいこと
最小限のリソース構成でVPC内ドメインのDashboardにアクセスしたい。
ステップバイステップ
1. AWS CLIをアップグレード(手元端末)
> brew upgrade awscli
2. Session Managerプラグインをインストール(手元端末)
こちらを参照。
3. Foxy ProxyをFireFoxにインストール、設定(手元端末)
こちらを参照。
こんな感じになればOK。
Edit。ポートは任意。
Pattern。"http://"や"/_dashboards"を含まないFQDN部を書く。
ここまでで、端末側の準備は完了。Foxy Proxyはまだ有効化しなくてよい。
続いて、ポートフォワーディングのための中継EC2を準備する。
4. 中継EC2を立てる
プライベートサブネットで構わない。
留意点は以下の三つ。
- SSM Agent 3.1.1374.0以降が必要。
- 既存インスタンスを使う場合はSSM Agentをアップデートしておく。最新のAmazon Linux2であれば問題ない(2022年6月1日現在では、3.1.1476.0がプリインストールされていた)。
- yumでアップデートしてもいいが、SSM Run Commandで
UpdateSSMAgent
を更新する手もある。
- IAMポリシー
AmazonSSMManagedInstanceCore
が必要。- インスタンスプロファイルに、上記ポリシーを含むIAMロールを指定すること。
- OpenSearchドメインにアクセス可能なセキュリティグループが必要
- 一番簡単なのは、自らをソースとするIngressを許可するセキュリティグループを作り、EC2とOpenSearchドメインの双方に貼っておくこと。ポートは80/tcpが空いていれば今回の範囲ではOK。
5. VPCベースのOpenSearchドメインを用意する
これもプライベートサブネットに置けばよい。
ノードタイプやドメイン構成は任意だが、一点留意点として、HTTPS必須にしてしまうとcurlやブラウザでのアクセス時にエラーになってしまうということがある。
ここではチェックを外して、HTTPを許容しておく。
前述の通り、中継EC2からの80/tcpを許容する必要があるため、セキュリティグループには先程作成のものをOpenSearchドメインにも貼っておく。
これでクラウド側の準備も完了。
6. SSMポートフォワーディングを実行する(手元端末)
コンソールを開き、以下を実行する。
> aws ssm start-session --target i-00a8209ea0a39cfb2 \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"host":["<OpenSearchドメイン名>-<文字列>.ap-northeast-1.es.amazonaws.com"],"portNumber":["80"],"localPortNumber":["8157"]}'
Starting session with SessionId: xxxx-aaaabbbbccccdddd
Port 8157 opened for sessionId xxxx-aaaabbbbccccdddd.
Waiting for connections...
7. APIをテスト(手元端末)
別のコンソールウィンドウを開いて、まずAPIエンドポイントをテストする。
ローカルホストと指定ポートに接続すること、およびHTTPを使用しているのがポイント。
> curl -XGET http://localhost:8157/_cat/indices
green open .kibana_2 y-kg8WrFTfebCwq4xmPR1g 1 0 5 0 11.5kb 11.5kb
green open .kibana_1 ENzsA_19TqaUTNORy2EMUQ 1 0 4 0 17.2kb 17.2kb
ここでタイムアウトする場合は、セキュリティグループの設定を見直してみることをお勧めする。
また、疲れているとついlocalhostではなく宛先のFQDNを指定してしまったり、:8157を付け忘れたりして、時間を溶かすことがあるので注意(自分だけか。。。)。
8. Foxy Proxyを有効化(手元端末)
FireFoxの右上にあるFoxy Proxyのアイコンから、"Use Enabled Proxies by Patterns and Order"を選ぶ。
9. OpenSearch Dashboadに接続(手元端末)
URLに http://localhost:8157/_dashboards/ を入力する。
無事成功。
まとめ
SSHの併用なしで、シンプルに構成できるようになったのはありがたい。
注意点としては、何も制限をかけないと「誰でも・どこからでも」プライベートサブネットのリソースにアクセスできるようになってしまうので(これはOpenSearch/OpenSearch Dashboardに限らず、SSMのポートフォワーディング、もっというとSSMセッションマネージャ自身が以前から持っている特性ではある)、タグを用いてEC2やSSMドキュメントに適切に縛りをかけることが必須という点。便利機能がただのセキュリティホールになってしまわないよう、注意深く設計する必要がある。
また、ポートフォワーディングでローカルホストに接続する関係上、HTTPS接続がサーバー証明書エラーになってしまう。curlなら--insecureで片付くが、ブラウザは何度もクリックが必要だったり、そもそも受け付けてくれなかったりと使用感にだいぶ影響が出る。セキュリティルール上、HTTPS接続を必須としている場合は注意が必要かも。