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ユーザーの情報が参照されていませんでした。
解決方法
問題を解決するために実施した手順を以下に紹介します。
ユーザーの権限を確認し、正しいユーザーが正しいポリシーを備えていることを保証します。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::example-bucket/path/to/*" } ] }
キャッシュに残る情報は、Secrets Managerの設定を変更しただけでは解決しない場合があります。
そのため、アプリを再起動し、新しい情報を参照させましょう。
コード上で、設定が正しく参照されているかをログで確認することで、トラブルの原因を特定できます。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);
環境変数でAWS_ACCESS_KEY_ID
や AWS_SECRET_ACCESS_KEY
に旧ユーザーの情報が残っていないか確認します。~/.aws/credentials
ファイルを見て、不適切な設定があれば削除します。
エラーの原因はキャッシュ問題だった
私の場合、問題の原因はアプリケーションが古いIAMユーザーの資格情報をキャッシュしていたことにありました。
Secrets Managerを正しく変更しても、アプリケーションのキャッシュをクリアしなければ新しい資格情報が反映されません。
対策として以下を実施しました。
キャッシュがクリアされるよう、アプリケーションを再起動しました。
これにより、新しいIAMユーザーの資格情報が適用されました。
ローカル環境やテスト環境でキャッシュが残らないよう、以下の設定を導入しました。
デプロイ時に古いキャッシュが残らないよう、CI/CDパイプラインにキャッシュクリア手順を追加しました。
まとめ
Node.jsでAWS S3にファイルをアップロードする際に発生する「AccessDenied」エラーは、IAMポリシーやSecrets Managerの設定だけでなく、キャッシュが原因となる場合があります。
この問題を解決するには、以下を徹底してください。
- IAMポリシーが正しいか確認する
- Secrets Managerの設定を更新した後、アプリケーションのキャッシュをクリアする
- デバッグログを活用して設定情報を確認する
これらの手順を踏むことで、問題を迅速に解決できるでしょう。
この記事が、同じような問題で悩むエンジニアの参考になれば幸いです。
- Original:https://minory.org/node-aws-s3-put-error.html
- Source:minory
- Author:管理者
Amazonベストセラー
Now loading...