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

最終更新日: 2019 年 4 月 10 日

AWS Lambda デプロイパッケージファイルをアップロードしたら、エラーが発生しました。何が問題ですか? また、どうすれば修正できますか? 

簡単な説明

間違った権限に関する問題は、継続的インテグレーションアプリケーションによって生成されたパッケージに共通しています。Lambda デプロイパッケージの .zip ファイルまたは .jar ファイルに設定されているセキュリティ権限が正しくない場合、ファイルをアップロードしようとするとエラーが発生します。Lambda には、デプロイパッケージのコードファイルおよび依存ライブラリに対するグローバルな読み取り権限が必要です。

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

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

解決方法

エラーの原因を特定する

Lambda 関数コードの作成に使用している言語によっては、エラーメッセージでのエラーの原因が明らかではない場合があります。たとえば、Node.js 関数では、エラーが明らかです。

{
  "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 関数の場合、エラーを特定するのはやや難しいです。例: 

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

または、外部ライブラリに必要な権限がない場合: 

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

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

: これらのコマンドは Linux/Unix/macOS システムにのみ有効です。

1.    (オプション) Command Line Interface (CLI) で zipinfo を実行して、デプロイパッケージファイルの権限を確認します。詳細については、「Lambda デプロイパッケージの権限ポリシー」を参照してください。

2.    権限を再帰的に修正するには、CLI で次のコマンドを実行してください。

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

3.    権限を修正したら、デプロイパッケージをもう一度アップロードします。


このページは役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合