programing

Nodejs AWS SDK S3 사전 서명된 URL 생성

stoneblock 2023. 8. 17. 20:34

Nodejs AWS SDK S3 사전 서명된 URL 생성

NodeJS AWS SDK를 사용하여 사전 서명된 S3 URL을 생성하고 있습니다.문서는 미리 서명된 URL을 생성하는 예를 제공합니다.

다음은 내 정확한 코드입니다(중요한 정보가 생략됨).

const AWS = require('aws-sdk')

const s3 = new AWS.S3()
AWS.config.update({accessKeyId: 'id-omitted', secretAccessKey: 'key-omitted'})

// Tried with and without this. Since s3 is not region-specific, I don't
// think it should be necessary.
// AWS.config.update({region: 'us-west-2'})

const myBucket = 'bucket-name'
const myKey = 'file-name.pdf'
const signedUrlExpireSeconds = 60 * 5

const url = s3.getSignedUrl('getObject', {
    Bucket: myBucket,
    Key: myKey,
    Expires: signedUrlExpireSeconds
})

console.log(url)

생성하는 URL은 다음과 같습니다.

https://bucket-name.s3-us-west-2.amazonaws.com/file-name.pdf?AWSAccessKeyId=[access-key-omitted]&Expires=1470666057&Signature=[signature-omitted]

해당 URL을 브라우저에 복사하고 다음과 같은 응답을 받습니다.

<Error>
  <Code>NoSuchBucket</Code>
  <Message>The specified bucket does not exist</Message>
  <BucketName>[bucket-name-omitted]</BucketName>
  <RequestId>D1A358D276305A5C</RequestId>
  <HostId>
    bz2OxmZcEM2173kXEDbKIZrlX508qSv+CVydHz3w6FFPFwC0CtaCa/TqDQYDmHQdI1oMlc07wWk=
  </HostId>
</Error>

나는 그 양동이가 존재한다는 것을 압니다.AWS 웹 GUI를 통해 이 항목으로 이동하고 두 번 클릭하면 URL로 개체가 열리고 제대로 작동합니다.

https://s3-us-west-2.amazonaws.com/[bucket-name-omitted]/[file-name-omitted].pdf?X-Amz-Date=20160808T141832Z&X-Amz-Expires=300&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Signature=[signature-omitted]&X-Amz-Credential=ASIAJKXDBR5CW3XXF5VQ/20160808/us-west-2/s3/aws4_request&X-Amz-SignedHeaders=Host&x-amz-security-token=[really-long-key]

그래서 저는 제가 SDK를 사용하는 방식에 뭔가 잘못된 것이 틀림없다고 믿게 되었습니다.

더스틴,

코드가 정확합니다. 다음을 다시 확인하십시오.

  1. 버킷 액세스 정책입니다.

  2. API 키를 통한 버킷 권한입니다.

  3. API 키 및 비밀입니다.

  4. 버킷 이름 및 키.

이 질문은 매우 인기가 있고 가장 인기 있는 답변은 코드가 정확하다는 것이지만 코드에 약간의 문제가 있어 답답할 수 있습니다.자, 여기 작동 코드가 있습니다.

    AWS.config.update({ 
        accessKeyId: ':)))',
        secretAccessKey: ':DDDD',
        region: 'ap-south-1',
        signatureVersion: 'v4'
    });

    const s3 = new AWS.S3()
    const myBucket = ':)))))'
    const myKey = ':DDDDDD'
    const signedUrlExpireSeconds = 60 * 5

    const url = s3.getSignedUrl('getObject', {
        Bucket: myBucket,
        Key: myKey,
        Expires: signedUrlExpireSeconds
    });

    console.log(url);

눈에 띄는 차이점은 구성 업데이트 후에 s3 개체가 생성된다는 것입니다. 이 개체가 없으면 구성이 효과적이지 않고 생성된 URL이 작동하지 않습니다.

다음은 S3의 모든 유형의 파일에 대해 사전 서명된(put-object) URL을 생성하기 위한 전체 코드입니다.

  • 원하는 경우 Expire 매개 변수를 사용하여 만료 시간을 매개 변수에 포함할 수 있습니다.
  • 아래 코드는 excel(xlsx, pdf, jpg)과 같은 모든 유형의 파일을 업로드합니다.

    const AWS = require('aws-sdk');
    const fs = require('fs');
    const axios = require('axios');
    const s3 = new AWS.S3();
    const filePath = 'C:/Users/XXXXXX/Downloads/invoice.pdf';
    
    
    var params = {
        Bucket: 'testing-presigned-url-dev',
        Key: 'dummy.pdf',
        "ContentType": "application/octet-stream"
    };
    
    
    s3.getSignedUrl('putObject', params, function (err, url) {
        console.log('The URL is', url);
    
        fs.writeFileSync("./url.txt", url);
    
    
        axios({
            method: "put",
            url,
            data: fs.readFileSync(filePath),
            headers: {
                "Content-Type": "application/octet-stream"
            }
        })
            .then((result) => {
                console.log('result', result);
    
            }).catch((err) => {
                console.log('err', err);
    
            });
    
    });

node.js를 사용하여 s3에서 개체를 가져와 임시 위치에 다운로드한 다음 타사 서비스에 첨부 파일로 제공하려는 사용 사례가 있었습니다!이렇게 암호를 풀었습니다.

  1. s3에서 서명된 URL 가져오기
  2. 객체를 가져오기 위해 대기 호출을 수행합니다.
  3. 그것을 현지에 써넣습니다.

누구에게나 도움이 될 수 있습니다; 동일한 사용 사례가 있는 경우; 아래 링크에서 확인하십시오; https://medium.com/ @pratekgawarle/from-aws-s3-using-pre-signed-url-and-it-to-local-system-879194bf4

저는 서명된 URL을 얻기 위해 사용했던 IAM 역할에 해당 버킷/개체에 대한 S3:GetObject 권한이 없었기 때문에 403을 받았습니다.IAM 역할에 이 권한을 추가한 후 서명된 URL이 올바르게 작동하기 시작했습니다.

아마도 당신이 찾고 있는 답은 아닐 것입니다. 하지만 그것은 우리의 AWS_ACCESS_KEY_를 바꾸었습니다.AWS_SECRET_ACCESS_KEY를 사용하는 ID

미래의 방문자들을 위해, 당신은 그것을 다시 확인하는 것이 좋을 것입니다.

의모답페서후핑를한이지과든후▁▁the의 모든 에.google,stackoverflow해결책을 찾았습니다.아래 솔루션은 다음과 같습니다.typescript그러나 노드 js에 대해서도 흐름이 동일합니다.

import * as AWS from 'aws-sdk';

const generatePresignedUrl: string = () => {

    const AWS_S3_PRESALE_BUCKET = process.env.AWS_S3_PRESALE_BUCKET;

    AWS.config.update({
        accessKeyId: process.env.ACCESS_KEY_ID,
        secretAccessKey: process.env.SECRET_ACCESS_KEY,
        region: 'us-west-2',
        signatureVersion: 'v4',
    });

    // if u wanna create a separate folder in s3 bucket, else u can skip this step.
    const folderType: string = 'folder';
    const Key: string = `${folderType}/filename.jpg`;

    const PARAMS = {
        Bucket: AWS_S3_PRESALE_BUCKET,
        Key,
        Expires: 60 * 10, // expires in 10 minutes
    };

    const s3 = new AWS.S3();
    const URL: string = await s3.getSignedUrlPromise('putObject', PARAMS);

    return URL;
};

이 기능을 꼭 사용해 보세요.

const AWS = require("aws-sdk");
const s3 = new AWS.S3({
  accessKeyId: 'AK--------------6U',
  secretAccessKey: 'kz---------------------------oGp',
  Bucket: 'bucket-name'
});

const getSingedUrl = async () => {    
  const params = {
    Bucket: 'bucket_name',
    Key: 'file-name.pdf',
    Expires: 60 * 5
  };

  try {
    const url = await new Promise((resolve, reject) => {
      s3.getSignedUrl('getObject', params, (err, url) => {
        err ? reject(err) : resolve(url);
      });
    });
    console.log(url)
  } catch (err) {
    if (err) {
      console.log(err)
    }
  }
}


getSingedUrl()

언급URL : https://stackoverflow.com/questions/38831829/nodejs-aws-sdk-s3-generate-presigned-url