GoogleドライブでSAMを使って分かった権限周りのハマりどころ

2020.03.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。AWS事業本部のKyoです。

SAMを使っていく中でちょっと困ったことがあったので、残しておきます。

結論から述べると、 GoogleドライブでSAM(およびLambda)関係のファイルを扱うのは注意が必要そうです。

起こったこと

検証のためにSAM CLIを触っていました。

とりあえずHello Worldしようと、SAM init し、AWS Quick Start Templates, python3.7, Hello World Example で進めました。

テンプレートが生成されるので、SAM buildして、 SAM deploy --guidedでconfigを生成、SAM deployします。

...無事にLambda関数も出来たので、マネジメントコンソールから関数のテストを実行すると見たことないエラーが出ました。

トラブルシュートしてみた

エラーメッセージを見ると、「Permission denied」とのことなので、ls -lでコードファイルの権限を調べます。

-rw-------  1 kyo  staff     0  3 22 16:08 __init__.py
-rw-------  1 kyo  staff  1151  3 22 16:08 app.py
-rw-------  1 kyo  staff     8  3 22 16:08 requirements.txt

600ですね。グループおよびその他のユーザに対して権限がついてない状態でした。

公式ドキュメントに以下の記載がありました。

Lambda には、デプロイパッケージのコードファイルおよび依存ライブラリに対するグローバルな読み取り権限が必要です。

権限が必要とのことなので、chmod -R 755 hello_world/で権限付与して再確認します。

-rwx------  1 kyo  staff     0  3 22 16:08 __init__.py
-rwx------  1 kyo  staff  1151  3 22 16:08 app.py
-rwx------  1 kyo  staff     8  3 22 16:08 requirements.txt

...なぜか自分の権限しか付与できず、700にしかなっていません(sudoつけてもダメ)。

調べてみると、以下のページを見つけました。

chmod not changing permissions for files in Google Drive File Stream

同じく自分もGoogleドライブをファイルストリーム経由で使っていました。

どうやらGoogle Driveの中では自分以外の権限は変更できないようです。

作業ディレクトリをローカルに切り替えてSAM initから実行してみます。

デフォルトの状態で権限は以下になっています。

-rwxr-xr-x  1 kyo  staff     0  3 22 17:20 __init__.py
-rwxr-xr-x  1 kyo  staff  1151  3 22 17:20 app.py
-rwxr-xr-x  1 kyo  staff     8  3 22 17:20 requirements.txt

755ですね。この状態で、デプロイ&テストします。

成功しました!

おまけ

SAMを使ってもコードファイル自体は、S3にアップされるはずと中身を覗いてみたら、3e8eddff84fd00b892a6e81e2c0006ccのようなファイルが生成されていました。 こちらが実体のようです。なお拡張子は表示されてないものの、拡張子をzipに変更すると解凍できました。 解凍したものからも権限の確認は可能でした。

おわりに

ドキュメント類のバックアップのため、Googleドライブの中で作業を行っていたことが思いもよらぬハマりにつながりました。 GoogleドライブでSAM(およびLambda)関係のファイルを扱うのには注意が必要だと思いました。

以上、何かのお役に立てれば幸いです。

参考

ブログを書いているときに同じ症状を報告されている方の記事を見つけたので、ご紹介いたします。