Serverless Operations, inc

>_cd /blog/id_p88dtvn8y

title

AWS Lambda関数からAmazon S3 Files にマウントする方法

前回の記事では、 Amazon S3 Files の基本コンセプトを紹介しつつ Amazon EC2 インスタンス を NFS クライアントとして用いてマウントを行いました。

この記事では続編として AWS Lambda から使ってみます。

AWS Lambda と Amazon S3 Files

S3 Files は EFS をキャッシュレイヤとして搭載し、そのEFSがS3とSyncすることで、NFS4.1のフル機能を利用できるサービスです。EFS は Amazon VPC 内部に起動されるためそのアクセスもVPCから行われることがデフォルトになります。

一方 AWS Lambda 関数は VPC 外部にデフォルトでは起動するため、今回はVPC用Lamda関数を作る必要があります。

さっそくやってみる

まずは前回EC2 / NFSClient様に作成したIAMロールを変更しLambdaからも使えるようにします。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": {
				"Service": [
					"ec2.amazonaws.com",
					"lambda.amazonaws.com"
				]
			},
			"Action": "sts:AssumeRole"
		}
	]
}

またVPC内部用LambdaはEC2のNetworkInterfaceを作成する権利も必要ですので以下のパーミッションにしておきます。

次に、一度VPC用Lambda関数を作成します。内容はデフォルトのHello Worldで問題ありません。

先ほど修正したIAMロールをアタッチします

Advanced Settings でVPCを指定します。

関数が作成されるまで待ちます。通常のLambdaと異なり VPC Lambda はNICをアタッチさせる分少し時間がかかります。

作成された一度テスト実行を行い以下が出力されればOKです。

{
  "statusCode": 200,
  "body": "\"Hello from Lambda!\""
}

次に、S3 Files から Access Points を一度削除します。デフォルトで作成されているものは権限設定が正しく行われておらず、現時点では設定を編集できないようです。

そのあと Attach to a Lambda function を指定します。

先ほど作成されたLambda関数を指定してアタッチします。

Lambda関数側の設定、 configuration タブから File systems をクリックします。

Add file system をクリックします。

以下の様にS3 Files のマウント設定を行います。

Access Pointの設定がない場合、この時点で新しく作成されます。設定が存在していると必ずそれを指定する必要があります。

関数の中身を以下に変更して再度Deployを行い実行します。

import { writeFileSync, appendFileSync, existsSync } from 'fs';

export const handler = async (event) => {
  const mountPath = '/mnt/s3files';
  const filePath = `${mountPath}/lambda-test.txt`;
  
  const timestamp = new Date().toISOString();
  const message = `Hello from Lambda! - ${timestamp}\n`;

  try {
    // ファイルが存在すれば追記、なければ新規作成
    if (existsSync(filePath)) {
      appendFileSync(filePath, message);
    } else {
      writeFileSync(filePath, message);
    }

    return {
      statusCode: 200,
      body: JSON.stringify({
        result: 'success',
        message: `書き込み成功: ${filePath}`,
        content: message.trim(),
      }),
    };
  } catch (err) {
    return {
      statusCode: 500,
      body: JSON.stringify({
        result: 'error',
        message: err.message,
      }),
    };
  }
};
{
  "statusCode": 200,
  "body": "{\"result\":\"success\",\"message\":\"書き込み成功: /mnt/s3files/lambda-test.txt\",\"content\":\"Hello from Lambda! - 2026-04-11T04:58:04.674Z\"}"
}

前回の記事でNFS Clientととして設定したEC2でもファイルが確認できます。

{
  "statusCode": 200,
  "body": "{\"result\":\"success\",\"message\":\"書き込み成功: /mnt/s3files/lambda-test.txt\",\"content\":\"Hello from Lambda! - 2026-04-11T04:58:04.674Z\"}"
}

60秒ほど待つとS3バケットでもEFSの中身が同期され無事確認できます。

Written by
編集部

亀田 治伸

Kameda Harunobu

  • Facebook->
  • X->
  • GitHub->

Share

Facebook->X->
Back
to list
<-