今回Node.jsのLabmdaでS3のファイル作成をトリガーにして、そのファイルの内容を読み取ろうとする単純なLabmda関数を書いて見ました。その途中でAccess Deniedと言われてしまい心が折れそうになった(大袈裟)のでご紹介します。

AccessDenied: Access Denied
at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/services/s3.js:329:35)
at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:105:20) 
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:77:10)
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:596:14)

原因は単純にLambda関数に設定しているIAMにS3を読み取る権限がないためです。トリガーにしているので権限あるのかなと甘い気持ちで試してしまいました・・・。

解決方法 AmazonS3ReadOnlyAccessのポリシーをアタッチ!

Lambda関数のアクセス権限のタブから、実行ロールを表示します。IAMコンソールへのリンクをクリックしましょう。

LambdaロールAmazonS3ReadOnlyAccessを検索してロールへアタッチしてやります。今回は読み取るだけですのでFullAccessにする必要はありませんでした。ロールにS3の権限をアタッチ

ロールの権限設定を行うと無事にS3上のファイルが読み取れるようになりました。