AWS Lambda から Amazon Elastic File System にアクセスできるようになりました!!!

記事タイトルとURLをコピーする

はじめに

こんにちは、技術1課の山中です。 やっぱり季節的に雨が多いですね〜、雨の日は晴れた日に元気で遊ぶための充電と仕事をがんばろうとおもいます。 というのはさておき! 今回はこのアップデートについて見ていきます!

Amazon Elastic File System の AWS Lambda サポートが一般利用可能に

AWS Lambda から Amazon Elastic File System (Amazon EFS) にアクセスできるようになりました! このアップデートで、同時実行する AWS Lamda 関数間や Amazon EC2 、 Amazon ECS 等でのファイル共有が格段にやりやすくなりそうです。

Amazon EFS とは

Amazon EFS とは、 NFS アクセスを提供する完全マネージド型の分散ストレージサービスです。 複数の Amazon EC2 インスタンスから NFS を使ってネットワーク経由でファイルにアクセスできます。

Amazon EFS(EC2 用フルマネージド型ファイルシステム)| AWS

NFS とは

NFS (Network File System) とは、ネットワーク上のコンピュータが持つストレージを共有するための仕組みの 1 つで、 Linuxなど UNIX 系 OS の多くに標準で組み込まれています。

NFS はネットワークを介して、サーバ上のストレージ領域をローカルストレージと同様にマウントして利用できることが特徴です。

料金

Amazon EFS は、使用したリソース分に対する従量課金となっています。 具体的な料金についてはストレージクラスによって変わってくるため、詳細は以下を参照ください。

料金 - Amazon EFS | AWS

今回のアップデート

今回のアップデートで AWS Lambda から Amazon EFS のファイルシステムにアクセスできるようになりました。 これで一体何が嬉しいのでしょうか。 考えられるメリットは以下のようなところです。

512 MB を超えるファイルの操作が可能

AWS Lambda では、関数実行時の一時的なファイルストレージとして 512 MB の /tmp 領域 を利用できます。 ただ、512 MB という制限からこれまで GB 単位で容量を使用する機械学習のモデル計算などは AWS Lambda で扱うことができませんでした。 今回のアップデートで Amazon EFS が AWS Lambda から利用できるようになったので、 /tmp ストレージの制限で断念していたケースでも AWS Lambda を利用できるようになります。

データの一貫性が保てる

AWS Lambda とよく組み合わせて使うストレージサービスとしては Amazon S3 が一番多く利用されていると思います。 Amazon S3 は結果整合性なので、更新と取得のタイミングによっては古いデータを取得する可能性があり、もしデータの一貫性を保ちたい場合は、一貫性を考慮したアーキテクチャを考えなければなりませんでした。 AWS Lambda からアクセスするストレージサービスとして Amazon EFS が追加されたことによって、データの一貫性を保つための選択肢が増えることになります。

他にも Amazon EFS を利用できるようになって得られるメリットはあると思いますが、とはいえ全てのデータを Amazon EFS を通して処理するのではなく 必要に応じて利用していく ことが大切です。

アップデート内容の確認

早速 AWS Lambda から Amazon EFS のストレージにどのようにアクセスするのか、確認していきましょう。 今回は確認用に以下のような構成を作成していきます。

また、 AWS Lambda から Amazon EFS を利用するために以下の点に注意が必要です。

  • EFS アクセスポイント が必要
  • Amazon EFS は AWS Lambda 関数と同一リージョンに作成する必要がある
  • AWS Lambda は VPC の中に作成する必要がある

AWS Lambda 用セキュリティグループの作成

Amazon EFS にアクセスする AWS Lambda 関数用のセキュリティグループを作成します。 このセキュリティグループについては、デフォルトのままで構いません。 ※ インバウンドルールなし、アウトバウンドルール全開放

Amazon EFS 用セキュリティグループの作成

Amazon EFS のセキュリティグループを事前に以下で作成します。

タイププロトコルポート範囲ソース
NFSTCP2049AWS Lambda のセキュリティグループ ID を指定

Amazon EFS の作成

Amazon EFS は、以下の 4 ステップで作成できます。

  1. ネットワークアクセスを設定する
  2. ファイルシステムの設定を行う
  3. クライアントアクセスを設定
  4. 確認と作成

まずは、ネットワークアクセスの設定です。 AWS Lambda を作成する対象の VPC を選び、マウントターゲットでサブネットを選択します。 セキュリティグループでは、先ほど作成した EFS 用のセキュリティグループを選んでいます。

続く、ファイルシステムの設定では、 Name タグだけ設定し他の設定項目はデフォルトのまま次の画面へいきます。 クライアントアクセスの設定画面では AWS Lambda からアクセスするための アクセスポイントの作成 を行います。 画面下の アクセスポイントの作成 ボタンをクリックし、以下を入力します。

項目
名前data
ユーザー ID1001
グループ ID1001
パス/data
所有者ユーザー ID1001
所有者グループ ID1001
アクセス許可750

所有者セクション でディレクトリの権限を 750 にしているので、所有者はファイルの読み取り、書き込み、実行が可能で、同じグループのユーザーは読み取りが可能ですが、他のユーザーはアクセスできません。 最後の画面で設定項目の確認をして、 Amazon EFS を作成します。

これで Amazon EFS の作成は完了です。あっという間ですね。

AWS Lambda の作成

続いて、 AWS Lambda 関数を作成していきます。

IAM ロールの作成

まずは AWS Lambda 関数に付与する IAM ロールを作成します。 今回は以下ポリシーを付与した IAM ロールを作成します。

  • AWSLambdaVPCAccessExecutionRole
  • AmazonElasticFileSystemClientReadWriteAccess
  • CloudWatchLogsFullAccess

AWS Lambda 関数の作成

続いて AWS Lambda 関数を作成します。 作成時に、作成済の IAM ロールを指定してください。 関数が作成されたら VPC の設定を行います。 Amazon EFS 作成時のマウントターゲットで指定したサブネット及び事前に用意しておいた AWS Lambda 用のセキュリティグループを指定します。 続いて、ファイルシステムの設定です。 新たに ファイルシステム という設定項目が追加されているので、 ファイルシステムの追加 をクリックし設定を行います。 ファイルシステムの追加画面で、作成した Amazon EFS 及びアクセスポイント、ローカルマウントポイントを指定して保存します。 今回は、 AWS Lambda から Amazon EFS 上にファイル serverworks.txt を作成 / 書き込みして、保存するということを試してみます。 AWS Lambda のコードは以下のようにしました。

file_path = '/mnt/data/'

def lambda_handler(event, context):
    # ファイル名を定義
    file_name = 'serverworks.txt'
    # 書き込む内容を定義
    write_string = event['text']

    # 書き込み
    with open(file_path + file_name, mode='w') as f:
        f.write(write_string)

    # 読み込み
    with open(file_path + file_name) as f:
        print(f.read())

これで AWS Lambda 関数の作成も完了です。

試してみる

早速作成した AWS Lambda 関数から Amazon EFS へのデータ読み書きができるのか試していきましょう。 先ほどの AWS Lambda のコンソールからテストイベントを作成し実行してみます。 成功しました!! Amazon EFS のセキュリティグループを変更し、念の為 Amazon EC2 インスタンスからも覗いてみます。 以下 Amazon EC2 のマウント手順に従い、マウントを行います。

$ sudo yum install -y amazon-efs-utils

$ sudo mkdir efs

$ sudo mount -t efs fs-xxxxxxxx:/ efs

$ ls -l
drwxr-xr-x  3 root     root     6144  6月 22 07:39 efs

$ sudo ls -l efs/data
-rw-rw-r-- 1 1001 1001 24  6月 22 07:47 serverworks.txt

$ sudo cat efs/data/serverworks.txt
This text from Lambda!!!

指定した文字列がきちんと書き込まれていることがわかりました!!!

おわりに

AWS Lambda から Amazon EFS が利用できるようになり、データの永続化や異なるサービス同士のファイル共有など、アーキテクチャの幅が広がりそうです。

また、この内容は 2020/6/24(水) 12:00 よりYouTube Liveで配信する「30分でわかる AWS UPDATE!」で取り上げますますので、是非ご覧ください!

参考