Node.jsとAWS S3でのアップロードで起こるエラーと解決方法

Node.jsを使ってAWS S3にファイルをアップロードする際に、IAMの設定不備が原因となってエラーが発生することがあります。
この記事では、実際に起こった問題とその解決方法を解説します。

問題の内容

エラーメッセージの一例を下記します。

[ERROR] api - "apiName" method:"POST" function:"/create" subfunction:"main" catch: AccessDenied: User: arn:aws:iam::XXXXXXXXXXXX:user/old-iam-user is not authorized to perform: s3:PutObject on resource: "arn:aws:s3:::example-bucket/path/to/object.jpg" because no identity-based policy allows the s3:PutObject action
    at throwDefaultError (/path/to/node_modules/@smithy/smithy-client/dist-cjs/default-error-handler.js:8:22)
    ...

このエラーは、指定されたS3バケットに対して、IAMユーザーの権限が不足していることを意味しています。
著者の場合は、不適切なユーザーの情報がキャッシュに残っていたため、新しいIAMユーザーの情報が参照されていませんでした。

解決方法

問題を解決するために実施した手順を以下に紹介します。

CHECK
IAMポリシーの確認

ユーザー権限を確認し、正しいユーザーが正しいポリシーを備えていることを保証します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::example-bucket/path/to/*" } ] }

CHECK
Secrets Managerの設定確認とアプリ内のキャッシュクリアを実行

キャッシュに残る情報は、Secrets Managerの設定を変更しただけでは解決しない場合があります。
そのため、アプリを再起動し、新しい情報を参照させましょう。

CHECK
AWS SDKの設定をログで確認

コード上で、設定が正しく参照されているかをログで確認することで、トラブルの原因を特定できます。
const AWS = require('aws-sdk'); AWS.config.update({ accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, region: 'your-region' }); console.log('Configured Access Key:', process.env.AWS_ACCESS_KEY_ID);

CHECK
環境変数とファイルの規定を確認

環境変数AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY に旧ユーザーの情報が残っていないか確認します。
~/.aws/credentials ファイルを見て、不適切な設定があれば削除します。

エラーの原因はキャッシュ問題だった

私の場合、問題の原因はアプリケーションが古いIAMユーザーの資格情報をキャッシュしていたことにありました。
Secrets Managerを正しく変更しても、アプリケーションのキャッシュをクリアしなければ新しい資格情報が反映されません。
対策として以下を実施しました。

STEP
アプリケーションの再起動

キャッシュがクリアされるよう、アプリケーションを再起動しました。
これにより、新しいIAMユーザーの資格情報が適用されました。

STEP
キャッシュの無効化

ローカル環境やテスト環境でキャッシュが残らないよう、以下の設定を導入しました。

STEP
キャッシュクリアのプロセスを自動化

デプロイ時に古いキャッシュが残らないよう、CI/CDパイプラインにキャッシュクリア手順を追加しました。

まとめ

Node.jsAWS S3にファイルをアップロードする際に発生する「AccessDeniedエラーは、IAMポリシーやSecrets Managerの設定だけでなく、キャッシュが原因となる場合があります。
この問題を解決するには、以下を徹底してください。

  • IAMポリシーが正しいか確認する
  • Secrets Managerの設定を更新した後、アプリケーションのキャッシュをクリアする
  • デバッグログを活用して設定情報を確認する

これらの手順を踏むことで、問題を迅速に解決できるでしょう。
この記事が、同じような問題で悩むエンジニアの参考になれば幸いです。


Amazonベストセラー

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA