【AWS】LambdaからEFSにアクセスして操作する

LambdaからEFS上のファイルを操作する必要があったので、その設定方法をメモ書き。

まず、前提としてEFSはVPCの内側、Lambdaは外側にあるサービスなので、そのままでは当然アクセスすることができない。

解決策としてLambdaをVPCの中、さらにEFSがマウントポイントを貼っているSubnetの中に設置してやり、アクセスポイントで繋いでやることでLambda→EFSにアクセスすることが可能になる。イメージとしてはこんな感じ。

ではひとつひとつやっていきます。

Lambdaの設定の方ですが、VPC内のEFSにアクセスするために、LambdaをVPCの中に設置してやる必要があります。

まずはVPCの設定するためLambda実行ロールの権限の設定から。Lambdaの実行ロールは以下で確認、及び設定画面へ移動できます。

VPCの設定に必要な「AWSLambdaVPCAccessExecutionRole」、またついでにEFSへのアクセスに必要な「AmazonElasticFileSystemClientReadWriteAccess」、及びCloudWatchへのアクセス権「CloudWatchLogsFullAccess」も一緒に付与しておきます。

(ポリシー名)

  • AWSLambdaVPCAccessExecutionRole
  • AmazonElasticFileSystemClientReadWriteAccess
  • CloudWatchLogsFullAccess

そしてLambdaをVPCの中に設置する設定箇所がここの部分↓(※Lambda作成の手順に関してはここでは省略します)

ここでEFSが現状マウントされているEC2やFargateなどが存在するVPCとSubnetを指定してやります。今回はLambdaからEFSへアクセスするだけなので、セキュリティグループはインバウンド、アウトバウンド共に何もなしの内容で問題ない。

EFSがマウントされているSubnetは、EFS側の画面でも確認できます。

これで今↓のような感じで、LambdaがEFS(のマウントポイント)と同じ場所に配置された状態になります。

後はLambdaとEFSを繋いでいく作業になります。今回EFSは既にEC2などと繋いで利用している想定で、EFSをゼロから作成する部分の作業手順は他の記事に譲るものとします。

LambdaからEFSにアクセスするには、EFS側に「アクセスポイント」というインターフェイスが必要になります。EFSのマネジメントコンソールの画面では以下になります。こちらを作成してゆく。

入力する値は他の同様の記事にもある通り以下で指定します。ここの「パス」で指定したパスが、LambdaからEFSを操作する時の、EFS側のデフォルトパスとなります。

これでEFS側にLambdaからのアクセスを受けるアクセスポイントの作成まで完了しました。

今度はLambdaの方で、↑で作成したアクセスポイントを指定してファイルシステムのマウント設定を行います。「ファイルシステムID」で対象のEFSを選択、アクセスポイントIDに↑で作成したアクセスポイントのアクセスポイントIDを指定します(EFS側のアクセスポイント設定画面で確認可能)。「ローカルマウントパス」はLambda側のマウントパスになります。例えばここに「/mnt」と指定した場合、Lambdaの「/mnt」とEFSの「/data」ディレクトリがマウントされることとなり、例えばLambdaで「ls /mnt」を実行すると、EFS側の「/data」配下のファイルの一覧が表示される、という形になります。

ここまでくれば後は権限回りの設定のみで、以下の部分を設定していきます。

EFSのセキュリティグループにLambdaからのアクセスを許可するよう、LambdaのセキュリティグループのIDを指定します。EFSのセキュリティグループはコンソール画面の以下で確認可能。

LambdaのセキュリティグループIDは以下で確認可能でした。

これで以下の状態が完成したかと思います。お疲れ様でした!