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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

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

Express

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

AWS(Amazon Web Services)

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

Q&A

解決済

2回答

6000閲覧

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

ochiba2525

総合スコア16

Node.js

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

Express

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

AWS(Amazon Web Services)

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

0グッド

0クリップ

投稿2018/04/16 05:53

編集2018/04/16 09:38

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); }); }) }

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

投稿2018/04/16 22:54

hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lazhuward

2018/04/17 02:01

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

2018/04/17 12:58

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

0

ベストアンサー

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

投稿2018/04/16 06:00

lazhuward

総合スコア1294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ochiba2525

2018/04/16 06:09 編集

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

2018/04/16 06:20

では、確認すべきは3点。 1. IAMのポリシー その発行したクレデンシャルのIAMユーザは、S3へのアクセス権限があるか確認してください。 S3アクセス権限がないとアクセスは拒否されます。 2. S3バケットポリシー バケットポリシーを使っていないか、Get-ObjectがAllowになってますか? 3. 通信ポートの確認 SSL/TLSポート(HTTPS:443)を使っていますので、ポートが空いているかも確認してください。
ochiba2525

2018/04/16 06:48

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

2018/04/16 07:09

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

2018/04/16 08:20

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

2018/04/16 09:00

2. は了解です。 > 「port: 80」 普段は443になるはずなのですが、それだけだとちょっとわからないので、 個人情報のところは伏せてエラー文を上のメッセージに追記してください。 ちなみに、node.jsを置いているのは、どこに置いていますか? OSと環境を教えてください。AWS EC2インスタンスですか?Lambdaですか?自分のサーバ? AWS CLI を叩ける環境でしょうか?
ochiba2525

2018/04/16 09:39

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

2018/04/16 09:47

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

2018/04/17 02:10 編集

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

2018/04/17 12:57

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

2018/04/18 02:40 編集

なるほど。了解しました。 AWSアカウントのキーは”AdministratorAccessのさらに上”の権限(ポリシー)がついているものになっていますので、ご自身の持っている全てのAWSへのアクセスが可能です。 アカウント自体もAWSが管理しているため、自分ではポリシーの変更ができない仕組みになっています。 ただ、AWSアカウントのクレデンシャル情報(アクセスキーとシークレットキー)が、万が一、悪意のある人間に漏れてしまいますとアカウントハックに遭遇することにもなりかねない危険性もあります。 AWSアカウントのキーでもできるのですが、本来はIAMユーザでアクセスさせる方法がベストプラクティスになります。 IAMの画面から対象のIAMユーザをプログラムアクセスを有効にして、任意のポリシーをつける方法が安全なので、こちらの方法を試してみてください。 ポリシーはS3FullAccess権限のみで問題ないかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問