Node.js Lambda と EFS を使用して大きなサイズの S3 フォルダーとファイルを圧縮する
パク・ヒョンテク
Twigfarmのシニア・フルスタック・エンジニア
AWS S3 は非常に便利なクラウドストレージです。AWS CLI、SDK、API などでさまざまな方法で保存されたファイルをアップロードおよびダウンロードすることはできますが、フォルダ全体とそのサブフォルダやファイルを再帰的にダウンロードすることはできますか?注目すべきは、S3 にはそのような機能がないということです。フォルダーを再帰的に圧縮し、その zip ファイルをダウンロード可能にする独自の方法を開発する必要があります。
必要条件
目標は、フォルダ構造ツリーを保存しながら、フォルダ、サブフォルダ、およびファイル全体をS3バケットのフォルダの下に圧縮することです。ファイルは大きくなる可能性があります (Lambda の一時ストレージのサイズである 512 MB 以上)。
S3 へのファイルの保存方法
S3バケットに以下のようにフォルダを作成し、ファイルを保存しました。
ただし、簡潔に言うと、これらはS3内のフォルダーではありません。次のキーを含むファイルは 4 つだけです。
- folder1/sub1/image.png
- folder1/sub2/test.txt
- folder2/large.mov
- folder2/test2.pdf
解決策
Memories S3にはフォルダーの概念がなく、各ファイルのキーにはプレフィックスとしてフォルダー情報が付きます。各フォルダレベルは '/' で区切られ、ファイル名で区切られます。(つまり、folder1/sub1/image.png)
フォルダ情報プレフィックスの付いたキーを使用して、EFS にフォルダを作成し、S3 からファイルをダウンロードすることができます。
その後、Lambda は単純に圧縮を行い、その zip ファイルを S3 にアップロードします。次の図は、実装の順序と S3 と EFS でのファイルの用途を示しています。
覚えておくべきことの 1 つは、Lambda と EFS は同じ VPC 内にある必要があるということです。
EFS (エラスティックファイルシステム) とアクセスポイントの作成
Amazon EFS が便利な理由はいくつかあります。
- EFS は Linux ファイルシステムに似ています。次のようなファイルコマンドを使用できますか? mkdir、 ls、 CP、 rm、など。
- Lambdaの一時ストレージを使用できるサイズ制限は512 MB未満です
EFS を作成しましょう。に進んでください。 伸縮自在なファイルシステム AWS コンソールでクリックします ファイルシステムの作成。
次にクリック 作成。
次は、後でLambda関数で使用するアクセスポイントを作成します。先ほど作成したファイルシステムを選択します。次に、をクリックします。 アクセスポイント —> アクセスポイントの作成。
入力すべき入力値は次のとおりです。
- ルートディレクトリパス:/efs
- POSIX ユーザー
- ユーザ ID: 1000
- グループ ID: 1000
- ルートディレクトリ作成権限
- オーナーユーザ ID: 1000
- オーナーグループ ID: 1000
- ルートディレクトリパスに適用する POSIX 権限:0777
EFS にアタッチされた Lambda 関数を作成して設定する
次のように Node.js Lambda 関数を作成してみましょう。
Lambda 関数が作成されたら、をクリックします。 設定 —> ファイルシステム —> ファイルシステムの追加。
先ほど作成した EFS アクセスポイントを選択してください。そして、入れてください。 /mnt/efs ローカルマウントパス用。これは重要な理由からです。 /mnt/efs EFS フォルダになります。
クリック [保存]、これでアクセスできるようになりました /mnt/efs ラムダ関数から。
ラムダから S3 へのアクセス
VPC エンドポイント
https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints.html によると、
VPC エンドポイント 仮想プライベートクラウド (VPC) とサポート対象サービス間の接続。必ずしもインターネットゲートウェイ、NAT デバイス、VPN 接続、または AWS Direct Connect 接続を使用する必要はありません。
VPC 内の Lambda から S3 バケットにアクセスするには、S3 用の VPC エンドポイントを設定する必要があります。に移動してください。 VPC そしてクリック エンドポイント —> エンドポイントの作成。次に、次のように入力を選択します。
次にクリック エンドポイントの作成。VPC 内の Lambda に到達すると S3 にアクセスできるようになりましたが、特定の S3 バケットに実際にアクセスするにはもう 1 つの手順が必要です。
ラムダロール
Lambda ロールは Lambda 関数の作成中に作成されます。Lambda の既存のロールを使用できますか。ここでは、新しいロールを作成しました。Lambda 関数に移動し、をクリックします。 設定 —> パーミッション。次に、以下のロールを選択します 実行ロール。
次に、 権限ポリシー —> クリック 権限を追加 —> インラインポリシーの作成。次の画面で、を選択します。 JSON タブ。次に、以下をコピーして貼り付けます。YOUR_BUCKET_NAME を自分のバケット名に置き換えてください。
クリック レビューポリシー。好きなポリシー名を入力し、をクリックします。 ポリシーの作成。
その他のラムダ構成
処理時間とファイルサイズはメガバイト単位で測定できるため、Lambdaのデフォルトのメモリサイズ (128 MB) とタイムアウト (3 秒) では不十分です。この目的のために、メモリサイズとタイムアウトは 4096 MB と 2 分に設定され、節約されています。 設定 —> 一般的な構成。
ラムダコード
これが最終的な Lambda コードです。このコードは私たちが行ったことを実装しています。
- S3 から EFS にフォルダ/ファイルをコピーします。
- EFS に保存されているファイルを ZIP 形式で圧縮します
- ZIP ファイルを S3 にアップロードします
- 一時的な EFS ファイルの保存
コードデコミッシブが自滅することを願っています。1 つだけ言っておきたいのは、私たちが使ったのはオープンソースの Node.js パッケージという名前です。 アーカイバ フォルダとファイルの圧縮用。Node.js でファイルを圧縮する方法はたくさんあります。自分に合ったものを選ぶことができます。
あるべきだと言う トライ/キャッチ エラーケースを処理するためのブロック。しかし、ここでは簡単にするために省略しています。
結果
S3バケットを確認してみましょう。
ご覧のとおり、という名前の新しいzipファイルがあります my-archive.zip。ファイル名をクリックして、ファイルをダウンロードして解凍してみましょう。
フォルダとファイルの構造は、この記事の冒頭にあるものとまったく同じです。
S3でフォルダとファイルを圧縮するというこの単純な要件を実現するために従うべき手順はたくさんありましたが、AWSを扱う必要がある場合はかなり標準的です。
- AWS サービスの作成と起動
- 適切な権限を与える
- ロジックを実行する
慣れるまで少し時間がかかりました!:)
読んでいただきありがとうございます。