私だけかもしれませんが、大分嵌ったので、メモを残します。
環境
Windows10 WSL2 (Ubuntu18.04)
WLS2内でCDKのソースコードを保有してDockerコンテナへVolumeマウントしている状態。
WSL2のファイルはローカルユーザーがオーナー(1000:1000)
ファイル、ディレクトリのパーミッションはフルアクセスでコンテナのユーザーもRW可能な状態
aws-lambda-nodejsのNodejsFunction()を利用しbuildingオプションのforceDockerBundlingはfalseを設定済.
(コンテナでビルドせずにローカルのesbuildを利用する設定)
問題事象
WSL2環境のDockerコンテナにAWS CDKをインストールして、コンテナのrootユーザーでcdkコマンドを実行するとこうなる事象に遭遇
$cdk synth
Error: Failed to bundle asset xxxxxxxxx/Code/Stage, bundle output is located at XXXXXXX
(省略)
Error: bash -c npx --no-install esbuild --bundle /xxxxxx/hoge.ts"
意味がわからないのでソースを見てみました。(やっぱり。わかりませんw)
ここでエラーが発生する模様. asset-staging.ts#L446
もう少し辿ってみた。
bundling.ts#L252
エラーメッセージから薄っすらわかっていましたが、コードを見てもやはりesbuildを実行しようとして失敗しているらしい。
エラーになったと思われるesbuildをコンテナのshellで実行すると正しく実行できる。
CDKコマンド内ではesbuildが失敗する。
ファイルオーナー、パーミッションの問題じゃないハズ。。
摩訶不思議状態。
偶然、こんなコードがあることは確認しています。
asset-staging.ts#L446
localBundling = options.local?.tryBundle(bundleDir, options);
if (!localBundling) {
let user: string;
if (options.user) {
user = options.user;
} else { // Default to current user
const userInfo = os.userInfo();
user = userInfo.uid !== -1 // uid is -1 on Windows
? `${userInfo.uid}:${userInfo.gid}`
: '1000:1000';
}
おそらく上記はなんの関係もない
あれ?やっぱりオーナー??
ズレてるけど、結果オーライw
解決
ファイル、ディレクトリのオーナーをrootにする。
これは未検証ですがcdk.outのパーミッションだけ変更すればよかったかもしれない。