2017-10-27 13 views
0

私のwebappがaws s3バケットと話すためにノードにaws-sdkを使用しています。しばらくしてs3にファイルをアップロードしようとすると失敗します。すぐに再度アップロードしようとするとうまくいきます。ノード:S3へのアップロードが最初のトレイルでのみ失敗する

は、いくつかのデバッグした後、それはrequestUrlとの問題だと思われる:

最初の試験では、

requestUrl: https://s3-ap-southeast-2.amazonaws.com/に直接リクエストを送信しようと、もちろん403禁断のエラーにつながる

正しいURLである

requestUrl: https://my-bucket.s3-ap-southeast-2.amazonaws.com/querystrings....

で他の成功した要求のターゲット。

私の質問は、なぜ最初の裁判が間違ってrequestUrlになるのですか?ところでS3バケットへの資格情報が自動的にec2サーバーのIAM roleからロードされ、バケットがからGETPUTを許可するように設定されている

const s3 = new AWS.S3({ params: { Bucket: "my-bucket", }, }); s3.getSignedUrl('putObject', { Key: s3Key, ContentType: newFile.type, ACL: 'private', })

:サーバーで署名したURLは次のように生成されますその役割。

答えて

1

私はこれが問題であることを確実に言うことはできませんが、特にIAMの役割に言及ドキュメントの注意点があります:

注:あなたがもし、静的または以前に解決された資格情報を持っていることを確認する必要がありますこのメソッドを(コールバックなしで)同期的に呼び出します。そうでなければ、要求に正しく署名しない可能性があります。これを保証できない場合(非同期認証プロバイダ、つまりEC2 IAMロールを使用している場合)、このメソッドを常に非同期コールバックで呼び出す必要があります。

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property

役割の資格を取得するために非同期試みはおそらく2回目の呼び出しでバックグラウンドに成功しただろうので、これはその後の実行中に自分自身を解決するという意味になるだろう。

+0

あなたは本当にありがとうございます! –

関連する問題