Lambda デプロイパッケージをアップロードするときに「権限が拒否されました」または「モジュールをインポートできません」というエラーを解決するには、どうすればよいですか?

最終更新日: 2021 年 5 月 19 日

AWS Lambda デプロイパッケージをアップロードしようとすると、アクセス許可が拒否されたか、モジュールをインポートできないというエラーが表示されます。これらのエラーを解決するにはどうしたらよいですか?

簡単な説明

Lambda には、デプロイパッケージのコードファイルおよび依存ライブラリに対するグローバルな読み取り権限が必要です。Lambda デプロイメントパッケージが正しいセキュリティアクセス許可で構成されていない場合、ファイルをアップロードしようとすると Lambda はエラーを返します。これらのパーミッションが拒否されモジュールをインポートできないエラーは、デプロイパッケージが継続的インテグレーションアプリケーションによって作成されたときに最も一般的に発生します。

Lambda デプロイメントパッケージ内のすべての実行可能ファイルの正しい権限は、UNIX パーミッションの数値表記では 644 です。デプロイパッケージ内のフォルダの場合、正しいアクセス許可設定は 755 です。

注: Lambda は POSIX パーミッションを使用するため、Lambda デプロイパッケージを構築するときは POSIX 準拠のオペレーティングシステムを使用することをお勧めします。例えば、Linux、Unix、macOS などです。構築環境の権限モデルと Lambda's runtime の権限モデルが同格の場合、権限問題が発生する可能性が低くなります。

開発に Windows を使用していて、権限問題を解決する必要がある場合は、次のいずれかを実行して Linux 環境を設定できます。

解決方法

エラーの原因となっているファイルまたはフォルダを確認する

Lambda 関数コードの作成に使用しているプログラム言語によっては、エラーメッセージでのエラーの原因が明らかではない場合があります。

例えば、Node.js 関数のエラーメッセージには、エラーの原因であるファイルまたはフォルダの名前が表示されます。しかし、Python 関数のエラーメッセージには、エラーの原因であるファイルまたはフォルダの名前は表示されません。

Node.js Lambda 関数のアクセス許可が拒否されたエラーの例

{
  "errorMessage": "EACCES: permission denied, open '/var/task/index.js'",
  "errorType": "Error",
  "stackTrace": [
    "Object.fs.openSync (fs.js:641:18)",
    "Object.fs.readFileSync (fs.js:509:33)",
    "Object.Module._extensions..js (module.js:578:20)",
    "Module.load (module.js:487:32)",
    "tryModuleLoad (module.js:446:12)",
    "Function.Module._load (module.js:438:3)",
    "Module.require (module.js:497:17)",
    "require (internal/module.js:20:19)"
  ]
}

Python Lambda 関数がモジュールをインポートできないエラーの例

Unable to import module 'index': No module named index

Python Lambda 関数が必要なパーミッションがない外部ライブラリのモジュールエラーをインポートできない例

Unable to import module 'index': No module named requests

デプロイパッケージ .zip ファイル内のすべてのファイルとフォルダのアクセス許可を確認するには、コマンドラインインターフェイス (CLI) で次の zipinfo コマンドを実行します。
重要: lambda-package.zip をデプロイパッケージの .zip ファイル名に置き換えます。

zipinfo lambda-package.zip

Zipinfo コマンドレスポンスの例

Archive:  lambda-package.zip
Zip file size: 305 bytes, number of entries: 1
-r--------  3.0 unx      188 tx defN 21-Feb-13 20:48 example.py
1 file, 188 bytes uncompressed, 135 bytes compressed:  28.2%

注: この例では、 example.py のパーミッションが -r-------- 、または UNIX パーミッションの数値表記では 400 なので、ファイルのパーミッションを 644 にアップデートする必要があります。

デプロイパッケージの権限を修正する

注: 次のコマンドは、Linux、UNIX、および macOS オペレーティングシステムでのみ機能します。

1.    デプロイパッケージ内のファイルとフォルダを一時フォルダに解凍するには、CLI で次のコマンドを実行します。
重要: lambda-package.zip は、デプロイパッケージのファイル名に置き換えてください。temp-folder は、新しい一時フォルダに与える任意の名前に置き換えます。

mkdir temp-folder; unzip lambda-package.zip -d temp-folder ;cd temp-folder;ls -l

2.    ライブラリのファイルのパーミッションを更新します

注: 現在のディレクトリ内のすべてのファイルとフォルダを任意のユーザーが読み取り可能にするには、次の chmod コマンドを実行します。

$ chmod 644 $(find /tmp/package_contents -type f)
$ chmod 755 $(find /tmp/package_contents -type d)

3.    パーミッションを修正したら、次のコマンドを実行して、ファイルとフォルダを新しい.zip ファイルに再パッケージします。

zip -r new-lambda-package.zip *

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?