AWS Technical Essentialsを進めているなかでS3への接続が上手く行きませんでした。その際に表示されたのがタイトルにあるエラーです。エラー内容と対応方法にギャップがあったので対処法を記録しておきます。
発生したエラー
AWS Technical Essentialsで使用するアプリケーションでS3の接続を確認する箇所で上手く動きませんでした。エラーが発生していたコードは以下です。
async function hasS3Access() {
try {
// console.log('settings::hasS3Access');
if (constants.PHOTOS_BUCKET === '') return false;
const data = await s3
.headBucket({ Bucket: constants.PHOTOS_BUCKET })
.promise();
return data !== undefined && data !== null;
} catch (e) {
return false;
}
}
発生したエラーは以下の通りです。
Error in hasS3Access: Error [CredentialsError]: Missing credentials in config, if using AWS_CONFIG_FILE, set AWS_SDK_LOAD_CONFIG=1
at IncomingMessage.<anonymous> (/var/app/node_modules/aws-sdk/lib/util.js:930:34)
at IncomingMessage.emit (node:events:531:35)
at IncomingMessage.emit (node:domain:488:12)
at endReadableNT (node:internal/streams/readable:1696:12)
at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
statusCode: 404,
retryable: false,
time: 2024-06-18T23:36:13.548Z,
code: 'CredentialsError',
originalError: {
message: 'Could not load credentials from any providers',
statusCode: 404,
retryable: false,
time: 2024-06-18T23:36:13.547Z,
code: 'CredentialsError',
originalError: {
message: 'EC2 Metadata roleName request returned error',
statusCode: 404,
retryable: false,
time: 2024-06-18T23:36:13.547Z
}
}
}
環境
- EC2からS3へアクセス
- Node.js v20
エラーの原因
CredentialsErrorとある通り、認証情報が取得できていません。
メッセージに”Missing credentials in config, if using AWS_CONFIG_FILE, set AWS_SDK_LOAD_CONFIG=1“とあるのでconfigに設定をする必要があるのかと思い悩んでしまいました。
対応
アクセスキーを使用する方法(非推奨)
ChatGPTに相談すると以下のように返ってきました。
認証情報の欠如:
- AWS SDKが認証情報(アクセスキーID、シークレットアクセスキー)を見つけられないため、このエラーが発生しています。
対応方法
1. 環境変数を設定する
認証情報を環境変数として設定します。以下のコマンドを使って、必要な環境変数を設定します。
ChatGPT
export AWS_ACCESS_KEY_ID=your_access_key_id export AWS_SECRET_ACCESS_KEY=your_secret_access_key export AWS_REGION=your_region
なるほどアクセスキーが足りないのかと思い、AWSコンソールでアクセスキーを取得しにいくと強めに代替案を進められました。アクセスキーを使用することはベストプラクティスではないようです。
IAMロールを使用する方法
アクセスキー以外の対応方法をChatGPTに相談すると以下のように返ってきました。
3. IAMロールを使用する
EC2インスタンスやLambda関数などのAWSリソースからAWSサービスにアクセスする場合は、IAMロールを使用します。これにより、アクセスキーを直接管理する必要がなくなり、セキュリティが向上します。
例: EC2インスタンスにIAMロールをアタッチする
ChatGPT
- IAMロールを作成し、必要なポリシーをアタッチします。
- 作成したロールをEC2インスタンスにアタッチします。
- SDKは自動的にロールを使用して認証を行います。
なるほど! AWSサービス間の権限の設定はIAMロールで行うのでした。AWS Technical Essentialsではコースの前半でIAMロールを作成していました。後半のS3のデモでそのIAMロールをEC2に紐づけるところが飛ばされていたのです!
以下の手順でIAMロールを作成して、EC2に紐づけることで解決しました。
まとめ
[CredentialsError]: Missing credentials in config, if using AWS_CONFIG_FILE, set AWS_SDK_LOAD_CONFIG=1の対処法について解説しました。node.jsのプログラムからすると認証情報をどこからか取得できれば良いので”Missing credentials in config“とメッセージを出力しているのでしょうが、configにアクセスキーの設定をすることはAWSのベストプラクティスではありません。AWSが絡むプログラムをする際には原因がAWSの設定にある可能性を考える必要がありそうです。
コメント