AWS SDK for JavaScript 使用時の「CredentialsProviderError」の解決方法

AWSEC2 上で Node.js を使用して API 環境を構築している際に、次のようなエラーが発生することがあります。

[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_IDAWS_SECRET_ACCESS_KEY などが正しく設定されていない可能性があります。

IAM ロールがアタッチされていない

EC2 インスタンスに必要な権限を持つ IAM ロールがアタッチされていないと、認証情報を読み込むことができません。

~/.aws/credentials が存在しない、または無効

プロファイルを使用して認証情報を取得しようとしている際に、指定されたプロファイルが存在しない、または正しく設定されていない可能性があります。

解決方法

環境変数の確認

EC2 インスタンス内で、AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY が正しく設定されているかを確認してください。
下記は環境変数の例です。

export AWS_ACCESS_KEY_ID=your-access-key-id
export AWS_SECRET_ACCESS_KEY=your-secret-access-key

Node.js では process.env を使って読み込みます。

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 ロールとその権限を確認してください。
下記は簡易なロールチェックの例です。

aws iam get-instance-profile --instance-profile-name your-instance-profile-name

設定ファイルの確認

プロファイルが正しく設定されているかを確認します。

[default]
aws_access_key_id = your-access-key-id
aws_secret_access_key = your-secret-access-key

あるいは、プロファイル名を指定してロードします。

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 インスタンスにメタデータを使う認証方式を有効にすることも可能です。

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 環境でのトラブルシューティングにおいて非常に重要です。
また、fromInstanceMetadatafromIni などの認証情報プロバイダーを正しく利用することで、セキュリティを維持しつつ柔軟な開発が可能になります。

最後に、エラーが発生した場合は、まずエラーメッセージの内容をよく確認し、何が原因で認証情報を取得できていないのかを特定することを心がけてください。
AWS のドキュメントや CLI コマンドを活用しながら、根本的な解決に取り組みましょう。

本記事が、同様の問題に直面しているエンジニアの皆さんの参考になれば幸いです。


Amazonベストセラー

返信を残す

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

CAPTCHA