MENU

Knowledge Oasisは主にAIとAWSの知識を共有するブログです。その他ITに関する知識やまれに生活に役立つ知識も共有するかもしれません。

KOふみ
名前はKOふみ(こふみ)。独立系SIerで20年のキャリアを持ち、新人研修の講師から請負開発まで幅広く経験。現在はAIを駆使したソリューション開発に従事。資格は応用情報技術者、データベーススペシャリスト、プロジェクトマネージャー、PMP、簿記2級。AWS学習中で、将来はAWSアンバサダーを目指す。

[CredentialsError]: Missing credentials in config, if using AWS_CONFIG_FILE, set AWS_SDK_LOAD_CONFIG=1の対処法

[CredentialsError]: Missing credentials in config, if using AWS_CONFIG_FILE, set AWS_SDK_LOAD_CONFIG=1の対処法
  • URLをコピーしました!

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. 環境変数を設定する

認証情報を環境変数として設定します。以下のコマンドを使って、必要な環境変数を設定します。

export AWS_ACCESS_KEY_ID=your_access_key_id
export AWS_SECRET_ACCESS_KEY=your_secret_access_key
export AWS_REGION=your_region
ChatGPT

なるほどアクセスキーが足りないのかと思い、AWSコンソールでアクセスキーを取得しにいくと強めに代替案を進められました。アクセスキーを使用することはベストプラクティスではないようです。

IAMロールを使用する方法

アクセスキー以外の対応方法をChatGPTに相談すると以下のように返ってきました。

3. IAMロールを使用する

EC2インスタンスやLambda関数などのAWSリソースからAWSサービスにアクセスする場合は、IAMロールを使用します。これにより、アクセスキーを直接管理する必要がなくなり、セキュリティが向上します。

例: EC2インスタンスにIAMロールをアタッチする
  1. IAMロールを作成し、必要なポリシーをアタッチします。
  2. 作成したロールをEC2インスタンスにアタッチします。
  3. SDKは自動的にロールを使用して認証を行います。
ChatGPT

なるほど! 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の設定にある可能性を考える必要がありそうです。

  • URLをコピーしました!

コメント

コメントする

目次