質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • AWS(Amazon Web Services)

    1908questions

    Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

  • Node.js

    1796questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • Express

    232questions

    ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

node aws-sdkでs3にファイルアップ時に、「Missing credentials in config」になる。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 461

ochiba2525

score 6

node aws-sdkでs3にファイルアップ時に、「Missing credentials in config」になります。

[エラー内容]
{ Error:
    at Object._errnoException (util.js:1024:11)
    at _exceptionWithHostPort (util.js:1046:20)
    at internalConnect (net.js:971:16)
    at net.js:1065:9
    at _combinedTickCallback (internal/process/next_tick.js:131:7)
    at process._tickDomainCallback (internal/process/next_tick.js:218:9)
  message: 'Missing credentials in config',
  code: 'CredentialsError',
  errno: 'EHOSTUNREACH',
  syscall: 'connect',
  port: 80,
  time: 2018-04-16T09:35:50.924Z,
  originalError:
   { message: 'Could not load credentials from any providers',
     code: 'CredentialsError',
     errno: 'EHOSTUNREACH',
     syscall: 'connect',
     port: 80,
     time: 2018-04-16T09:35:50.924Z,
     originalError:
      { code: 'EHOSTUNREACH',
        errno: 'EHOSTUNREACH',
        syscall: 'connect',
        port: 80 } }

環境変数は間違っていないことは確認済みです。

また別ファイルで呼び出して、その値(public URL)を出しているので、exportとPromiseを使っておりますが、
その2つの書き方も正常に動いております。

調べるとconfigの中が間違っている記事が散見されましたが、
そこを直しても特に変わりはありませんでした。

よろしくお願いいたします。

以下、コードです。

require('dotenv').config({path: '../../.env'});
var AWS = require('aws-sdk');
var s3 = new AWS.S3();

exports.setImg = (imgURL) => {
    return new Promise ((resolve, reject) => {
        var myBucket = 'yup.issho';
        var accessKey = process.env.AWS_S3_ACCESS_KEY
        var secretKey = process.env.AWS_S3_SECRET_KEY
        AWS.config.update({
            // accessKeyId: accessKey,
            // secretAccessKey: secretKey,
            region: 'ap-northeast-1',
            credentials: new AWS.Credentials(accessKey, secretKey)
        });

    let params = {Bucket: myBucket, Key: imgURL, Body: 'Hello!'};
    // s3.putObject(params,function(err, data) {
        s3.upload(params,function(err, data) {
            if (err){
                console.log(err);
            }
            console.log("Successfully uploaded data");
            resolve(data);
        });
    })
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

「AWS.config.update(〜);」と直前2行を「var s3 = new AWS.S3();」の前に移動して下さい。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/17 11:01

    ああ確かに。AWSの接続情報(Credential)を読み込ませてから、S3のインスタンス化ですね。

    キャンセル

  • 2018/04/17 21:58

    ありがとうございます。
    こちらの方法でいけるのであれば、IAMユーザーでも大丈夫なのですかね。

    試してみます!

    キャンセル

checkベストアンサー

+1

ドキュメントルートから../../.envに存在する環境変数を見直してください。
AWS_S3_ACCESS_KEY に アクセスキー
AWS_S3_SECRET_KEY に シークレットアクセスキー
が入っている必要があるようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/16 15:08 編集

    返信ありがとうございます。
    環境変数をコンソールで出して、値に不備はなく、テスト的に2つのキーを同ファイル内で直打ちしても、同じエラーが出ている状況です。

    キャンセル

  • 2018/04/16 15:20

    では、確認すべきは3点。

    1. IAMのポリシー
    その発行したクレデンシャルのIAMユーザは、S3へのアクセス権限があるか確認してください。
    S3アクセス権限がないとアクセスは拒否されます。

    2. S3バケットポリシー
    バケットポリシーを使っていないか、Get-ObjectがAllowになってますか?

    3. 通信ポートの確認
    SSL/TLSポート(HTTPS:443)を使っていますので、ポートが空いているかも確認してください。

    キャンセル

  • 2018/04/16 15:48

    ありがとうございます。
    1 -> アクセス権限あり。
    2 -> バケットポリシーにて、Get-Object設定済み。
    3ですが、ポートが空いているかの確認はどこですればよろしいでしょうか、、?

    キャンセル

  • 2018/04/16 16:09

    あ、すみません。
    2. はアップロードなので Put-Object の間違いです。
    3. は "netstat -na" とか "curl -Ik https://aws.amazon.com/" とか "nmap -p 443 54.239.26.209" で確認できると思います。

    キャンセル

  • 2018/04/16 17:20

    ありがとうございます。
    2 -> どちらも設定しております!
    3 -> node側のcredencial errorの中に「port: 80」と書いてありましたが、ここは関係ありますか?

    キャンセル

  • 2018/04/16 18:00

    2. は了解です。
    > 「port: 80」
    普段は443になるはずなのですが、それだけだとちょっとわからないので、
    個人情報のところは伏せてエラー文を上のメッセージに追記してください。

    ちなみに、node.jsを置いているのは、どこに置いていますか?
    OSと環境を教えてください。AWS EC2インスタンスですか?Lambdaですか?自分のサーバ?
    AWS CLI を叩ける環境でしょうか?

    キャンセル

  • 2018/04/16 18:39

    いろいろとすみません、、
    エラー追記しました!
    現在はローカルでやっていますが、いずれインスタンスにいれます。

    キャンセル

  • 2018/04/16 18:47

    AWS CLIやったことありません。

    キャンセル

  • 2018/04/17 11:08 編集

    了解しました。一旦プログラム修正を試してみてください。

    AWS CLI (https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-welcome.html)
    は、AWS Command Line Interfaceと言い、SDKと同じことをローカルコマンドで実行するので、
    単にAWSに接続できない(ネットワークが悪いorクレデンシャル)のかプログラムそのものが悪いのかの切り分けができます。

    キャンセル

  • 2018/04/17 21:57

    ありがとうございます。
    本日解決致しました。
    どうやら、IAMユーザーのキーでやっていたのですが、AWSアカウントに対するキーが本来必要なものだったようです。。。
    いろいろ教えていただき本当にありがとうございました!

    キャンセル

  • 2018/04/18 11:38 編集

    なるほど。了解しました。

    AWSアカウントのキーは”AdministratorAccessのさらに上”の権限(ポリシー)がついているものになっていますので、ご自身の持っている全てのAWSへのアクセスが可能です。
    アカウント自体もAWSが管理しているため、自分ではポリシーの変更ができない仕組みになっています。

    ただ、AWSアカウントのクレデンシャル情報(アクセスキーとシークレットキー)が、万が一、悪意のある人間に漏れてしまいますとアカウントハックに遭遇することにもなりかねない危険性もあります。

    AWSアカウントのキーでもできるのですが、本来はIAMユーザでアクセスさせる方法がベストプラクティスになります。
    IAMの画面から対象のIAMユーザをプログラムアクセスを有効にして、任意のポリシーをつける方法が安全なので、こちらの方法を試してみてください。
    ポリシーはS3FullAccess権限のみで問題ないかと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • AWS(Amazon Web Services)

    1908questions

    Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

  • Node.js

    1796questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • Express

    232questions

    ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。