AWS LamdbaからElasticSearchへアクセスする設定方法(それぞれVPC内に配置)

Lamdba関数を使って外のAPIを叩き、そのデータをElasticsearchへ流し込むという処理を作ろうと検討していたところ、
lambda関数からElasticsearchへ何か操作をする際、どのように接続しセキュリティを保つのか、考えものです。
色々な記事を見ていると、Lamdbaも、Elasticsearchも、VPC内への作成が可能になっているようです。
これを使い下記のような構成を取るように対応しました。
構成

が、Natゲートウェイを使用するので(vpc内のlamdbaから外部へアクセスするのに必要)、安くても約30ドル程かかります。
だったら、microインスタンスを上げたほうが良さそうですので、今回は、両方ともvpcから外し、iam認証によりlambdaからelasticsearchにアクセスしようと思います。
構成



ちなみにlamdba処理のコールは、cloudwatchを使って定期実行するものです。
https://qiita.com/RyujiKawazoe/items/64e8a65ab3e4909678fc

データ取得時は下記のような構成です。
構成

取得用は、cognitoかなんかで認証するか(VPC外の時)、パブリックサブネットに配置するなどして(VPC内の時)直接elasticsearchを叩けばいいかと思いましたが、せっかくなので、作成時と同様にlamdbaでelasticsearchへアクセスし取得しようと思います(lamdba呼び出しはAPI gatewayから)。

前提

Lamdba用のロールを作成

Lambdaから必要なアクセスは、デフォルトのlog書き込み等、Elasticsearch、VPC内にLamdbaを配置するためのポリシーが必要になります。

  • AWSLambdaBasicExecutionRole(lamdba作成時のdefaultのやつ)
  • AWSLambdaElasticsearchExecutionRole(Elasticsearchへのアクセス)
  • AWSLambdaVPCAccessExecutionRole(VPCへのアクセス)
    ※これは、VPC内に配置する際に使用するので、外に出す場合はもちろん必要ありません。


    これらのポリシーを持つロールを作成します。
  1. ロール作成
  2. 「使用するサービスを選択」で、Lamdbaを選択
  3. 「アクセス権限ポリシーをアタッチする」で、上記3つ(2つ)を検索し、チェックを入れる
  4. 次のページでロール名を入力して作成する
  5. 作成表示されるARNを控えておく(Elasticsearch側にこれを設定するため)
    iam role
    ※ここで、AWSLambdaVPCAccessExecutionRoleを追加しないと、VPC内にLamdbaを設定しようとする際に、怒られます。
    https://qiita.com/yoshidasts/items/a369f89d34f57ea67aad


Lamdba関数をVPC内に設定

lamdbaをVPC内に置かない場合は、ここは割愛する

ロールの設定

新規作成の場合は作成時のロール選択で、上記で作成したロールを指定します。既存の関数がある場合はそれを選択し、関数詳細画面で設定します。
lamdba role

VPC

VPC内にLambdaを配置すると、VPC内のサービスへの接続はとても簡単ですが、インターネットに疎通させようとした時に、外に出られないので、ちょっと設定が必要です。
VPC、サブネット、Natの割当
https://qiita.com/kojiisd/items/a15c1807c5c6bb08add0
こちらを参考

サブネットはプライベートサブネットを指定する
lamdba vpc

Elasticsearchを起動

※ ここはVPC内に配置しない場合は、パブリック・アクセスにし、アクセスポリシーを設定します。VPC内に配置する際は、同一VPC内からのみアクセスできなくなるので、アクセスポリシーは特に設定しなくてもいいかと思います。

手順に沿って設定していきますが、VPCのところで、Lamdbaに設定したVPCやサブネット、セキュリティグループを指定します。
es vpc

アクセスポリシーを「1つ以上のAWSアカウントまたはIAMユーザーにアクセス許可….」を選択し、
es policy

ARNに先程作成したロールのARNを指定する
es arn

VPC内か外かで、上記どちらかを設定

これで起動します。

※Elasticsearchの起動時の設定詳細はこちらを参考に
https://dev.classmethod.jp/cloud/aws/cm-advent-calendar-2015-getting-started-again-amazon-es/


まとめ

本来は同一vpc内に配置すべきかとは思いますが、ラーニングコスト面等を考え、外に出し、iam認証の設定をしました。
lamdba関数で、elasticsearchへの接続し、index作成とデータの取得については、別の記事で記載しようと思います。