0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WindowsでAWS LambdaにデプロイするZIPファイルを作ったらエラーになった

Posted at

背景

前回はPythonでも簡単にクロスビルドができ、AWS Lambda Web Adapter(LWA)と合わせるとAWS Lambdaの開発が非常にはかどるということを紹介しました。

この方法でZIPファイルを作成し、LWAのレポジトリに書かれている設定

で実際にデプロイしても実行時にエラーが起き、ログにはrun.shの実行に失敗したということが書かれていました。今回はこれの原因と対処法について紹介します。

原因

まず原因の特定ですが、この現象はWindowsから作成した時だけでLinuxで作成してもエラーにならずに実行できました。そしてすぐにLWAを使用するときに指定する run.shの実行権限が原因と分かりました。実際に実行権限を付与しない状態でLinuxで作ったZIPファイルでも同様のエラーになりました。

対策

そもそもLinux上でchmodなどのコマンドで与えるファイル属性のメタデータはWindowsと互換性がなく、Windows側でファイルを作成してもそれ単体ではLinux側で+xの権限があると解釈させる方法はありません。ではどうすればいいのかとGoやRustでLambda用のZIPファイルを作る際にどうしているのか調べました。これらの言語ではrun.shの代わりにコンパイルして出力された実行ファイルを直接entrypointに指定しますが、やはり+xが必要なことには変わりありません。

Go言語に関するAWS Lambdaの公式のドキュメントを読みますとbuild-lambda-zipというツールを使用すると書いてあり、このツールのソースを読みますとZIPファイルを作る際にZIPの規格で規定されているファイル属性を上書きして実行権限を付与していることがわかりました。

どうやらLinux側ではZIPファイルを展開する際にこの属性値が使用されるようです。このプログラムはディレクトリをまとめて固める機能は無いようなので自分で以下のような処理を行うプログラムを作成すれば汎用的に使えそうです。

  1. 指定したディレクトリをまとめてZIPファイルに圧縮する
  2. rootのディレクトリはZIPファイルに含めない
  3. bootstraprun.shというファイルの場合には755の権限を付与する
  4. run.shは改行コードをLFに変換する

実行権限だけでなく改行コードもWindowsで作ったときにCRLFのままだとrun.shの実行でbashがエラーを吐きましたのでこれも必要です。

実際にこれをGemini 2.5-Flashのプロンプトに入れると(べた書きですが)完璧なコードを出してくれましたのでmain部分だけ手直ししたのが以下のrepositoryになります。

ZIPファイルを作る際に7zCompress-Archiveの代わりにこのプログラムを使用したらばっちりAWS Lambdaでも動作しました!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?