【AWS】LambdaをVPC内で実行し、EC2のMySQLにアクセスする

初めまして、4月より入社しました新入社員の笹山です。

前職はC#を主に触っていましたが、ギークフィードに入社してからAWSやWebフレームワークなど初めて触れるものが多く、刺激的な体験をさせてもらっています。

 

さて、初投稿のわりにニッチな課題解決かもしれませんが、今回はタイトルの通り「LambdaをVPC内で実行し、EC2のMySQLにアクセス」したいと思います。

最小構成なプロトタイプを作成する場合などに今回のケースのようなことがあるかもしれないので、備忘録として残しておきたいと思います。

 

やりたいこと

EC2のMySQL(MariaDB)にLambdaからアクセスし、特定のテーブルをSELECTして結果を取得したいと思います。

 

セキュリティの観点から、EC2が所属するVPCのセキュリティグループにおいて、MySQLへのアクセス許可は最小限に設定したいと思います。

そのためLambdaはEC2と同一のVPC内で実行する必要があります。

 

そもそもアンチパターン!?

以前まで、LambdaがEC2やRDSなどのVPC内オブジェクトにアクセスする場合、Lambdaは各々ENI(Elastic Network Interface)を作成、アタッチする必要がありました。

 

しかしこの方法には以下の問題があり、LambdaをVPC内で実行すること自体がアンチパターンとされていました。

  • コールドスタート時の遅延が非常に大きい
  • ENIがIPアドレスを消費する

 

幸い2019年にこれらの問題は解決され、現在ではアンチパターンとはされていません。

[発表] Lambda 関数が VPC 環境で改善されます

 

※とはいえ、Lambda + RDBMSの構成には同時接続数の問題もあるので、ユースケースに応じて構成は考える必要があります。

なぜAWS LambdaとRDBMSの相性が悪いかを簡単に説明する

 

構成

今回の構成要素は以下の通りです。

AWS EC2 Amazon Linux
AWS Lambda Node.js
DB MariaDB

 

EC2の準備

テストデータの作成

EC2のMariaDBで以下のユーザとテーブルをテスト用に作成します。

今回はユーザーとしてlambda_sample、テーブルとしてsample.userを作成しました。

 

なお、Lambdaは基本的には固定IPを持たないため、接続用のユーザーのホストにはワイルドカードを指定しておきます。(固定IP持たせる方法もあるらしいですが)

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

EC2インスタンスでMySQLへのアクセスを許可します。

VPCおよびサブネットに関してはEC2作成時のデフォルトをそのまま使用します。

 

1.EC2インスタンスの概要からセキュリティグループのコンソールを開きます。

2.インバウンドルールのタブを開き、「インバウンドルールの編集」をクリックします。

3.「ルールを追加する」でタイプ[MYSQL/Aurora]のルールを追加します。

 

このとき、ソースを「0.0.0.0」などにすると不正な場所からのアクセスも許可してしまうので、同一VPCからのアクセスのみ許可するように自身のセキュリティグループIDを指定します。

Lambdaの準備

Node.js用MySQLモジュールのインストール

続いて、Lambda関数で使用するNode.jsのMySQLモジュールをローカル環境でインストールします。

 

私はWSLのUbuntu 18.04 LTSでNode.jsのインストールからしました。

 

完了すると以下のようにMySQL関連のモジュール群ができるので、後でLambdaで読み込むためにこれをzip化しておきましょう

WSLのファイルシステムへは、Windowsエクスプローラーから「\\wsl$」でアクセスできるので、今回はエクスプローラーからzipしました。

 

Lambda関数の作成

まずはLambdaをVPC内で実行するために以下の準備をしておきます。

  1. Lambdaの実行ロールに「AWSLambdaVPCAccessExecutionRole」というポリシーをアタッチ。
  2. LambdaのVPCの項目を編集してターゲットとなるEC2のVPC, サブネット、セキュリティグループを設定。

 

関数には先ほど作成したMySQLモジュール群のzipをアップロードしておきます。

では、index.jsを新規作成して処理を書いていきます。

 

実行

できました!

 

まとめ

「VPC LambdaでEC2のMySQL(MariaDB)にアクセスする」ために大まかに以下のことやってきました。

  • EC2のセキュリティグループでMySQL用のポートを開ける
  • LambdaにVPC実行用ポリシーのアタッチ、およびVPCの設定をする

今後も使うかどうかはなんとも分かりませんが、AWSもNode.jsも初心者なので色々勉強にもなりました。

この記事が気に入ったら
いいね ! しよう

Twitter で

【採用情報】一緒に働く仲間を募集しています

採用情報
ページトップへ