2017-10-22 10 views
0

私はちょうど呼び出されたときに私のS3バケットのための事前に署名されたURLを返す小さな関数を書いた。これは次のようになります。S3事前署名されたURLを生成する前にAWSで認証する必要はありません。

import AWS from 'aws-sdk'; 

AWS.config.update({ 
    accessKeyId: 'process.env.AWS_S3_KEY', 
    secretAccessKey: 'process.env.AWS_S3_SECRET' 
}); 

const s3 = new AWS.S3({ 
    signatureVersion: 'v4' 
}); 

export const s3Auth = (req, res) => { 
    s3.getSignedUrl(
    'putObject', 
    { 
     Bucket: 'mybucket', 
     Key: 'mykey', 
     Expires: 60 
    }, 
    (error, url) => { 
     if (!error && url) { 
     res.send({ 
      url 
     }); 
     } else { 
     res.status(500); 
     res.send({ error: 'AWS error!' }); 
     throw error; 
     } 
    } 
); 
}; 

3行目に、私のAWS認証情報が設定されています。事は、私はその部分( AWS.config.update)でコメントしてみましたが、それはまだ私のために事前に署名された鍵を生成しています!なぜこれが起こっているのか?

答えて

2

つまり、他の場所で定義されている別の資格情報セットがあることを意味します。おそらく:

  1. ご使用の環境にAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYが定義されています。
  2. ホームフォルダに.aws/credentialsの資格情報ストアがあります。
  3. LambdaまたはEC2にこのコードを実行しています。このコードには、必要な権限が付与された役割があります。

は、事前に署名したURLを生成する動作は、実際にAWSへの呼び出しを必要としないhttp://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/configuring-the-jssdk.html

+0

私は 'credentials'ファイルを持っていますが、それがなければ呼び出しは失敗します!ありがとう! – THpubs

3

であらゆる可能性をチェックしてください。 署名の詳細(バケツやオブジェクト名など)を秘密鍵と共に使用して要求するだけです。

URLは実際には署名がURLが有効である検証として機能して、オブジェクトへのアクセスを得るために使用されるIAMエンティティのアクセスキーが含まれます。

アクセスキーがあなたの前に署名URLに表示されている場合、それはどこからアクセスキーを持って - のいずれかの資格情報ファイル、環境変数またはサーバーに割り当てられたIAM役割で。

+0

情報ありがとうございます。あなたが正しい!それは私が指定したキーをURLに入れるだけです。無効なキーでも機能します。あなたはそれを使用しようとすると、 – THpubs

+0

@THpubs正確に...しかし、無効なキーで、署名したURL自体が無効であると判断されます。 –

関連する問題