Internet-facing Elasticsearch を IAM Role で Lambda からのアクセスに制限する方法

2020年04月06日
投稿者:岩佐 孝浩
カテゴリ:Amazon Web Services, Elasticsearch, IAM, Lambda タグ:
Elasticsearch

Internet-facing Elasticsearch を IAM Role で Lambda からのアクセスに制限する方法

鈴木商店の岩佐です。
Amazon Elasticsearch Service は、 VPC に設置することが可能かつ推奨されていますが、同時に NAT Gateway (or NAT Instance) も必要となります。
NAT Gateway はそこそこのコストがかかるため、プロジェクトのコスト要件を踏まえると採用できない可能性があります。
NAT Instance を低価格のインスタンスタイプで構築することも可能ですが、 NAT Instance 自体が SPOF (単一障害点) となるため、あまりお勧めできません。

このような場合、 Elasticsearch ドメインをパブリックに配置しつつ、Lambda + IAM Role でアクセスを制限することにより、一定程度のセキュリティを担保できます。(ただし、 Elasticsearch ドメインに対する DDoS の懸念は残ると考えられるため、注意・検証が必要です)

備忘録も兼ねて残しておきます。

AWS リソース作成

前提

プロジェクト作成

以下の構成でプロジェクトを作成して下さい。

AWS SAM Template

AWS SAM Template を template.yaml というファイル名で作成します。

Python コード作成

lambda_function.py
requests_aws4auth を使用して、認証ヘッダーを生成しています。
その他は、特筆すべきポイントの無いオーソドックスなコードです。

requirements.txt
boto3 は Lambda 実行環境に既にインストールされているため、含めないことをお勧めします。(パッケージサイズが無駄に増えます)

Build and Deploy

パッケージングに必要なS3バケットを事前に作成しておいて下さい。

Elasticsearch ドメインの作成は10分~20分程度かかります。

Lambda でアクセス確認

テストイベント設定

まずは、テストイベントを設定します。

Lambda


適当なイベント名を入力して、テストイベントを作成します。
(ペイロードは使用しないため、そのままでOKです)

Lambda

テスト実行

アクセスできることが確認できます。

Lambda

curl でアクセス確認

curl だとアクセスできないことが確認できます。

Stack 削除

今回作成した CloudFormation Stack を削除して下さい。

まとめ

原則として Elasticsearch は VPC Private Subnet に配置し、NAT Gateway と併用するのが最もセキュアです。
しかし、コストの制約により、どうしても Public にする必要がある場合は、Lambda + IAM Role でダイレクトアクセスを制限することが可能です。
ただし、最初に書いたとおり DDoS の懸念は残るため、お勧めできる構成ではないことに留意して下さい。
以上、お役に立てれば幸いです。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です