VPC内にElasticsearchを配置する際の注意点


VPC内のプライベートサブネットにElasticsearchを置いたはいいけど、LambdaからAPI叩けないしKibanaにもアクセスできなくて困ったときのメモです。

解決策

  • BastionServerとして同VPC内にEC2(パブリックサブネット)を置く
    • EC2にSSH接続してダイナミックフォワードを行う(ダイナミックフォワードあまりわかっていない...)
  • Lambdaを同じVPC内に置く
    • 仕様によってプライベートかパブリックかを選択する
  • それぞれのリソースに適切なセキュリティグループ(後述)を設定する

セキュリティグループ設定

EC2

  • アクセス元IPアドレス(ローカルマシン)から22ポートへのトラフィック許可

  • アクセス元IPアドレス(ローカルマシン)から8157ポートへのトラフィック許可

Lambda

  • 今回は特に設定は不要(仕様による)

Elasticsearch

  • Lambdaにアタッチしたセキュリティグループから443ポートへのトラフィック許可

  • EC2のプライベートIPアドレスから443ポートへのトラフィック許可

ハマりポイント

ElasticsearchのアクセスコントロールでEC2のプライベートIPを許可しようとしたが以下のエラーが出ました。

UpdateElasticsearchDomainConfig: {"message":"You can’t attach an IP-based policy to a domain that has a VPC endpoint. Instead, use a security group to control IP-based access."}

解決策が見つからず2時間くらいはまりましたが、ちゃんと公式に書いてありました。

VPCs ではセキュリティグループを通じてドメインへのアクセスを管理できます。多くのユースケースでは、このセキュリティ機能の組み合わせで十分となり、ドメインにオープンなアクセスポリシーを安心して適用できます。

Amazon Elasticsearch Service ドメインの VPC サポート - Amazon Elasticsearch Service

どうやらセキュリティグループでの制限で十分のようです。

つまりVPC内にElasticsearchを置くケースだとオープンアクセスを選択しておいて、アタッチしているセキュリティグループのみでアクセスの制限を行う形になります。

 

参考