AWS の EC2 上で Node.js を使用して API 環境を構築している際に、次のようなエラーが発生することがあります。
1 2 3 4 5 6 7 8 9 10 |
[ERROR] api - "config" method:"" function:"" subfunction:"main" catch: CredentialsProviderError: Could not load credentials from any providers at /home/ubuntu/project/node_modules/@aws-sdk/credential-provider-node/dist-cjs/defaultProvider.js:13:11 at /home/ubuntu/project/node_modules/@smithy/property-provider/dist-cjs/chain.js:11:28 at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async coalesceProvider (/home/ubuntu/project/node_modules/@smithy/property-provider/dist-cjs/memoize.js:14:24) at async SignatureV4.credentialProvider (/home/ubuntu/project/node_modules/@smithy/property-provider/dist-cjs/memoize.js:33:24) at async SignatureV4.signRequest (/home/ubuntu/project/node_modules/@smithy/signature-v4/dist-cjs/SignatureV4.js:106:29) at async /home/ubuntu/project/node_modules/@aws-sdk/middleware-signing/dist-cjs/awsAuthMiddleware.js:16:18 at async /home/ubuntu/project/node_modules/@smithy/middleware-retry/dist-cjs/retryMiddleware.js:27:46 at async /home/ubuntu/project/node_modules/@aws-sdk/middleware-logger/dist-cjs/loggerMiddleware.js:7:26 |
このエラーは、AWS SDKが認証情報をロードできなかったことを意味します。
以下にこの問題の原因と解決方法を解説します。
原因
- 認証情報が設定されていない
-
環境変数や設定ファイルに、
AWS_ACCESS_KEY_ID
やAWS_SECRET_ACCESS_KEY
などが正しく設定されていない可能性があります。 - IAM ロールがアタッチされていない
-
EC2 インスタンスに必要な権限を持つ IAM ロールがアタッチされていないと、認証情報を読み込むことができません。
~/.aws/credentials
が存在しない、または無効-
プロファイルを使用して認証情報を取得しようとしている際に、指定されたプロファイルが存在しない、または正しく設定されていない可能性があります。
解決方法
環境変数の確認
EC2 インスタンス内で、AWS_ACCESS_KEY_ID
と AWS_SECRET_ACCESS_KEY
が正しく設定されているかを確認してください。
下記は環境変数の例です。
1 2 |
export AWS_ACCESS_KEY_ID=your-access-key-id export AWS_SECRET_ACCESS_KEY=your-secret-access-key |
Node.js では process.env
を使って読み込みます。
1 2 3 4 5 6 7 8 9 |
const AWS = require("@aws-sdk/client-s3"); const s3 = new AWS.S3Client({ region: "us-east-1", credentials: { accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, }, }); |
IAM ロールの確認
マネジメントコンソールや AWS CLI を使って、EC2 にアタッチされた IAM ロールとその権限を確認してください。
下記は簡易なロールチェックの例です。
1 |
aws iam get-instance-profile --instance-profile-name your-instance-profile-name |
設定ファイルの確認
プロファイルが正しく設定されているかを確認します。
1 2 3 |
[default] aws_access_key_id = your-access-key-id aws_secret_access_key = your-secret-access-key |
あるいは、プロファイル名を指定してロードします。
1 2 3 4 5 6 7 |
const { S3Client } = require("@aws-sdk/client-s3"); const { fromIni } = require("@aws-sdk/credential-provider-ini"); const client = new S3Client({ region: "us-east-1", credentials: fromIni({ profile: "default" }), }); |
IAM ロールのメタデータ使用
EC2 インスタンスにメタデータを使う認証方式を有効にすることも可能です。
1 2 3 4 5 6 7 |
const { S3Client } = require("@aws-sdk/client-s3"); const { fromInstanceMetadata } = require("@aws-sdk/credential-provider-imds"); const client = new S3Client({ region: "us-east-1", credentials: fromInstanceMetadata(), }); |
おわりに
この記事では、AWS SDK for JavaScript を使用した際に発生する「CredentialsProviderError」の原因と具体的な解決方法について詳しく解説しました。
エラーは多くの場合、設定のミスや認証情報の不備が原因ですが、適切な手順を踏むことでスムーズに解決できます。
特に、環境変数や IAM ロールの設定を確認することは、AWS 環境でのトラブルシューティングにおいて非常に重要です。
また、fromInstanceMetadata
や fromIni
などの認証情報プロバイダーを正しく利用することで、セキュリティを維持しつつ柔軟な開発が可能になります。
最後に、エラーが発生した場合は、まずエラーメッセージの内容をよく確認し、何が原因で認証情報を取得できていないのかを特定することを心がけてください。
AWS のドキュメントや CLI コマンドを活用しながら、根本的な解決に取り組みましょう。
本記事が、同様の問題に直面しているエンジニアの皆さんの参考になれば幸いです。
コメント