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를 사용하는 방식에 뭔가 잘못된 것이 틀림없다고 믿게 되었습니다.
더스틴,
코드가 정확합니다. 다음을 다시 확인하십시오.
버킷 액세스 정책입니다.
API 키를 통한 버킷 권한입니다.
API 키 및 비밀입니다.
버킷 이름 및 키.
이 질문은 매우 인기가 있고 가장 인기 있는 답변은 코드가 정확하다는 것이지만 코드에 약간의 문제가 있어 답답할 수 있습니다.자, 여기 작동 코드가 있습니다.
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에서 개체를 가져와 임시 위치에 다운로드한 다음 타사 서비스에 첨부 파일로 제공하려는 사용 사례가 있었습니다!이렇게 암호를 풀었습니다.
- s3에서 서명된 URL 가져오기
- 객체를 가져오기 위해 대기 호출을 수행합니다.
- 그것을 현지에 써넣습니다.
누구에게나 도움이 될 수 있습니다; 동일한 사용 사례가 있는 경우; 아래 링크에서 확인하십시오; 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
'programing' 카테고리의 다른 글
텍스트가 많은 MySQL 테이블 (0) | 2023.08.17 |
---|---|
Spring Security OAuth2 앱에 사용자 지정 사용자 세부 정보 서비스 추가 (0) | 2023.08.17 |
Oracle에 연결할 로깅 핸들러를 생성하시겠습니까? (0) | 2023.08.17 |
Google Play Services Library 업데이트 및 누락 기호 @integer/google_play_services_version (0) | 2023.08.17 |
Flexbox가 가로 세로 비율을 유지하는 대신 이미지를 확장하는 이유는 무엇입니까? (0) | 2023.08.17 |